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

Генерация тегов из текстового содержимого

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

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

Спасибо

4b9b3361

Ответ 1

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

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

Чтобы идентифицировать 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)  

Ответ 2

Во-первых, ключевая библиотека 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 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())

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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