Как извлечь общие / значимые фразы из серии текстовых записей - PullRequest
61 голосов
/ 16 марта 2010

У меня есть серия текстовых элементов - сырой HTML из базы данных MySQL. Я хочу найти наиболее распространенные фразы в этих записях (не единственную наиболее распространенную фразу, и в идеале, не приводя в соответствие слово в слово).

Мой пример - любой обзор на Yelp.com, который показывает 3 фрагмента из сотен отзывов о данном ресторане в формате:

"Попробуйте гамбургер" (в 44 отзывах)

например, раздел "Обзор основных моментов" на этой странице:

http://www.yelp.com/biz/sushi-gen-los-angeles/

У меня установлен NLTK, и я немного поигрался с ним, но, честно говоря, перегружен опциями. Это кажется довольно распространенной проблемой, и я не смог найти прямого решения, выполнив поиск здесь.

Ответы [ 4 ]

86 голосов
/ 16 марта 2010

Я подозреваю, что вам нужны не только самые распространенные фразы, но и самые интересные словосочетания . В противном случае вы можете получить чрезмерную репрезентацию фраз, составленных из общих слов, и меньшее количество интересных и информативных фраз.

Для этого вам, по сути, нужно извлечь n-грамм из ваших данных, а затем найти те, которые имеют самую высокую точечную взаимную информацию (PMI). То есть вы хотите найти слова, которые встречаются вместе гораздо больше, чем вы ожидаете их случайно.

Инструкции по NLTK описывают, как это сделать, примерно в 7 строках кода, например ::

.
import nltk
from nltk.collocations import *
bigram_measures = nltk.collocations.BigramAssocMeasures()
trigram_measures = nltk.collocations.TrigramAssocMeasures()

# change this to read in your data
finder = BigramCollocationFinder.from_words(
    nltk.corpus.genesis.words('english-web.txt'))

# only bigrams that appear 3+ times
finder.apply_freq_filter(3)

# return the 10 n-grams with the highest PMI
finder.nbest(bigram_measures.pmi, 10)
4 голосов
/ 15 апреля 2010

Я думаю, что вы ищете chunking . Я рекомендовал прочитать главу 7 книги NLTK или, может быть, мою собственную статью о извлечении фрагментов . Оба из них предполагают знание тегов части речи, которые описаны в главе 5 .

3 голосов
/ 29 марта 2010

Если вы хотите получить больше 3 нграмм, вы можете попробовать это. Я предполагаю, что вы удалили весь мусор как HTML и т. Д.

import nltk
ngramlist=[]
raw=<yourtextfile here>

x=1
ngramlimit=6
tokens=nltk.word_tokenize(raw)

while x <= ngramlimit:
  ngramlist.extend(nltk.ngrams(tokens, x))
  x+=1

Вероятно, не очень питонично, поскольку я сам делал это месяц или около того, но мог бы помочь!

0 голосов
/ 16 марта 2010

Что ж, для начала вам, вероятно, придется удалить все теги HTML (найдите «<[^>] *>» и замените его на «»). После этого вы можете попробовать наивный подход поиска самых длинных общих подстрок между каждыми двумя текстовыми элементами, но я не думаю, что вы получите очень хорошие результаты. Вы могли бы добиться большего успеха, нормализуя слова (уменьшая их до базовой формы, удаляя все акценты, устанавливая все в нижний или верхний регистр) сначала и , а затем анализ. Опять же, в зависимости от того, чего вы хотите достичь, вы могли бы лучше кластеризовать текстовые элементы, если бы учитывали некоторую гибкость порядка слов, то есть обрабатывать текстовые элементы как пакеты нормализованных слов и измерять сходство содержимого пакетов.

Я прокомментировал похожую (хотя и не идентичную) тему здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...