2013-04-04 29 views
1

给定一个像这样的单词列表['add','adds','adding','added','addition'],我想干所有的单词'add'。这意味着将一个词的所有不同的动词和名词形式(但不是它的形容词和副词形式)合为一个。还有什么其他选择可以阻止?

我找不到任何这样做的stemmer。最近的一个,我发现是PorterStemmer,但它的茎上面的列表[“添加”,“添加”,“广告”,“广告”,“ADDIT”]

我不是很有经验的词干技术。所以,我想问一下,是否有任何可用的stemmer可以完成我上面解释的内容?如果没有,你有什么建议如何实现这一目标?

非常感谢,

+3

你要找的是一个'lemmatizer'而不是词干,也是一个相当强的一个,因为从'addition' =>'add',需要很多知识。我有一个英语形态词形解析器,适用于'verb' +'morpheme' =>'verbs'和'nouns' +'morpheme'成名词。一旦我完成其他工作,我可以在下周发布代码。你急需吗? – alvas 2013-04-05 06:24:49

+0

NLTK中的WordNet lemmatizer接近此,但它需要POS标签才能获得好的结果。尽管如此,它不会执行addition => add。 – 2013-04-05 09:14:17

+0

@ 2er0:那太棒了!非常感谢。下周对我来说会很好。+ 1 – chepukha 2013-04-05 17:00:16

回答

0

所产生的想法是,以减少不同形式的同一个词的一个单一的“基地”的形式。这不是你要求的,所以可能没有现有的干部工作者(至少不是有目的)满足你的需求。因此,针对您的问题的明显解决方案是:如果您有自己的自定义规则,则必须实施它们。

你不会多说你的要求。根据你的需要,你必须从头开始。如果porter stemmter接近您的需求,但在某些特殊情况下,您可以手动编写一些覆盖,并使用现有的stemmer来处理其他情况。

+2

谢谢,Achim。正如2ero在上面指出的那样,我正在寻找的任务是[lemmatisation](http://en.wikipedia.org/wiki/Lemmatisation)而不是词干。 – chepukha 2013-04-05 17:09:27

1

Lemmatization应导致更好的结果比词干(source):

词干通常指的是一种粗略的过程,正确地砍掉字的两端在实现这一目标的最希望的时间,并经常包括删除派生词缀。

词形还原通常是指适当地做事与使用的话词汇和形态分析的,通常旨在仅除去变化词尾并返回一个字,这被称为外稃的基部或字典形式。

词形还原在NTLK支持为nltk.stem包的一部分:

import nltk 

l = nltk.stem.WordNetLemmatizer() 
l.lemmatize('dogs')  # -> 'dog' 
l.lemmatize('addition') # -> 'addition' 

s = nltk.stem.snowball.EnglishStemmer() 
s.stem('dogs')   # -> 'dog' 
s.stem('addition')  # -> 'addit' 

如果lemmatizer不承认的话,也不会更改。一个缺陷是,默认情况下所有单词都被认为是名词。要覆盖这种行为,你必须设置pos的说法,这是默认设置为pos='n'

s.stem('better')    # -> 'better' 
l.lemmatize('better')   # -> 'better' 
l.lemmatize('better', pos='a') # -> 'good' 
相关问题