Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Для этого вам, по сути, нужно извлечь 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)

Ответ 2

если вы просто хотите получить более 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

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

Ответ 3

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

Ответ 4

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

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