2016-01-27 5 views
0

Используя ngram в Python, моя цель - найти глаголы и соответствующие им наречия из входного текста. Что я сделал:Как извлечь глаголы и все соответствующие наречия из текста?

Текст ввода: «Он говорит странно. Лошадь может бежать быстро. Там есть большое дерево. Солнце красивое. Место хорошо оформлено. Они странно говорят. Она бежит быстро. Она говорит greatly.Jack работает медленно «» код: -.

`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.

+0

Если вы ищете глаголы и наречия, почему ваш заголовок сообщения о ** предметах ** и ** объектах **? Пожалуйста, отредактируйте вопрос, чтобы вы могли получить разумные ответы. – alexis

ответ

1

У вас уже есть список всех глаголов-наречий bigrams, поэтому вы просто спрашиваете, как их объединить в словарь, который дает все наречия для каждого глагола. Но сначала давайте заново создать биграммы в более прямом пути:

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 обеспечивает пустой набор для глаголов, которые не видели раньше, поэтому нам не нужно проверять вручную.

В зависимости от деталей вашего назначения, вы также можете к случаю раз и lemmatize своих глаголов, так что наречия от «Вождения безрассудно» и «я осторожно поехал» записываются вместе:

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

Большое спасибо за помощь. Это мне очень помогло. –

+0

Вы знаете, как представить эти выходы в виде матрицы? Строка будет (глагол, adv1, adv2, adv3) следующим образом. –

+0

Просто напечатайте каждый 'ключ, значение' в словаре как' key, list (value) '(поскольку это значение является набором). – alexis

-1

Я думаю, что вы теряете информацию, необходимую для этого. Вам нужно каким-то образом сохранить данные о части речи, чтобы биграммы, такие как ('weirdly', 'talking'), могли обрабатываться корректно.

Возможно, что искатель bigram может принимать помеченные кортежи слов (я не знаком с nltk). Или, возможно, вам придется прибегать к созданию внешнего индекса. Если да, то, как это может работать:

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] 

Затем с глаголами впереди, вы можете превратить его в словарь или список-из-списков или что-то:

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) 
+0

Это неудача, если одно и то же слово встречается как глагол и существительное: «Не просто говорить разговор» – alexis

+0

Я думаю, что в этом коде есть что-то не так. 'finder2 = BigramCollocationFinder.from_words (wrd for (wrd, tag) в posTagged if tag in ('VB', 'VBN', 'RB', 'VBD')) best_bigrams = finder2.nbest (bigram_measures.raw_freq, 10) verb_first_bigrams = [Ь, если поз [Ь [1]] == 'RB' еще (б [1], B [0]) для Ь в best_bigrams] печати verb_first_bigrams adverbs_for = {} для глагол, наречие в verb_first_bigrams: если глагол не в adverbs_for: adverbs_for [глагол] = [наречие] еще: adverbs_for [глагол] .append (наречие) печать adverbs_for ' –

+0

Выхода этого кода приходит так: '{'talk': ['weirdly', 'украшен'], 'украшен': ['well'], 'run': ['well', 'weirdly']}' Это неверно. –