赞
踩
CountVectorizer和TfidVectorizer中的特征相对简单,具有广泛的实用性。不过在实际应用中,也存在很多应用这两种模型无法满足,比如某些人名的单复数形式、或者动词的各种形式,其表达的意义是类似的,不应该将其区分为不同特征,但是上述两种模型将其区分为不同特征,这样就增加了模型过拟合的情况,导致模型无法充分利用训练数据。
为了使得机器学习更具有操作性,我们引出了高级分词、词干提取和词形还原:
词干提取:这一方法涉及找出(或合并)所有具有相同的单词,如果我们使用基于规则的启发法来实现(如删除常见的后缀),该方法通常称为词干提取。
词形还原:如果使用的是一次单词的词形组成的字典(明确经过人工验证的系统)并且考虑了单词在句子中的作用,那么这个过程就成为词形还原。
标准化:单词的标准化形式成为词元。词干提取和词形还原都是标准化的形式之一。
为了更好的理解标准化,我们来对比一种词干提取方法(Porter词干提取器,一种广泛使用启发法结合,从nltk包导入)与spacy包中实现的词形还原:
import spacy #如果spacy模块没有安装的话需要自行安装,可以使用pip命令来安装,也可以使用其他方式
import nltk
#加载spacy的英语模型并将nltk的Porter词干提取器实例化
en_nlp = spacy.load('en')
stemmer = nltk.stem.PorterStemmer()
#定义一个函数来对比spacy中的词形还原与nltk中的词干提取
def compare_normalization(doc):
#在spacy中对文档进行分词
doc_spacy = en_nlp(doc)
#打印出spacy找到的词元
print("Lemmatization:")
print([token.lemma_ for token in doc_spacy])
#打印出Poter词干提取器找到的词例
print("Stemming:")
print([stemmer.stem(token.norm_.lower()) for token in doc_spacy])
compare_normalization(u"Our meeting today is so bad,", "it is even worse than yestoday.",
"i am scared of meeting the clients tommorrow.")
运行后其结果为:
词干提取总是局限于将单词简化为词干,因此was变成be,而词形还原得到正确的be。同样,词形还原将worse标准化为bad,词干提取得到的是wors。
另一个区别主要在于词干提取两处的meeting都简化为meet,利用词形还原,第一处被认为是名词,所以没有变化,第二处被认为是动词,所以变为meet。
一般来说,词形还原是一个比词干提取更加复杂的工程,但是用于机器学习的词例标准化时通常可以给出比词干提取更好的结果。
虽然scikit-learn没有实现这两种形式的标准化,但是CountVectorizer允许使用tokenizer参数指定使用自己的分词将每个文档转换为词例列表。我们可以使用spacy的词形还原创建一个可调用对象,它接受一个字符串并生成一个词元列表。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。