词干提取和词形还原 Python NLTK 示例
什么是词干提取和词形还原 Python NLTK?
词干和词形还原 in Python NLTK 是用于自然语言处理的文本规范化技术。这些技术广泛用于文本预处理。词干提取和词形还原之间的区别在于,词干提取速度更快,因为它在不知道上下文的情况下切词,而词形还原速度较慢,因为它在处理之前就知道单词的上下文。
什么是词干提取?
词干 是一种标准化词语的方法 自然语言处理。将句子中的一组单词转换为序列以缩短查找时间的技术。在这种方法中,具有相同含义但根据上下文或句子有一些变化的单词被规范化。
换句话说,一个词根只有一个,但同一个词有很多变体。例如,词根是“eat”,它的变体是“eats、eating、eated 和 like so”。同样,借助词干提取 Python,我们就能找到任意变体的词根。
举个例子
He was riding. He was taking the ride.
上述两句话的含义相同,即过去的骑行活动。人类很容易理解这两个含义相同。但对于机器来说,这两个句子是不同的。因此很难将其转换为相同的数据行。如果我们不提供相同的数据集,那么机器就无法预测。因此,有必要区分每个单词的含义,以准备用于机器学习的数据集。这里使用词干提取通过获取其词根来对同一类型的数据进行分类。
让我们用 Python program.NLTK 有一个名为“PorterStemmer”的算法。该算法接受标记词列表,并将其词干化为词根。
理解词干分析的程序
from nltk.stem import PorterStemmer e_words= ["wait", "waiting", "waited", "waits"] ps =PorterStemmer() for w in e_words: rootWord=ps.stem(w) print(rootWord)
输出:
wait wait wait wait
代码说明:
- NLTk 中有一个需要导入的 stem 模块。如果导入整个模块,程序会变得很重,因为它包含数千行代码。因此,在整个 stem 模块中,我们只导入了“PorterStemmer”。
- 我们准备了同一个单词的变体数据的虚拟列表。
- 创建了一个属于类 nltk.stem.porter.PorterStemmer 的对象。
- 进一步,我们用“for”循环将其逐一传递给PorterStemmer。最后,我们得到了列表中提到的每个单词的输出词根。
从上述解释中,还可以得出结论,词干提取被视为重要的预处理步骤,因为它消除了数据中的冗余和同一单词中的变化。因此,数据被过滤,这将有助于更好的机器训练。
现在我们传递一个完整的句子并检查其作为输出的行为。
程序:
from nltk.stem import PorterStemmer from nltk.tokenize import sent_tokenize, word_tokenize sentence="Hello Guru99, You have to build a very good site and I love visiting your site." words = word_tokenize(sentence) ps = PorterStemmer() for w in words: rootWord=ps.stem(w) print(rootWord)
输出:
hello guru99 , you have build a veri good site and I love visit your site
代码说明:
- 包 PorterStemer 从模块 stem 导入
- 导入了句子和单词标记包
- 写下一个句子,下一步将对其进行标记。
- 此步骤中实现词语标记化、词干提取和词形还原。
- 这里创建了一个 PorterStemmer 的对象。
- 循环运行,并使用在代码第 5 行中创建的对象对每个单词进行词干提取
总结
词干提取是一种数据预处理模块。英语中单个单词有很多变体。这些变体在机器学习训练和预测中造成了歧义。要创建成功的模型,必须过滤这些单词并使用词干提取将其转换为相同类型的序列数据。此外,这也是从一组句子中获取行数据并删除冗余数据(也称为规范化)的重要技术。
什么是词形还原?
合法化 NLTK 中的词形还原是根据单词的含义和上下文找到单词词根的算法过程。词形还原通常是指对单词的形态分析,旨在消除屈折结尾。它有助于返回单词的基本形式或词典形式(称为词根)。
NLTK 词形还原方法基于 WorldNet 的内置词形变换函数。文本预处理包括词干提取和词形还原。许多人觉得这两个术语令人困惑。有些人认为它们相同,但词干提取和词形还原之间存在差异。词形还原比前者更受欢迎,原因如下。
为什么词形还原比词干提取更好?
词干提取算法的工作原理是从单词中截取后缀。从广义上讲,就是截取单词的开头或结尾。
相反,词形还原是一种更强大的操作,它考虑了单词的形态分析。它返回词形,即所有屈折形式的基本形式。创建词典并寻找单词的正确形式需要深入的语言知识。词干提取是一种通用操作,而词形还原是一种智能操作,其中将在词典中查找正确的形式。因此,词形还原有助于形成更好的 机器学习 功能。
区分词形还原和词干提取的代码
词干代码:
import nltk from nltk.stem.porter import PorterStemmer porter_stemmer = PorterStemmer() text = "studies studying cries cry" tokenization = nltk.word_tokenize(text) for w in tokenization: print("Stemming for {} is {}".format(w,porter_stemmer.stem(w)))
输出::
Stemming for studies is studi Stemming for studying is studi Stemming for cries is cri Stemming for cry is cri
词形还原代码:
import nltk from nltk.stem import WordNetLemmatizer wordnet_lemmatizer = WordNetLemmatizer() text = "studies studying cries cry" tokenization = nltk.word_tokenize(text) for w in tokenization: print("Lemma for {} is {}".format(w, wordnet_lemmatizer.lemmatize(w)))
输出:
Lemma for studies is study Lemma for studying is studying Lemma for cries is cry Lemma for cry is cry
产出讨论
如果您查看 studies 和 studying 的词干提取,输出是相同的 (studi),但 NLTK 词形还原器为 studies 和 studying 这两个词提供了不同的词干。因此,当我们需要创建特征集来训练机器时,如果优先使用词形还原,那就太好了。
Lemmatizer 用例
Lemmatizer 可最大限度地减少文本歧义。示例词如 bicycle 或 bicycles 被转换为基本词 bicycle。基本上,它会将所有具有相同含义但不同表示形式的词转换为其基本形式。它降低了给定文本中的单词密度,并有助于为训练机器准备准确的特征。数据越干净,您的机器学习模型就越智能、越准确。NLTK Lemmatizer 还将节省内存和计算成本。
实时示例展示了 Wordnet 词形还原和 POS 标记的使用 Python
from nltk.corpus import wordnet as wn from nltk.stem.wordnet import WordNetLemmatizer from nltk import word_tokenize, pos_tag from collections import defaultdict tag_map = defaultdict(lambda : wn.NOUN) tag_map['J'] = wn.ADJ tag_map['V'] = wn.VERB tag_map['R'] = wn.ADV text = "guru99 is a totally new kind of learning experience." tokens = word_tokenize(text) lemma_function = WordNetLemmatizer() for token, tag in pos_tag(tokens): lemma = lemma_function.lemmatize(token, tag_map[tag[0]]) print(token, "=>", lemma)
代码说明
- 首先导入语料库阅读器wordnet。
- WordNetLemmatizer 是从 wordnet 导入的。
- 单词标记以及词性标记均从 nltk 导入。
- 默认词典是从集合中导入的。
- 创建字典时,pos_tag(首字母)是键值,其值与 wordnet 字典中的值进行映射。我们只取了首字母,因为我们稍后会在循环中使用它。
- 文本已书写并被标记。
- 创建对象 lemma_function,它将在循环内使用。
- 循环运行并且词形还原将采用两个参数,一个是标记,另一个是 pos_tag 与 wordnet 值的映射。
输出:
guru99 => guru99 is => be totally => totally new => new kind => kind of => of learning => learn experience => experience . => .
Python 词形还原与 wordnet 词典,因此研究这个课题至关重要,所以我们将其作为下一个课题。