词干提取与词形还原



什么是词干提取?

词干提取是一种通过去除词缀来提取单词基本形式的技术。就像把树的枝干砍掉到树干一样。例如,单词eating, eats, eaten的词干是eat

搜索引擎使用词干提取来索引单词。因此,搜索引擎可以只存储单词的所有形式的词干,而不是存储所有形式。这样,词干提取减少了索引的大小并提高了检索精度。

各种词干提取算法

在NLTK中,stemmerI,它具有stem()方法,接口包含了我们接下来要介绍的所有词干提取器。让我们用下面的图表来理解它

Stemming Algorithms

Porter词干提取算法

它是最常见的词干提取算法之一,主要用于去除和替换英语单词的常用后缀。

PorterStemmer类

NLTK具有PorterStemmer类,借助该类,我们可以轻松地为要提取词干的单词实现Porter词干提取算法。此类了解多种规则单词形式和后缀,借助这些形式和后缀,它可以将输入单词转换为最终词干。生成的词干通常是一个较短的单词,具有相同的根含义。让我们看一个例子:

首先,我们需要导入自然语言工具包(nltk)。

import nltk

现在,导入PorterStemmer类以实现Porter词干提取算法。

from nltk.stem import PorterStemmer

接下来,创建一个Porter Stemmer类的实例,如下所示:

word_stemmer = PorterStemmer()

现在,输入要提取词干的单词。

word_stemmer.stem('writing')

输出

'write'

word_stemmer.stem('eating')

输出

'eat'

完整的实现示例

import nltk
from nltk.stem import PorterStemmer
word_stemmer = PorterStemmer()
word_stemmer.stem('writing')

输出

'write'

Lancaster词干提取算法

它是在兰开斯特大学开发的,也是另一种非常常见的词干提取算法。

LancasterStemmer类

NLTK具有LancasterStemmer类,借助该类,我们可以轻松地为要提取词干的单词实现Lancaster词干提取算法。让我们看一个例子:

首先,我们需要导入自然语言工具包(nltk)。

import nltk

现在,导入LancasterStemmer类以实现Lancaster词干提取算法。

from nltk.stem import LancasterStemmer

接下来,创建一个LancasterStemmer类的实例,如下所示:

Lanc_stemmer = LancasterStemmer()

现在,输入要提取词干的单词。

Lanc_stemmer.stem('eats')

输出

'eat'

完整的实现示例

import nltk
from nltk.stem import LancatserStemmer
Lanc_stemmer = LancasterStemmer()
Lanc_stemmer.stem('eats')

输出

'eat'

正则表达式词干提取算法

借助此词干提取算法,我们可以构建自己的词干提取器。

RegexpStemmer类

NLTK具有RegexpStemmer类,借助该类,我们可以轻松地实现正则表达式词干提取算法。它基本上采用单个正则表达式,并删除与该表达式匹配的任何前缀或后缀。让我们看一个例子:

首先,我们需要导入自然语言工具包(nltk)。

import nltk

现在,导入RegexpStemmer类以实现正则表达式词干提取算法。

from nltk.stem import RegexpStemmer

接下来,创建一个RegexpStemmer类的实例,并提供要从单词中删除的后缀或前缀,如下所示:

Reg_stemmer = RegexpStemmer(‘ing’)

现在,输入要提取词干的单词。

Reg_stemmer.stem('eating')

输出

'eat'

Reg_stemmer.stem('ingeat')

输出

'eat'
Reg_stemmer.stem('eats')

输出

'eat'

完整的实现示例

import nltk
from nltk.stem import RegexpStemmer
Reg_stemmer = RegexpStemmer()
Reg_stemmer.stem('ingeat')

输出

'eat'

Snowball词干提取算法

这是另一种非常有用的词干提取算法。

SnowballStemmer类

NLTK具有SnowballStemmer类,借助该类,我们可以轻松地实现Snowball词干提取算法。它支持15种非英语语言。为了使用此词干提取类,我们需要使用所用语言的名称创建一个实例,然后调用stem()方法。让我们看一个例子:

首先,我们需要导入自然语言工具包(nltk)。

import nltk

现在,导入SnowballStemmer类以实现Snowball词干提取算法。

from nltk.stem import SnowballStemmer

让我们看看它支持的语言:

SnowballStemmer.languages

输出

(
   'arabic',
   'danish',
   'dutch',
   'english',
   'finnish',
   'french',
   'german',
   'hungarian',
   'italian',
   'norwegian',
   'porter',
   'portuguese',
   'romanian',
   'russian',
   'spanish',
   'swedish'
)

接下来,使用要使用的语言创建一个SnowballStemmer类的实例。这里,我们为“法语”创建词干提取器。

French_stemmer = SnowballStemmer(‘french’)

现在,调用stem()方法并输入要提取词干的单词。

French_stemmer.stem (‘Bonjoura’)

输出

'bonjour'

完整的实现示例

import nltk
from nltk.stem import SnowballStemmer
French_stemmer = SnowballStemmer(‘french’)
French_stemmer.stem (‘Bonjoura’)

输出

'bonjour'

什么是词形还原?

词形还原技术类似于词干提取。词形还原后得到的输出称为“词形”,它是根单词,而不是词干提取的输出。词形还原后,我们将得到一个具有相同含义的有效单词。

NLTK提供了WordNetLemmatizer类,它是wordnet语料库的简单包装器。此类使用morphy()函数到WordNet CorpusReader类以查找词形。让我们用一个例子来理解它:

示例

首先,我们需要导入自然语言工具包(nltk)。

import nltk

现在,导入WordNetLemmatizer类以实现词形还原技术。

from nltk.stem import WordNetLemmatizer

接下来,创建一个WordNetLemmatizer类的实例。

lemmatizer = WordNetLemmatizer()

现在,调用lemmatize()方法并输入要查找词形的单词。

lemmatizer.lemmatize('eating')

输出

'eating'
lemmatizer.lemmatize('books')

输出

'book'

完整的实现示例

import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize('books')

输出

'book'

词干提取与词形还原的区别

让我们借助以下示例了解词干提取和词形还原的区别:

import nltk
from nltk.stem import PorterStemmer
word_stemmer = PorterStemmer()
word_stemmer.stem('believes')

输出

believ

import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize(' believes ')

输出

believ

两个程序的输出说明了词干提取和词形还原之间的主要区别。PorterStemmer类从单词中截取“es”。另一方面,WordNetLemmatizer类查找一个有效的单词。简单来说,词干提取技术只关注单词的形式,而词形还原技术则关注单词的含义。这意味着应用词形还原后,我们始终会得到一个有效的单词。

广告