поколение тега от текстового содержания

Мне любопытно, если существует алгоритм/метод, существует для генерации ключевых слов/тегов из данного текста, при помощи некоторых расчетов веса, отношения возникновения или других инструментов.

Кроме того, я буду благодарен, если Вы укажете на какое-либо основанное на Python решение / библиотека для этого.

Спасибо

45
задан dmcer 18 April 2010 в 23:02
поделиться

4 ответа

Один из способов сделать это - извлечь слова, которые встречаются в документе чаще, чем вы могли бы ожидать. Например, скажем, в большом собрании документов термин «Марков» почти никогда не встречается. Однако в конкретном документе из той же коллекции Марков появляется очень часто. Это предполагает, что Марков может быть хорошим ключевым словом или тегом для связи с документом.

Чтобы идентифицировать подобные ключевые слова, вы можете использовать точечную взаимную информацию ключевого слова и документа. Это определяется как PMI (термин, док) = log [P (термин, док) / (P (термин) * P (док))] . Это примерно скажет вам, насколько меньше (или больше) вы удивитесь, встретив термин в конкретном документе, по мере того, как встретите его в более крупной коллекции.

Чтобы определить 5 лучших ключевых слов для связи с документом, вам нужно просто отсортировать термины по их баллу PMI с документом и выбрать 5 с наивысшим баллом.

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

Исходя из моего ответа на этот вопрос, в инструкциях по сопоставлениям NLTK рассказывается, как извлекать интересные многословные выражения с использованием n-граммов PMI примерно в 7 строках кода, например :

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

# 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 5 n-grams with the highest PMI
finder.nbest(bigram_measures.pmi, 5)  
57
ответ дан 26 November 2019 в 21:21
поделиться

Во-первых, ключевой библиотекой Python для вычислительной лингвистики является NLTK Набор средств естественного языка »). Это стабильная зрелая библиотека, созданная и поддерживаемая профессиональными компьютерными лингвистами. В нем также есть обширная коллекция руководств, часто задаваемых вопросов и т. Д. Я очень рекомендую его.

Ниже приведен простой шаблон в коде Python для проблемы, поднятой в вашем Вопросе; хотя это шаблон, который он запускает - предоставьте любой текст в виде строки (как я сделал), и он вернет список частотности слов, а также ранжированный список этих слов в порядке `` важности '' (или пригодности в качестве ключевых слов ) согласно очень простой эвристике.

Ключевые слова для данного документа (очевидно) выбираются из числа важных слов в документе, т. Е. Тех слов, которые могут отличить его от другого документа. Если у вас не было априорных знаний о предмете текста, общий метод состоит в том, чтобы сделать вывод о важности или весе данного слова / термина по его частоте, или важность = 1 / частота.

text = """ The intensity of the feeling makes up for the disproportion of the objects.  Things are equal to the imagination, which have the power of affecting the mind with an equal degree of terror, admiration, delight, or love.  When Lear calls upon the heavens to avenge his cause, "for they are old like him," there is nothing extravagant or impious in this sublime identification of his age with theirs; for there is no other image which could do justice to the agonising sense of his wrongs and his despair! """

BAD_CHARS = ".!?,\'\""

# transform text into a list words--removing punctuation and filtering small words
words = [ word.strip(BAD_CHARS) for word in text.strip().split() if len(word) > 4 ]

word_freq = {}

# generate a 'word histogram' for the text--ie, a list of the frequencies of each word
for word in words :
  word_freq[word] = word_freq.get(word, 0) + 1

# sort the word list by frequency 
# (just a DSU sort, there's a python built-in for this, but i can't remember it)
tx = [ (v, k) for (k, v) in word_freq.items()]
tx.sort(reverse=True)
word_freq_sorted = [ (k, v) for (v, k) in tx ]

# eg, what are the most common words in that text?
print(word_freq_sorted)
# returns: [('which', 4), ('other', 4), ('like', 4), ('what', 3), ('upon', 3)]
# obviously using a text larger than 50 or so words will give you more meaningful results

term_importance = lambda word : 1.0/word_freq[word]

# select document keywords from the words at/near the top of this list:
map(term_importance, word_freq.keys())
10
ответ дан 26 November 2019 в 21:21
поделиться

http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation пытается представить каждый документ в обучающем корпусе как смесь тем, которые, в свою очередь, представляют собой распределения, отображающие слова в вероятности.

Я однажды использовал его, чтобы разбить корпус обзоров продуктов на скрытые идеи, о которых говорилось во всех документах, таких как «обслуживание клиентов», «удобство использования продукта» и т. Д. Базовая модель не поддерживает способ преобразовать тематические модели в одно слово, описывающее суть темы ... но люди придумали для этого всевозможные эвристики, как только их модель обучена.

Я рекомендую вам попробовать поиграть с http://mallet.cs.umass.edu/ и посмотреть, подходит ли эта модель вашим потребностям.

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

4
ответ дан 26 November 2019 в 21:21
поделиться

Очень простым решением проблемы было бы :

  • подсчитать количество вхождений каждого слова в тексте
  • рассмотреть наиболее часто встречающиеся термины, поскольку ключевые фразы
  • имеют черный список «стоп-слов» для удаления общих слов, таких как, и, это etc

Я уверен, что есть более умные решения, основанные на статистике.

Если вам нужно решение для использования в более крупном проекте, а не ради интересов, Yahoo BOSS предлагает метод извлечения ключевых терминов.

0
ответ дан 26 November 2019 в 21:21
поделиться
Другие вопросы по тегам:

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