Как извлечь распространенный / значительные фразы от ряда вводов текста

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

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

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

например, раздел "Review Highlights" этой страницы:

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

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

63
задан ROMANIA_engineer 26 November 2017 в 10:40
поделиться

4 ответа

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

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

0
ответ дан 24 November 2019 в 16:25
поделиться

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

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

В NLTK collocations how-to описано, как это сделать примерно в 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)
88
ответ дан 24 November 2019 в 16:25
поделиться

, если вы просто хотите получить больше 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
ответ дан 24 November 2019 в 16:25
поделиться

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

4
ответ дан 24 November 2019 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: