генерация тегов из текстового контента - PullRequest
44 голосов
/ 18 апреля 2010

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

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

Спасибо

Ответы [ 4 ]

55 голосов
/ 19 апреля 2010

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

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

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

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

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

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)  
10 голосов
/ 18 апреля 2010

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

Ниже приведен простой шаблон в коде 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())
4 голосов
/ 19 апреля 2010

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

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

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

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

0 голосов
/ 18 апреля 2010

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

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

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

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

...