
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.