Python中最好的词干提取方法是什么?

PeY*_*TlL 30 python stemming nltk

我尝试了所有用于词干分析的nltk方法,但它给了我一些奇怪的结果.

例子

当它不应该这样做时,它通常会削减单词的结尾:

  • poodle => poodl
  • 文章清楚

或者不是很好:

  • 容易和容易的不是同一个词
  • 叶子,长大,相当不干

你知道python中的其他词干库,还是一本好词典?

谢谢

Spa*_*ost 109

你得到的结果(通常)是预期的英语词干分析器.你说你试过"所有nltk方法",但是当我尝试你的例子时,情况似乎并非如此.

以下是使用PorterStemmer的一些示例

import nltk
ps = nltk.stemmer.PorterStemmer()
ps.stem('grows')
'grow'
ps.stem('leaves')
'leav'
ps.stem('fairly')
'fairli'
Run Code Online (Sandbox Code Playgroud)

结果是'成长','leav'和'fairli',即使它们是你想要的,也是原始单词的词干版本.

如果我们切换到Snowball词干分析器,我们必须提供语言作为参数.

import nltk
sno = nltk.stem.SnowballStemmer('english')
sno.stem('grows')
'grow'
sno.stem('leaves')
'leav'
sno.stem('fairly')
'fair'
Run Code Online (Sandbox Code Playgroud)

结果与"成长"和"离开"一样,但"公平"被认为是"公平"

所以在这两种情况下(并且nltk中有两个以上的词干分析器),你说的话实际上并不是词.当提供'easy'或'easy'作为输入时,LancasterStemmer将返回'easy'.

也许你真的想要一个lemmatizer?这将使'article'和'poodle'保持不变.

import nltk
lemma = nltk..wordnet.WordNetLemmatizer()
lemma.lemmatize('article')
'article'
lemma.lemmatize('leaves')
'leaf'
Run Code Online (Sandbox Code Playgroud)

  • 这应该是选定的答案. (15认同)
  • 差异b/w lemmantizer和stemmer:/sf/ask/125097731/ (5认同)
  • 要添加的一件事:lemmatizer与POS标记器配对时可以产生更好的结果。它尝试匹配的默认POS是名词(尝试使用词“ ate”的词法识别器)。 (3认同)
  • 对于第一个例子,为什么叫“stemmer”?它对我不起作用,但“stem”却有用。 (2认同)

0xF*_*0xF 11

这里讨论的所有这些词干分析器都是算法词干分析器,因此它们总能产生意想不到的结果,例如

In [3]: from nltk.stem.porter import *

In [4]: stemmer = PorterStemmer()

In [5]: stemmer.stem('identified')
Out[5]: u'identifi'

In [6]: stemmer.stem('nonsensical')
Out[6]: u'nonsens'
Run Code Online (Sandbox Code Playgroud)

要正确获取根词,需要一个基于字典的词干提取器,如Hunspell Stemmer.Here是以下链接中的python实现.示例代码在这里

>>> import hunspell
>>> hobj = hunspell.HunSpell('/usr/share/myspell/en_US.dic', '/usr/share/myspell/en_US.aff')
>>> hobj.spell('spookie')
False
>>> hobj.suggest('spookie')
['spookier', 'spookiness', 'spooky', 'spook', 'spoonbill']
>>> hobj.spell('spooky')
True
>>> hobj.analyze('linked')
[' st:link fl:D']
>>> hobj.stem('linked')
['link']
Run Code Online (Sandbox Code Playgroud)


Dan*_*ler 6

Stemmers 的攻击性各不相同。Porter 是最具侵略性的英语词干分析器之一。我发现它通常伤害大于帮助。在较轻的方面,您可以使用已经建议的 lemmatizer,或者使用较轻的算法词干分析器。lemmatizers 的局限性在于它们无法处理未知单词。

我个人喜欢 Krovetz 词干分析器,它是一种混合解决方案,结合了字典词形还原器和轻量级词干分析器来处理词汇不足的单词。Krovetz 也kstemlight_stemmerElasticsearch 中的选项。pypi https://pypi.org/project/KrovetzStemmer/上有一个 python 实现,尽管这不是我使用过的。

另一种选择是spaCy. 对spaCy每个令牌进行处理后都有一个lemma_属性。(注意下划线lemma包含 的数字标识符lemma_) - https://spacy.io/api/token

以下是一些比较各种词干算法的论文:


Rit*_*eak 5

词干是关于删除后缀(通常只有后缀,据我尝试,没有一个 nltk 词干分析器可以删除前缀,忘记中缀)。所以我们可以清楚地将词干称为一个愚蠢的/不那么智能的程序。它不会检查一个词在词干之前或之后是否有意义。例如。如果你试图去掉“xqaing”,虽然不是一个词,它会删除“-ing”并给你“xqa”。

因此,为了使用更智能的系统,可以使用词形还原器。Lemmatizers 以 wordnet 和字典的形式使用格式良好的引理(单词)。所以它总是返回并使用适当的词。但是,它很慢,因为它会遍历所有单词以找到相关单词。


Ste*_*Lin -8

英语的 Porter、Porter2、Paice-Husk 和 Lovins 词干算法的 Python 实现可在Stemming 包中找到

  • 请注意,词干提取是纯 Python 实现,速度不如 PyStemmer,后者是 ac 库的包装器,也可在 PyPi 中使用。 (2认同)