Python nltk: поиск словосочетаний без слов, разделенных точками - PullRequest
5 голосов
/ 05 февраля 2012

Я пытаюсь найти словосочетания с NLTK в тексте, используя встроенный метод.

Теперь у меня следующий пример текста ( test и foo следуют друг за другом, но между ними есть граница предложения ):

content_part = """test. foo 0 test. foo 1 test. 
               foo 2 test. foo 3 test. foo 4 test. foo 5"""

Результат от токенизации и collocations() выглядит следующим образом:

print nltk.word_tokenize(content_part)
# ['test.', 'foo', 'my', 'test.', 'foo', '1', 'test.',
# 'foo', '2', 'test.', 'foo', '3', 'test.', 'foo', '4', 'test.', 'foo', '5']

print nltk.Text(nltk.word_tokenize(content_part)).collocations()
# test. foo

Как я могу предотвратить NLTK от:

  1. Включая точку в моем токенизации
  2. Не найти словосочетания () за границами предложений?

Так что в этом примере он вообще не должен печатать какое-либо словосочетание, но я думаю, вы можете представить более сложные тексты, в которых есть также словосочетания внутри предложений.

Я могу предположить, что мне нужно использовать сегментатор предложений Punkt , но тогда я не знаю, как собрать их снова, чтобы найти словосочетания с помощью nltk (collocation() кажется более могучим, чем просто сам считал вещи).

1 Ответ

8 голосов
/ 08 февраля 2012

Вы можете использовать WordPunctTokenizer, чтобы отделить знаки препинания от слов, а затем отфильтровать биграммы с пунктуацией с помощью apply_word_filter ().

То же самое можно использовать для триграмм, чтобы не находить словосочетания за границами предложений.

from nltk import bigrams
from nltk import collocations
from nltk import FreqDist
from nltk.collocations import *
from nltk import WordPunctTokenizer

content_part = """test. foo 0 test. foo 1 test. 
               foo 2 test. foo 3 test. foo 4 test, foo 4 test."""

tokens = WordPunctTokenizer().tokenize(content_part)

bigram_measures = collocations.BigramAssocMeasures()
word_fd = FreqDist(tokens)
bigram_fd = FreqDist(bigrams(tokens))
finder = BigramCollocationFinder(word_fd, bigram_fd)

finder.apply_word_filter(lambda w: w in ('.', ','))

scored = finder.score_ngrams(bigram_measures.raw_freq)

print tokens
print sorted(finder.nbest(bigram_measures.raw_freq,2),reverse=True)

Выход:

['test', '.', 'foo', '0', 'test', '.', 'foo', '1', 'test', '.', 'foo', '2', 'test', '.', 'foo', '3', 'test', '.', 'foo', '4', 'test', ',', 'foo', '4', 'test', '.']
[('4', 'test'), ('foo', '4')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...