2.文本规范化
再进一步开展分析或 NLP 之前,首先需要规范文本文档的语料库。为此,将再次使用规范化模块,此外还需要应用一些专门针对内容的新技术。
在分析了许多语料库后,经过精心挑选了一些新词,并将它们更新禁了停用词名单,如下代码展示:
stopword_list = nltk.corpus.stopwords.words( 'english' ) stopword_list = stopword_list + [ 'mr' , 'mrs' , 'come' , 'go' , 'get' , 'tell' , 'listen' , 'one' , 'two' , 'three' , 'four' , 'five' , 'six' , 'seven' , 'eight' , 'nine' , 'zero' , 'join' , 'find' , 'make' , 'say' , 'ask' , 'tell' , 'see' , 'try' , 'back' , 'also' ] |
可以看出新添加的单词大多数是通用的、没有多大意义的动词或名词。将它们更新进停用词列表对于文本聚类中的特征提取是十分有用的。还在规范化 pipeline 中添加了一个新函数,它使用正则表达式从文本主题中提取文本标识,如下所示:
import re def keep_text_characters(text): filtered_tokens = [] tokens = tokenize_text(text) for token in tokens: if re.search( '[a-zA-Z]' , token): filtered_tokens.append(token) filtered_text = ' ' .join(filtered_tokens) return filtered_text |
将新函数连同前面反复使用的函数(包括扩展缩写词,解码 HTML,词语切分,删除停用词及特殊字符,词性还原)一起添加到最终的规范化函数中,如下:
def normalize_corpus(corpus, lemmatize = True , only_text_chars = False , tokenize = False ): normalized_corpus = [] for text in corpus: text = html_parser.unescape(text) text = expand_contractions(text, CONTRACTION_MAP) if lemmatize: text = lemmatize_text(text) else : text = text.lower() text = remove_special_characters(text) text = remove_stopwords(text) if only_text_chars: text = keep_text_characters(text) if tokenize: text = tokenize_text(text) normalized_corpus.append(text) else : normalized_corpus.append(text) return normalized_corpus |
可以看出上述函数非常类似前面讲过的函数,只是添加了 keep_text_charachters() 函数来保留文本字符,该函数通过将 only_text_chars 参数设置为 True 来执行。