Pergunta

Eu preciso levar um parágrafo de texto e extrair dele uma lista de "tags". A maioria deles é bastante simples. No entanto, eu preciso de alguma ajuda agora conter a lista de palavras resultante para duplicatas a evitar. Exemplo: Comunidade / Comunidades

Eu usei uma implementação do algoritmo de Porter Stemmer (estou escrevendo em PHP pelo caminho):

http://tartarus.org/~martin/PorterStemmer/php.txt

Isso funciona, até certo ponto, mas não retorna palavras "reais". O exemplo acima é deveu-se "commun".

Eu tentei "Snowball" (sugerido em outro segmento de estouro de pilha).

http://snowball.tartarus.org/demo.php

Para o meu exemplo (Comunidade / comunidades), Snowball hastes para "communiti".

Pergunta

Existem outros algoritmos resultantes que vai fazer isso? Tem mais alguém resolveu esse problema?

Meu pensamento atual é que eu poderia usar um algoritmo decorrentes de duplicatas evitar e, em seguida, escolher o menor palavra que eu encontro para ser a palavra real para mostrar.

Foi útil?

Solução

A questão central aqui é que os algoritmos decorrentes operar em uma base fonética puramente baseado em regras de ortografia do idioma com nenhuma compreensão real da língua que está trabalhando. Para produzir palavras reais, você provavelmente vai ter que mesclar a saída do stemmer com algum tipo de função de pesquisa para converter as hastes de volta para palavras reais. Eu posso ver, basicamente, duas maneiras possíveis para fazer isso:

  1. Localizar ou criar um grande dicionário que mapeia cada possível volta da haste para uma palavra real. (Por exemplo, communiti -> comunidade)
  2. Crie uma função que compara cada haste para uma lista das palavras que foram reduzidos para que tronco e as tentativas para determinar o que é mais similar. (Por exemplo, comparando "communiti" contra "comunidade" e "comunidades" de tal maneira a que "comunidade" será reconhecido como a opção mais similar)

Pessoalmente, acho que a maneira que eu faria seria uma forma dinâmica de # 1, a criação de um banco de dados de dicionário personalizado gravando cada palavra examinada juntamente com o que originou a e, em seguida, assumindo que a palavra mais comum é aquele que deve ser usado. (Por exemplo, se o meu corpo de usos texto de origem "comunidades" mais frequentemente do que "comunidade", então mapear communiti -.> Comunidades) Uma abordagem baseada em dicionário será mais preciso em geral e construí-la com base na entrada stemmer irá fornecer resultados personalizado aos seus textos, com a principal desvantagem sendo o espaço necessário, o que geralmente não é um problema nos dias de hoje.

Outras dicas

Se bem entendi, então o que você precisa não é um stemmer mas um lemmatizer. Lemmatizer é uma ferramenta com o conhecimento sobre terminações como ies , ed , etc., e wordforms excepcionais, como escrita , mapas etc. Lemmatizer o wordform entrada para o seu lema, que é garantido para ser uma palavra "real".

Existem muitas lemmatizers para Inglês, eu só usei morpha embora. Morpha é apenas um grande lex-arquivo que você pode compilar em um arquivo executável. Exemplo de uso:

$ cat test.txt 
Community
Communities
$ cat test.txt | ./morpha -uc
Community
Community

Você pode obter morpha de http: // www .informatics.sussex.ac.uk / investigação / grupos / PNL / Carroll / morph.html

Ei, eu não sei se isso é talvez demasiado tarde, mas há apenas um PHP decorrentes script que produz palavras reais: http: // phpmorphy .sourceforge.net / - ele me levou idades para encontrá-lo. Todas as outras derivações tem que ser compilado e mesmo depois que eles só trabalho de acordo com Porter algoritmo, que produz caules, não lemas (ou seja, comunidade = communiti). PhpMorphy um funciona perfeitamente bem, é fácil de instalar e inicializar, e tem Inglês, russo, alemão, ucraniano e estónio dicionários. Ele também vem com um script que você pode usar para compilar outros dicionários. A documentação está em russo, mas colocá-lo através do Google traduzir e deve ser fácil.

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