使用Python进行词干提取

使用Python进行词干提取

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

词干提取简介

词干提取是自然语言处理中的重要步骤。词干提取是生成词根/基本词的形态学变化的过程。词干提取程序通常被称为词干算法或词干提取器。词干算法将诸如“retrieves”,“retrieved”,“retrieval”之类的词缩减到根词“retrieve”,将“Choco”,“Chocolatey”,“Chocolates”缩减为词干“chocolate”。提供给词干提取器的是分词后的单词。那这些分词后的单词是从哪里来的呢?分词包括将文档拆分为独立的单词。要了解有关分词的更多信息,可以参考“Python中的分词教程”。

现在让我们了解一下词干提取中的错误。

了解词干提取中的错误

词干提取中的错误主要分为两类:

  1. 过度词干提取: 当两个词来自不同词干的同一个词根时,就会出现此错误。过度词干提取也可以被视为误报。
  2. 欠词干提取: 当两个词来自相同词根的非不同词干时,就会出现此错误。欠词干提取也可以被视为漏报。

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

了解词干提取的应用

词干提取的一些应用如下:

  1. 我们可以将词干提取作为信息检索系统中的搜索引擎。
  2. 我们还可以使用词干提取来确定领域分析中的领域词汇。
  3. 有趣的是,谷歌在2003年采纳了词干提取。以前搜索“fish”不会返回“fishes”或“fishing”。

了解词干提取算法

一些词干提取算法如下:

  1. Porter’s词干提取算法
  2. Lovins词干提取算法
  3. Dawson词干提取算法
  4. Krovetz词干提取算法
  5. Xerox词干提取算法
  6. N-Gram词干提取算法
  7. Snowball词干提取算法
  8. Lancaster词干提取算法

现在让我们简要讨论这些词干提取算法。

Porter’s词干提取算法

Porter’s词干提取算法是1980年提出的著名词干提取方法之一。它的概念是基于英语中的后缀由较小和较简单的后缀组合而成。这个词干提取器以其速度和简单性而受到青睐。Porter词干提取器的主要应用包括数据挖掘和数据恢复。然而,这些应用仅限于英文单词。此外,一组词干映射到相同的词干,并且输出词干不一定是具有意义的单词。这些算法非常冗长,被认为是最古老的词干提取器。

假设EED -> EE意味着“如果单词至少有一个元音和以EED结尾的辅音字母,将结尾改为EE”,例如’agreed’变为’agree’。

优点: 与其他词干提取器相比,它产生的输出最好,错误率较低。

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

Lovins词干提取器

Lovins在1968年提出了这种方法,它会删除单词的最长后缀,然后将该单词记录下来,以将此词干转化为有效的单词。

例如sitting -> sitt -> sit

优点: Lovins词干提取器速度快,能处理不规则复数形式。例如’teeth’和’tooth’等。

限制: 此过程耗时,并且经常无法从词干形成单词。

Dawson词干提取器

Dawson词干提取器是Lovins词干提取器的扩展,其中后缀按其长度和最后一个字母建立索引,按反序累积。

优点: Dawson词干提取器执行速度快,涵盖更多后缀。

限制: 实现非常复杂。

Krovetz词干提取器

Krovetz词干提取器是由Robert Krovetz在1993年提出的。该词干提取算法遵循以下一些步骤:

  1. 将单词的复数形式转化为单数形式。
  2. 将单词的过去时态转化为现在时态,并删除后缀’ing’。

例如,’children’ -> ‘child’

优点: Krovetz词干提取器轻便,可以作为其他词干提取器的预处理器使用。

限制: 对于大型文件,此词干提取算法效率低下。

Xerox词干提取器

Xerox词干提取器能够处理大数据并生成有效的单词,但是过度提取的情况较高,因为它对词典的依赖使其特定于语言。因此,该词干提取算法的主要限制在于它是特定于语言的。

例如:

children -> child

understood -> understand

whom -> who

best -> good

N-Gram词干提取器

N-Gram是从单词中提取出的n个连续字符的集合,具有相似的单词通常会具有高比例的n-gram。

例如,’INTRODUCTIONS’对于n = 2变为:I, IN, NT, TR, RO, OD, DU, UC, CT, TI, IO, ON, NS, S

优点: 此词干提取算法基于字符串比较,具体取决于语言。

限制: 创建和索引n-gram需要空间,不太高效。

雪球词干提取器

与波特词干提取器不同,雪球词干提取器也可以映射非英语单词。由于这个词干提取算法支持多种语言,我们可以称雪球词干提取器为多语言词干提取器。雪球词干提取器也是从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类的对象。然后我们创建了一个需要进行词干提取的词列表。最后,我们使用for循环遍历列表中的单词,并使用stem()函数对它们进行词干提取。

可以看到,在上面的示例中,我们没有使用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() 函数对句子进行标记化。最后,我们使用 for 循环迭代遍历单词列表,并使用 stem() 函数将它们进行词干化处理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程