Pergunta

Estou curioso para saber se existe um algoritmo/método para gerar palavras -chave/tags a partir de um determinado texto, usando alguns cálculos de peso, relação ocorrência ou outras ferramentas.

Além disso, ficarei agradecido se você apontar qualquer solução / biblioteca baseada em Python para isso.

Obrigado

Foi útil?

Solução

Uma maneira de fazer isso seria extrair palavras que ocorrem com mais frequência em um documento do que você esperaria que elas por acaso. Por exemplo, digamos em uma coleção maior de documentos, o termo 'Markov' quase nunca é visto. No entanto, em um documento específico da mesma coleção, Markov aparece com muita frequência. Isso sugere que Markov pode ser uma boa palavra -chave ou tag para se associar ao documento.

Para identificar palavras -chave como essa, você pode usar o Informações mútuas em ponto da palavra -chave e o documento. Isso é dado por PMI(term, doc) = log [ P(term, doc) / (P(term)*P(doc)) ]. Isso dirá aproximadamente o quanto menos (ou mais) você deve encontrar o termo no documento específico como Apose a encontrá -lo na coleção maior.

Para identificar as 5 melhores palavras -chave para se associar a um documento, você apenas classificaria os termos pela pontuação do PMI com o documento e escolheria o 5 com a pontuação mais alta.

Se você quiser extrair Tags de várias palavras, veja a questão do Stackoverflow Como extrair frases comuns / significativas de uma série de entradas de texto.

Emprestando da minha resposta a essa pergunta, o Colocações nltk como fazer Abrange como fazer extrair expressões interessantes de várias palavras usando n-gramas PMI em cerca de 7 linhas de código, por exemplo:

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)  

Outras dicas

Primeiro, a principal biblioteca Python para a lingüística computacional é Nltk ("Kit de ferramentas de linguagem natural"). Esta é uma biblioteca estável e madura criada e mantida por linguistas computacionais profissionais. Ele também tem um extenso coleção de tutoriais, perguntas frequentes, etc. Eu recomendo muito.

Abaixo está um modelo simples, no código Python, para o problema levantado em sua pergunta; Embora seja um modelo que ele execute-abasteça qualquer texto como uma string (como eu fiz) e ele retornará uma lista de frequências de palavras, bem como uma lista classificada dessas palavras em ordem de 'importância' (ou adequação como palavras-chave ) de acordo com uma heurística muito simples.

As palavras-chave para um determinado documento são (obviamente) escolhidas dentre as palavras importantes em um documento-as palavras que provavelmente o distinguem de outro documento. Se você não tivesse um priori Conhecimento do assunto do texto, uma técnica comum é inferir a importância ou peso de uma determinada palavra/termo a partir de sua frequência ou importância = 1/frequência.

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())

http://en.wikipedia.org/wiki/latent_dirichlet_allocation tenta representar cada documento em um corpus de treinamento como mistura de tópicos, que por sua vez são distribuições de mapeamento de palavras para probabilidades.

Eu o usei uma vez para dissecar um corpus de revisões de produtos nas idéias latentes que estavam sendo faladas em todos os documentos como 'atendimento ao cliente', 'usabilidade do produto', etc. O modelo básico não defende uma maneira de converter Os modelos de tópicos em uma única palavra que descrevem sobre o que é um tópico. Mas as pessoas criaram todos os tipos de heurísticas para fazer isso quando o modelo é treinado.

Eu recomendo que você tente brincar com http://mallet.cs.umass.edu/ e ver se esse modelo se adapta às suas necessidades ..

O LDA é um algoritmo completamente não supervisionado, o que significa que não exige que você anote nada que seja ótimo, mas do lado do flip, pode não entregar os tópicos que você esperava que ele desse.

Uma solução muito simples para o problema seria:

  • conte as ocorrências de cada palavra no texto
  • Considere os termos mais frequentes como as frases -chave
  • Tenha uma lista preta de 'Stop Words' para remover palavras comuns como a, e, é etc.

Tenho certeza de que existem soluções mais inteligentes, baseadas em estatísticas.

Se você precisar de uma solução para usar em um projeto maior, e não para os interesses, o Yahoo Boss possui um método de extração de termo -chave.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top