词干提取和词形还原 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)

Lemmatizer 用例

代码说明

  • 首先导入语料库阅读器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 词典,因此研究这个课题至关重要,所以我们将其作为下一个课题。