从动词列表中检索动词

Jaw*_*ria 2 python regex string nlp list

我有一个字符串列表,都是动词.我需要得到每个动词的单词频率,但我想把动词如"想要","想要","想要"和"想要"作为一个动词.形式上,"动词"被定义为一组4个单词,其形式为{X,Xs,Xed,Xing}或形式为{Xe,Xes,Xed,Xing}.我如何从列表中提取动词,以便得到"X"并计算词干出现的次数?我想我可以以某种方式使用正则表达式,但我是一个正则表达式n00b,我完全迷失了

Roc*_*key 7

有一个名为nltk的库,它有一个用于文本处理的疯狂数组函数.其中一个功能子集stemmers就是你想要的(使用由具有该领域丰富经验的人开发的算法/代码).以下是使用Porter Stemming算法的结果:

In [3]: import nltk

In [4]: verbs = ["want", "wants", "wanting", "wanted"]

In [5]: for verb in verbs:
   ...:     print nltk.stem.porter.PorterStemmer().stem_word(verb)
   ...:     
want
want
want
want
Run Code Online (Sandbox Code Playgroud)

你可以结合使用它defaultdict来做这样的事情(注意:在Python 2.7+中,a Counter同样有用/更好):

In [2]: from collections import defaultdict

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

In [4]: verbs = ["want", "wants", "wanting", "wanted", "running", "runs", "run"]

In [5]: freq = defaultdict(int)

In [6]: for verb in verbs:
   ...:     freq[PorterStemmer().stem_word(verb)] += 1
   ...:     

In [7]: freq
Out[7]: defaultdict(<type 'int'>, {'run': 3, 'want': 4})
Run Code Online (Sandbox Code Playgroud)

有一点需要注意:词干分析器并不完美 - 例如,添加ran到上面会产生这样的结果:

defaultdict(<type 'int'>, {'ran': 1, 'run': 3, 'want': 4})
Run Code Online (Sandbox Code Playgroud)

但希望它会让你接近你想要的.