使用Python进行词干提取
在下面的教程中,我们将了解使用Python编程语言中的NLTK(自然语言工具包)包进行词干提取的过程。
词干提取简介
词干提取是自然语言处理中的重要步骤。词干提取是生成词根/基本词的形态学变化的过程。词干提取程序通常被称为词干算法或词干提取器。词干算法将诸如“retrieves”,“retrieved”,“retrieval”之类的词缩减到根词“retrieve”,将“Choco”,“Chocolatey”,“Chocolates”缩减为词干“chocolate”。提供给词干提取器的是分词后的单词。那这些分词后的单词是从哪里来的呢?分词包括将文档拆分为独立的单词。要了解有关分词的更多信息,可以参考“Python中的分词教程”。
现在让我们了解一下词干提取中的错误。
了解词干提取中的错误
词干提取中的错误主要分为两类:
- 过度词干提取: 当两个词来自不同词干的同一个词根时,就会出现此错误。过度词干提取也可以被视为误报。
- 欠词干提取: 当两个词来自相同词根的非不同词干时,就会出现此错误。欠词干提取也可以被视为漏报。
现在让我们看一下词干提取的一些应用。
了解词干提取的应用
词干提取的一些应用如下:
- 我们可以将词干提取作为信息检索系统中的搜索引擎。
- 我们还可以使用词干提取来确定领域分析中的领域词汇。
- 有趣的是,谷歌在2003年采纳了词干提取。以前搜索“fish”不会返回“fishes”或“fishing”。
了解词干提取算法
一些词干提取算法如下:
- Porter’s词干提取算法
- Lovins词干提取算法
- Dawson词干提取算法
- Krovetz词干提取算法
- Xerox词干提取算法
- N-Gram词干提取算法
- Snowball词干提取算法
- 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年提出的。该词干提取算法遵循以下一些步骤:
- 将单词的复数形式转化为单数形式。
- 将单词的过去时态转化为现在时态,并删除后缀’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() 函数将它们进行词干化处理。