机器学习利用NTLK作词文本预处理(一)

1. 文本挖掘

文本挖掘是数据挖掘中非常重要的一个环节。现在很多的数据是以文本的形式储存在数据库里。文本可以流露出很多重要的信息。我们可以通过文本挖掘,了解比如一个YouTube的特别的视频里的所有评论里的有价值信息。所谓的数据挖掘,在我看来,就是一个把Raw Data转变成Valuable Information的过程。而在当今时代下,大量的文本信息就是raw data,而我们要做的就是把他们转变成有价值的信息。

2. 文本处理

文本处理通常有几个关键的部分,脏数据的处理,html格式的去除,特殊符号的删除。要记住,所有的有干扰我们结果的文本都是需要被剔除的。本文讲以NTLK这个库为例,来教如何做词文本的预处理。

NLTK是用于构建Python程序以使用人类语言数据的领先平台。它为50多种语料库和词汇资源(如WordNet)提供了易于使用的界面,以及用于分类,标记化,词干分析,标记,解析和语义推理的文本处理库套件,用于工业级NLP库的包装器。

3. 主要流程

  1. 清洗文本(去除换行,数字,价值符号,超链接,html标签,缩写,多余的空格,标点符号)
  2. 分割单词
  3. 获取词性并词性还原,例如(blogs👉blog)
  4. 去除停用词(stop words)

4. 代码示例

# -*- coding: utf-8 -*-
"""
Created on Tue Jan  7 23:00:10 2020

@author:  jlblog.tech
"""

import re
import string
from nltk.corpus import wordnet
from nltk import word_tokenize, pos_tag
from nltk.stem.wordnet import WordNetLemmatizer
from nltk.corpus import stopwords
#停词表

stop_words = stopwords.words('english')
comments=['##https://jlblog.tech/ is the best website. No.1!!!!!!+.+ <html>',
          'Damn, OMG, it is so beautiful website $$$ like heaven....Jesus!! 1/8/2010 1:12:08',
          'DR.CRew like this website so much!!! fantastic! He said: you are writting amazing blogs right there. You have changed the world']

def text_clean(text):
    #去换行
    text=text.replace('\n','')
    #去数字
    text=re.sub(r"\d+\.?\d*","",text)
    #改小写
    text=text.lower()
    # 去掉一些价值符号
    text= re.sub(r'\$\w*', '', text) 
    # 去掉超链接
    text = re.sub(r'https?:\/\/.*\/\w*', '', text)
    #去掉html标签
    text = re.sub(r'</?\w+[^>]*>','',text)
    # 去掉一些专门名词缩写,简单来说就是字母比较少的词
    text= re.sub(r'\b\w{1,2}\b', '', text) 
    # 去掉多余的空格
    text = re.sub(r'\s\s+', ' ', text).lstrip(' ')   
    #去掉标点符号
    text = re.sub(r'[{}]+'.format(string.punctuation),' ',text)
    
    return text

def get_wordnet_pos(tag):
    """
    获取单词的词性
    """
    if tag.startswith('J'):
        return wordnet.ADJ
    elif tag.startswith('V'):
        return wordnet.VERB
    elif tag.startswith('N'):
        return wordnet.NOUN
    elif tag.startswith('R'):
        return wordnet.ADV
    else:
        return None
    
def filter_words(tokens, stop_words):
    """
    filter the word by nltk stopwords and length
    """
    return [w for w in tokens if w not in stop_words and len(w) > 3]
    
def ntlkLemmatizer(commentList):
    '''
    Letmatizer
    '''

    result=[]
    for comment in commentList:
        tokens=word_tokenize(comment)
        tags=pos_tag(tokens)
        wnl = WordNetLemmatizer()
        for tag in tags:
            wordnet_pos = get_wordnet_pos(tag[1]) or wordnet.NOUN
            result.append(wnl.lemmatize(tag[0], pos=wordnet_pos)) # 词形还原
    result=filter_words(result,stop_words)
    return result

PreProcessingCommentList=[]
for comment in comments:
    print('清洗文本前的评论:\n'+comment)
    comment=text_clean(comment)
    print('清洗文本后的评论:\n '+comment)
    PreProcessingCommentList.append(comment)


WordList=[]
WordList.append( ntlkLemmatizer(PreProcessingCommentList))
print('---------词形还原后的单词列表👇----------')
for word in WordList:
    print(word)

5. 运行结果

ml-textClean.png

6. 程序依赖

在这里做我们处理的时候我们需要用到如下几个库:

  • re (正则表达式来做文本清洗)
  • ntlk.corpus.wordnet (获取词性)
  • ntlk.word_tokenize (词性标记)
  • ntlk.pos_tag (词性标签)
  • ntlk.corpus.stopwords (获取停词表)

7. 小结

  • 在清洗文本的时候要用空格做占位符,防止字符粘连
  • 在清洗文本的时候要在最后去掉所有的多余空格