Pergunta

Sem obter um grau na recuperação de informação, eu gostaria de saber se existe qualquer algoritmos para contar a freqüência com que as palavras ocorrem em um determinado corpo de texto. O objetivo é obter uma "sensação geral" de que as pessoas estão dizendo sobre um conjunto de comentários textuais. Ao longo das linhas de Wordle .

O que eu gostaria:

  • ignorar artigos, pronomes, etc. ( 'a', 'um', 'a', 'ele', 'eles' etc)
  • preservar nomes próprios
  • ignorar hifenização, exceto para tipo macio

Tentando alcançar as estrelas, estes seriam peachy:

  • manipulação decorrente & plurais (por exemplo, como, gostos, gostava, jogo gostando o mesmo resultado)
  • Agrupamento de adjetivos (advérbios, etc) com seus sujeitos ( "grande serviço" em oposição a "grande", "serviço")

Eu tenho tentado algumas coisas básicas usando Wordnet mas estou apenas ajustes coisas cegamente e esperando que ele funciona para os meus dados específicos. Algo mais genérica seria ótimo.

Foi útil?

Solução

Você não precisa de um, mas vários algoritmos agradáveis, ao longo das linhas a seguir.

  • ignorando pronomes é feito através de um stoplist .
  • preservando nomes próprios? Quer dizer, a detecção de entidades nomeadas, como Hoover Dam e dizendo que "é uma palavra" ou substantivos compostos, como programação idioma ? Vou te dar uma dica: essa é uma difícil, mas existem bibliotecas para ambos. Procure NER (reconhecimento entitiy Nomeado) e chunking lexical. OpenNLP é um Java-Toolkit que faz as duas coisas.
  • ignorando hifenização? Quer dizer, como em quebras de linha? Use expressões regulares e verificar a palavra resultante via dicionário de pesquisa.
  • manipulação plurais / decorrente: você pode olhar para o Snowball stemmer . Ele faz isso muito bem.
  • "agrupamento" adjetivos com seus substantivos é geralmente uma tarefa de rasa analisar . Mas se você estiver procurando especificamente para adjetivos qualitativos (bom, mau, merda, incrível ...) rel você pode estar interessado em sentimento análise . LingPipe faz isso, e muito mais.

Eu sinto muito, eu sei que você disse que queria KISS, mas, infelizmente, suas exigências não que são fáceis de cumprir. No entanto, existem ferramentas para tudo isso, e você deve ser capaz de simplesmente amarrá-los juntos e não ter de executar qualquer tarefa a si mesmo, se você não quiser. Se você deseja realizar uma tarefa sozinho, eu sugiro que você olhe decorrentes, é o mais fácil de todos.

Se você vai com Java, combinar Lucene com o OpenNLP toolkit. Você vai obter resultados muito bons, como Lucene já tem um stemmer embutido e um monte de tutorial. O kit de ferramentas OpenNLP por outro lado, está mal documentada, mas você não vai precisar muito fora dele. Você também pode estar interessado em NLTK , escrito em Python.

Eu diria que você soltar o seu último requisito, uma vez que envolve análise superficial e definitivamente não vai impove seus resultados.

Ah, btw. o termo exato desse documento prazo-frequency-coisa que você estava procurando é chamado tf-idf . É muito bonito a melhor maneira de olhar para a freqüência de documento para termos. A fim de fazê-lo corretamente, você não vai ficar em torno de usar matrizes vetor multidimenional.

... Sim, eu sei. Depois de tomar um seminário sobre IR, meu respeito por Google foi ainda maior. Depois de fazer algumas coisas no IR, o meu respeito por eles caiu tão rápido, no entanto.

Outras dicas

Bem-vindo ao mundo da PNL ^ _ ^

Tudo que você precisa é de um pouco de conhecimento básico e algumas ferramentas.

Já existem ferramentas que lhe dirá se uma palavra em uma frase é um substantivo, adjetivo ou verbo. Eles são chamados pichadores partes-do-discurso . Normalmente, eles tomam texto simples Inglês como entrada e saída da palavra, a sua forma de base, ea part-of-speech. Aqui é a saída de um tagger populares UNIX part-of-speech na primeira frase do seu post:

$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english 
# Word  POS     surface form
Without IN  without
getting VVG get
a   DT  a
degree  NN  degree
in  IN  in
information NN  information
retrieval   NN  retrieval
,   ,   ,
I   PP  I
'd  MD  will
like    VV  like
to  TO  to
know    VV  know
if  IN  if
there   EX  there
exists  VVZ exist
any DT  any
algorithms  NNS algorithm
for IN  for
counting    VVG count
the DT  the
frequency   NN  frequency
that    IN/that that
words   NNS word
occur   VVP occur
in  IN  in
a   DT  a
given   VVN give
body    NN  body
of  IN  of
text    NN  text
.   SENT    .

Como você pode ver, identificou "algoritmos" como sendo a forma plural (NNS) de "algoritmo" e "existe" como sendo uma conjugação (VBZ) de "existir". Ele também identificou "a" e "o" como "determinantes (DT)" - outra palavra para o artigo. Como você pode ver, o tagger POS também tokenized a pontuação.

Para fazer tudo, mas o último ponto em sua lista, você só precisa executar o texto através de um tagger POS, filtrar as categorias que você não (determinantes, pronomes, etc.) Juros e contar as frequências do formas básicas das palavras.

Aqui estão algumas pichadores POS populares:

TreeTagger (binário apenas: Linux, Solaris, OS- X)
GENIA Tagger (C ++: compilar seu self)
Stanford POS Tagger (Java)

Para fazer a última coisa em sua lista, você precisa mais do que apenas informações de nível de palavra. Uma maneira fácil de começar é por contagem seqüências de palavras , em vez de palavras em si apenas. Estes são chamados n-gramas . Um bom lugar para começar é UNIX para Poets . Se você está disposto a investir em um livro sobre PNL, eu recomendaria de Estatística Natural Language Processing .

Aqui está um exemplo de como você pode fazer isso em Python, os conceitos são semelhantes em qualquer idioma.

>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
      if item not in skip:
        try:
          results[item] += 1
        except KeyError:
          results[item] = 1

>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...

A primeira linha só fica bibliotecas que ajuda com partes do problema, como na segunda linha, onde urllib2 baixa uma cópia de Ambrose Bierce do "Dicionário do Diabo" As próximas linhas fazer uma lista de todas as palavras do texto, sem pontuação. Em seguida, você cria uma tabela hash, que neste caso é como uma lista de palavras únicos associados com um número. O laço for passa sobre cada palavra no livro Bierce, se já existe um registro dessa palavra na tabela, cada nova ocorrência adiciona um ao valor associado a essa palavra na tabela; se a palavra ainda não apareceu, ele é adicionado à tabela, com um valor de 1 (ou seja, uma ocorrência.) Para os casos que você está falando, você gostaria de pagar muito mais atenção aos detalhes, por exemplo, usando capitalização para ajudar a identificar nomes próprios apenas no meio de frases, etc., isso é muito difícil, mas expressa o conceito.

Para entrar as partes decorrentes e outras coisas pluralização, experiência, em seguida olhar para o trabalho do 3o partido, tenho desfrutado do NLTK, que é um projeto open source acadêmica, também em python.

Eu escrevi um programa completo para fazer exatamente isso um tempo atrás. Posso fazer upload de uma demonstração mais tarde, quando eu chegar em casa.

Aqui está um código (asp.net/c#): h ttp: //naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

A primeira parte da sua pergunta não soa tão ruim. Tudo o que você basicamente precisa fazer é ler cada palavra do arquivo (ou fluxo w / e) e coloque-o em uma árvore prefixo e cada vez que acontecer em cima de uma palavra que já existe você incrementa o valor associado a ele. Claro que você teria uma lista de tudo ignorar você gostaria deixado de fora de seus cálculos também.

Se você usar uma árvore de prefixo que garantir que para encontrar qualquer palavra vai para O (N), onde N é o comprimento máximo de uma palavra em seu conjunto de dados. A vantagem de uma árvore de prefixo nesta situação é que se você quer olhar para plurais e decorrentes você pode verificar em O (M + 1) se isso é mesmo possível para a palavra, onde M é o comprimento da palavra, sem caule ou pluralidade (é que uma palavra? hehe). Uma vez que você construiu sua árvore de prefixo eu reanalisar-lo para as hastes e tal e condensá-lo para baixo para que a raiz da palavra é o que mantém os resultados.

No procura você poderia ter algumas regras simples em lugar de ter o positivo jogo de volta em caso da raiz ou tronco ou o que você tem.

A segunda parte parece extremamente desafiador. Minha inclinação ingênua seria segurar resultados separados para agrupamentos adjetivo-sujeitos. Use os mesmos princípios que acima, mas apenas mantê-la separada.

Outra opção para a análise semântica pode ser modelar cada frase como uma árvore de sujeito, verbo, etc relações (sentença tem um sujeito e verbo, sujeito tem um substantivo e adjetivo, etc). Uma vez que você tenha quebrado todo o texto se, desta forma, parece que pode ser bastante fácil de executar através de e obter uma contagem rápida dos diferentes pares apropriados que ocorreram.

Apenas algumas divagações, eu estou certo de que há melhores idéias, mas eu amo pensar sobre essas coisas.

O algoritmo que você descreveu ele. Um programa que faz isso fora da caixa com um botão grande dizendo "Fazê-lo" ... Eu não sei.

Mas deixe-me ser construtivo. Eu recomendo que você este livro Programação Inteligência Coletiva . Capítulos 3 e 4 contêm exemplos muito pragmáticas (realmente, há teorias complexas, apenas exemplos).

U pode usar o dicionário worldnet ao obter as informações básicas da palavra-chave pergunta como seu passado de expressão, extrato sinônimo, u também pode pode fazer o mesmo para o seu documento para criar o índice para ele. então você pode facilmente corresponder a palavra-chave com o arquivo de indexar e classificar o documento. em seguida, summerize-lo.

Tudo o que você listou é bem tratado por spacy .

  1. Ignorar algumas palavras - palavras uso de parada
  2. Extract assunto - uso parte do discurso marcação para identificá-lo (funciona fora da caixa). Depois de uma sentença é analisado, encontrar "ROOT" - o verbo principal da sentença. Por navegar a árvore de análise você vai encontrar um substantivo que se refere a este verbo. Será o assunto.
  3. Ignorar hifenização - suas alças de tokenizer hífens na maioria dos casos. Ele pode ser facilmente estendido para lidar com casos mais especiais.

Se a lista de tópicos é pré-determinado e não é enorme, você pode até ir mais longe: construir um modelo de classificação que irá prever o tópico. Vamos dizer que você tem 10 temas. Você coleciona frases ou textos de amostra. Você carregá-los em um outro produto: prodígio . Usando É ótimo interface que assuntos rapidamente atribuir às amostras. E, finalmente, usando as amostras categorizados você treinar o modelo spacy para prever o assunto dos textos ou frases.

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