如何从文本中提取动词和所有相应的副词?

时间:2016-01-27 06:10:28

标签: python nltk n-gram

在Python中使用ngram我的目的是从输入文本中找出动词及其相应的副词。 我做了什么:

输入文字:""他说话很奇怪。一匹马可以跑得快。那里有一棵大树。太阳很美。这个地方装修得很好。他们很奇怪。她跑得很快。她说话很大。杰克跑得很慢。"" 代码: -

`finder2 = BigramCollocationFinder.from_words(wrd for (wrd,tags) in posTagged if tags in('VBG','RB','VBN',))
scored = finder2.score_ngrams(bigram_measures.raw_freq)
print sorted(finder2.nbest(bigram_measures.raw_freq, 5))`

从我的代码中,我得到了输出:  [('talking', 'greatly'), ('talking', 'weirdly'), ('weirdly', 'talking'),('runs','fast'),('runs','slow')] 这是动词及其相应副词的列表。

我在寻找什么:

我想从中找出动词和所有相应的副词。例如('talking'- 'greatly','weirdly),('runs'-'fast','slow')etc.

2 个答案:

答案 0 :(得分:1)

您已经拥有所有动词副词双字母组合的列表,因此您只是询问如何将它们合并到一个字典中,该字典为每个动词提供所有副词。但首先让我们以更直接的方式重新创建你的双子星球:

pairs = list()
for (w1, tag1), (w2, tag2) in nltk.bigrams(posTagged):
    if t1.startswith("VB") and t2 == "RB":
        pairs.append((w1, w2))

现在提出您的问题:我们将使用每个动词后面的副词构建一个字典。我将副词存储在一个集合中,而不是列表中,以消除重复。

from collections import defaultdict
consolidated = defaultdict(set)
for verb, adverb in pairs:
    consolidated[verb].add(adverb)

defaultdict为之前未曾见过的动词提供了一个空集,因此我们不需要手动检查。

根据作业的详细信息,你可能还需要对你的动词进行大小写和词形翻译,以便来自"驾驶鲁莽"和#34;我小心翼翼地开车#34;记录在一起:

wnl = nltk.stem.WordNetLemmatizer()
...
for verb, adverb in pairs:
    verb = wnl.lemmatize(verb.lower(), "v")
    consolidated[verb].add(adverb)

答案 1 :(得分:-1)

我认为你正在丢失你需要的信息。您需要以某种方式保留词性数据,以便能够以正确的方式处理像part_of_speech = {word:tag for word,tag in posTagged} best_bigrams = finger2.nbest(... as you like it ...) verb_first_bigrams = [b if part_of_speech[b[1]] == 'RB' else (b[1],b[0]) for b in best_bigrams] 这样的双字母组合。

可能是bigram finder可以接受标记的单词元组(我不熟悉nltk)。或者,您可能不得不求助于创建外部索引。如果是这样,这样的事情可能有用:

adverbs_for = {}
for verb,adverb in verb_first_bigrams:
    if verb not in adverbs_for:
        adverbs_for[verb] = [adverb]
    else:
        adverbs_for[verb].append(adverb)

然后,使用前面的动词,您可以将其转换为字典或列表列表或其他:

var start = "2115 First Avenue SE Unit 1306, Cottage Grove Place, Cedar Rapids, IA, 52402";     //Set the source/ origin
var end = "6126 Rockwell Dr. Apt 128, Keystone Place, Cedar Rapids, IA, 52402";