86
4
减轻稀疏性。除了对词条进行简单过滤
(
去掉标点符号和停用词
)
之外,还有
两种主要的文本规范化方法:词干提取和词形还原。
词干提取用一系列规则
(
或模型
)
将字符串分割为较小的子串。其目的是删除
那些修改意义的词缀
(
尤其是后缀
)
。例如,去掉
's'
'es'
,它们在拉丁语
中通常表示复数。词形还原用字典查找每个词条,并返回字典中对应的规范
head
”词,也叫词元
(lemma)
。词形还原根据基本事实查找词条,可以处理
不规则词,也可以处理不同词性的词条。例如,动词
gardening
会被还原成
to
garden
”,而名词“
garden
”和“
gardener
”是不同的词元。词干提取将把所
有这些词条归并到一个“
garden
”词条下。
词干提取和词形还原各有其优、缺点。因为只需要拼接词串,所以词干提取
更快。另外,词形还原需要查字典或数据库,并使用词性标记来识别单词的
根词元,这使它明显比词干提取要慢,但也更有效。
为了以系统方式执行文本规范化,我们将编写一个自定义转换器来将这
些部分组合在一起。我们的
TextNormalizer
类接受一种语言作为输入参
,该语言参数用于从
NLTK
语料库加载正确的停用词。我们还可以自定
TextNormalizer
,在词干化和词形还原间进行选择,并将该语言参数传
SnowballStemmer
。为了过滤无关词条,我们创建了两个方法。一个是
is_
punct()
用来检查词条中的每个字符是否具有以
P
开头的
Unicode
类别
(
点符号
)
;一个是
is_stopword()
,用来确定词条是否在停用词集合中。
import unicodedata
from sklearn.base import BaseEstimator, TransformerMixin
class TextNormalizer(BaseEstimator, TransformerMixin):
def __init__(self, language='english'):
self.stopwords = set(nltk.corpus.stopwords.words(language))
self.lemmatizer = WordNetLemmatizer()
def is_punct(self, token):
return all(
unicodedata.category(char).startswith('P') for char in token
)
def is_stopword(self, token):
return token.lower() in self.stopwords
文本向量化和转换流水线
87
接下来我们添加
normalize()
方法,该方法接受由段落列表组成的单个文档,
其中段落是句子列表,而句子又是
(
词条,标签
)
元组的列表,也是第
3
章中
我们将原始
HTML
进行预处理得到的数据格式。
def normalize(self, document):
return [
self.lemmatize(token, tag).lower()
for paragraph in document
for sentence in paragraph
for (token, tag) in sentence
if not self.is_punct(token) and not self.is_stopword(token)
]
该方法应用过滤函数去除不需要的词条,然后对它们进行词形还原
lemmatize()
方法首先将标签
nltk.pos_tag
函数中默认的
Penn Treebank
词性
标记,转换成
WordNet
标签,默认情况下选择名词。
def lemmatize(self, token, pos_tag):
tag = {
'N': wn.NOUN,
'V': wn.VERB,
'R': wn.ADV,
'J': wn.ADJ
}.get(pos_tag[0], wn.NOUN)
return self.lemmatizer.lemmatize(token, tag)
最后,我们还要添加
Transformer
接口,这样我们才能将这个类添加到
Scikit-Learn
流水线中,我们将在下一节中进行讨论
:
def fit(self, X, y=None):
return self
def transform(self, documents):
for document in documents:
yield self.normalize(document)
请注意,文本规范化只是一种方法,而且大量使用
NLTK
,这可能会给应用
程序增加不必要的开销。其他选项可能包括删除出现在特定计数阈值以上或
以下的词条、或删除停用词,只选择第
5~10000
个最常用单词。另一种方法
是简单地计算累积频率,只选择包含累积频率分布在
10%~50%
的词。用这些
方法,我们可以忽略非常低频的罕用词
(
只出现一次的词
)
和最常见的词,让
我们能识别语料库中最有潜力的预测用词。

Get 基于Python的智能文本分析 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.