您的位置:

使用 Python 的词干提取

在下面的教程中,我们将了解使用 Python 编程语言中的 NLTK(自然语言工具包)包来词干的过程。

词干学导论

词干是自然语言处理流水线过程的重要组成部分。词干是生成词根/基本词的形态修改的过程。词干程序通常被认为是词干算法或词干分析器。词干算法将“检索”、“检索”、“检索”等词简化为词根词,将“检索”和“虫火谷”、“巧克力”、“巧克力”等词简化为词干“巧克力”。词干分析器的输入是分词的单词。但是这些符号化的单词从何而来呢?分词包括将文档分解成不同的单词。要了解更多关于分词的知识,可以参考关于“Python 中的分词”的教程。

现在让我们理解词干中的错误。

理解词干中的错误

词干错误主要分为两类:

  1. 过词干:当两个词来源于不同词干的同一个词根时,就会出现这个错误。过度堵塞也可以被视为误报。
  2. 词干不足:当两个单词来自同一个词根而不是不同的词干时,会出现此错误。词干不足也可以被认为是假阴性。

现在让我们看看词干的一些应用。

理解词干的应用

词干的一些应用如下:

  1. 我们可以在信息恢复系统中使用词干作为搜索引擎。
  2. 我们也可以使用词干来确定领域分析中的领域词汇。
  3. 一个有趣的事实是,谷歌搜索在 2003 年采用了词干。以前搜索“鱼”不会返回“鱼”或“捕鱼”。

理解词干算法

一些词干算法如下:

  1. 波特的斯特梅尔算法
  2. 爱之声
  3. 道森准下士同意
  4. krovetz stemmer 先生
  5. 施乐之声
  6. N-Gram Voices
  7. 雪球斯特梅尔
  8. 兰开斯特 投票

现在让我们简单讨论一下这些词干算法。

波特的斯特梅尔算法

波特的斯特梅尔算法是 1980 年提出的著名词干方法之一。这个概念是基于这样一个原则,即英语中的后缀是由更小更简单的后缀组合而成的。这种词干分析器因其速度快和简单而受欢迎。波特·斯特梅尔的主要应用包括数据挖掘和数据恢复。然而,这些应用仅限于英语单词。而且,词干组映射到同一个词干上,输出的词干不一定是有意义的词。这些算法相当长,被称为最古老的词干分析器。

假设 EED -> EE 的意思是“如果这个单词至少有一个元音和辅音加上 EED 结尾,把结尾改成 EE”,因为‘同意’变成了‘同意’。

优势:与其他词干分析器相比,它产生的输出最好,错误率更低。

限制:产生的形态修饰并不总是真实的单词。

爱之声

它是由 Lovins 在 1968 年提出的,从一个单词中删除最长的后缀,然后记录这个单词,以便将这个词干转换成有效的单词。

例如,坐着->坐着->坐着

优势:洛文斯斯特梅尔速度快,管理不规则复数。比如‘牙’和‘牙’等。

限制:这个过程很耗时,经常无法从词干中形成单词。

道森准下士同意

它是 Lovins 词干分析器的一个扩展,其中后缀按照长度和最后一个字母的反向顺序进行索引。

优势:道森斯特梅尔的处决速度快,覆盖面更足。

限制:实现非常复杂。

krovetz stemmer 先生

罗伯特·克罗威茨于 1993 年提出了克罗威茨·斯特梅尔。该词干算法遵循如下所示的一些步骤:

  1. 将单词的复数形式转换为单数形式。
  2. 把一个单词的过去时转换成现在时,去掉后缀“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() 函数来标记句子。最后,我们使用循环的来遍历单词列表,并使用词干()函数来词干。