在下面的教程中,我们将了解使用 Python 编程语言中的 NLTK(自然语言工具包)包来词干的过程。
词干学导论
词干是自然语言处理流水线过程的重要组成部分。词干是生成词根/基本词的形态修改的过程。词干程序通常被认为是词干算法或词干分析器。词干算法将“检索”、“检索”、“检索”等词简化为词根词,将“检索”和“虫火谷”、“巧克力”、“巧克力”等词简化为词干“巧克力”。词干分析器的输入是分词的单词。但是这些符号化的单词从何而来呢?分词包括将文档分解成不同的单词。要了解更多关于分词的知识,可以参考关于“Python 中的分词”的教程。
现在让我们理解词干中的错误。
理解词干中的错误
词干错误主要分为两类:
- 过词干:当两个词来源于不同词干的同一个词根时,就会出现这个错误。过度堵塞也可以被视为误报。
- 词干不足:当两个单词来自同一个词根而不是不同的词干时,会出现此错误。词干不足也可以被认为是假阴性。
现在让我们看看词干的一些应用。
理解词干的应用
词干的一些应用如下:
- 我们可以在信息恢复系统中使用词干作为搜索引擎。
- 我们也可以使用词干来确定领域分析中的领域词汇。
- 一个有趣的事实是,谷歌搜索在 2003 年采用了词干。以前搜索“鱼”不会返回“鱼”或“捕鱼”。
理解词干算法
一些词干算法如下:
- 波特的斯特梅尔算法
- 爱之声
- 道森准下士同意
- krovetz stemmer 先生
- 施乐之声
- N-Gram Voices
- 雪球斯特梅尔
- 兰开斯特 投票
现在让我们简单讨论一下这些词干算法。
波特的斯特梅尔算法
波特的斯特梅尔算法是 1980 年提出的著名词干方法之一。这个概念是基于这样一个原则,即英语中的后缀是由更小更简单的后缀组合而成的。这种词干分析器因其速度快和简单而受欢迎。波特·斯特梅尔的主要应用包括数据挖掘和数据恢复。然而,这些应用仅限于英语单词。而且,词干组映射到同一个词干上,输出的词干不一定是有意义的词。这些算法相当长,被称为最古老的词干分析器。
假设 EED -> EE 的意思是“如果这个单词至少有一个元音和辅音加上 EED 结尾,把结尾改成 EE”,因为‘同意’变成了‘同意’。
优势:与其他词干分析器相比,它产生的输出最好,错误率更低。
限制:产生的形态修饰并不总是真实的单词。
爱之声
它是由 Lovins 在 1968 年提出的,从一个单词中删除最长的后缀,然后记录这个单词,以便将这个词干转换成有效的单词。
例如,坐着->坐着->坐着
优势:洛文斯斯特梅尔速度快,管理不规则复数。比如‘牙’和‘牙’等。
限制:这个过程很耗时,经常无法从词干中形成单词。
道森准下士同意
它是 Lovins 词干分析器的一个扩展,其中后缀按照长度和最后一个字母的反向顺序进行索引。
优势:道森斯特梅尔的处决速度快,覆盖面更足。
限制:实现非常复杂。
krovetz stemmer 先生
罗伯特·克罗威茨于 1993 年提出了克罗威茨·斯特梅尔。该词干算法遵循如下所示的一些步骤:
- 将单词的复数形式转换为单数形式。
- 把一个单词的过去时转换成现在时,去掉后缀“ing”。
例如,“儿童”->“儿童”
优势: Krovetz 斯特梅尔比较轻,我们可以把它作为其他词干器的前置词干器。
限制:这种词干算法在大文档的情况下效率很低。
施乐之声
施乐斯特梅尔能够管理大数据,并能生成有效的单词。然而,过度词干是很高的,因为它对词汇的依赖使它依赖于语言。因此,这种词干算法的主要限制是它是特定于语言的。
例如:
孩子->孩子
理解->理解
谁->谁
最佳->好
N-Gram Voices
N-Gram 是从一个单词中提取的n
个连续字符的集合,其中相似的单词通常具有高比例的 N-Gram。
例如,n = 2 的“INTRODUCTIONS”变为:I、IN、NT、TR、RO、OD、DU、UC、CT、TI、IO、ON、NS、S
优势:该词干算法基于字符串比较,并且依赖于语言。
限制:创建和索引 n 克需要空间,时间效率不高。
雪球斯特梅尔
与波特·斯特梅尔不同,雪球斯特梅尔也能映射非英语单词。由于这个词干算法支持多种语言,我们可以称雪球斯特梅尔为多语言词干。雪球茎干器也是从 NLTK 包中导入的。这种算法基于一种被称为“雪球”的编程语言,该语言处理小字符串,是斯特梅尔使用最广泛的语言。这个词干算法比波特斯特梅尔更激进,也被认为是波特 2 斯特梅尔。由于与波特斯特梅尔相比有所改进,雪球茎干分析器的计算速度非常快。
兰开斯特 投票
与其他两种算法相比,兰开斯特词干分析器更具攻击性和动态性。该词干算法速度快;然而,它在处理小词时令人困惑。然而,没有像雪球茎干一样高效。兰卡斯特词干分析器从外部保存规则,并从根本上利用迭代算法。
现在,让我们看看使用 Python 编程语言中的 NLTK 包来实现词干。
Python 中词干的实现
让我们考虑下面的例子,用 Python 中的 NLTK 包演示词干的实现。
示例:
# importing the required modules
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
# creating an object of the PorterStemmer class
pStemmer = PorterStemmer()
# selecting some words to be stemmed
list_of_words = ["consult", "consultant", "consulting", "consultantative", "consultants", "consulting"]
for words in list_of_words:
print(words + ": " + pStemmer.stem(words))
输出:
consult: consult
consultant: consult
consulting: consult
consultantative: consult
consultants: consult
consulting: consult
说明:
在上面的代码片段中,我们已经导入了所需的模块。然后我们创建了一个 NLTK 包的 PorterStemmer 类的对象。然后,我们创建了一个需要词干的单词列表。最后,我们使用循环的来遍历列表中的单词,并使用词干()函数对它们进行词干处理。
我们可以观察到,在上面的例子中,我们没有使用 word_tokenize() 函数。让我们考虑另一个使用 word_tokenize() 函数演示词干的例子。
示例:
# importing the required modules
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
# creating an object of the PorterStemmer class
pStemmer = PorterStemmer()
# given sentence
sentence = "People comes to consultants office to consult the consultant"
# tokenizing the sentence
list_of_words = word_tokenize(sentence)
for words in list_of_words:
print(words, " : ", pStemmer.stem(words))
输出:
People : peopl
comes : come
to : to
consultants : consult
office : offic
to : to
consult : consult
the : the
consultant : consult
说明:
在上面的代码片段中,我们已经导入了所需的模块,并创建了一个 PorterStemmer 类的对象。然后,我们定义了一个必须进行词干处理的字符串。然后,我们使用了 word_tokenize() 函数来标记句子。最后,我们使用循环的来遍历单词列表,并使用词干()函数来词干。