Eu tentei PorterStemmer e Snowball, mas ambos não funcionam em todas as palavras, perdendo algumas muito comuns.
Minhas palavras de teste são: " gatos administrando comunidades de cactos cactos cactos ", e ambas acertam menos da metade.
Veja também:
nlp
stemming
lemmatization
Manixrock
fonte
fonte
Respostas:
Se você conhece Python, o The Natural Language Toolkit (NLTK) tem um lematizador muito poderoso que usa WordNet .
Observe que se você estiver usando este lematizador pela primeira vez, você deve baixar o corpus antes de usá-lo. Isso pode ser feito por:
Você só tem que fazer isso uma vez. Supondo que você já tenha baixado o corpus, funciona assim:
Existem outros lematizadores no módulo nltk.stem , mas não os tentei sozinho.
fonte
dies
, ele lhe dará aody
invés dedie
. Não existe algum tipo de dicionário de lematizador codificado?WordNetLemmatizer
erroneamente lematizam?Eu uso Stanford nlp para fazer lematização. Tenho enfrentado um problema semelhante nos últimos dias. Tudo graças ao stackoverflow para me ajudar a resolver o problema.
Também pode ser uma boa ideia usar palavras irrelevantes para minimizar lemas de saída se forem usadas posteriormente no classificador. Por favor, dê uma olhada na extensão coreNlp escrita por John Conwell.
fonte
Tentei sua lista de termos neste site de demonstração de bola de neve e os resultados parecem bons ...
Um lematizador deve transformar as formas flexionadas das palavras em alguma raiz comum. Não é realmente o trabalho de um lematizador fazer dessa raiz uma palavra de dicionário "adequada". Para isso, você precisa olhar para analisadores morfológicos / ortográficos .
Acho que essa pergunta é mais ou menos a mesma coisa, e a resposta de Kaarel a essa pergunta é de onde peguei o segundo link.
fonte
Os debates lematizador vs lematizador continuam. É uma questão de preferir a precisão à eficiência. Você deve lematizar para obter unidades e radical lingüisticamente significativas para usar o mínimo de energia de computação e ainda indexar uma palavra e suas variações sob a mesma chave.
Vejo Stemmers vs Lemmatizers
Aqui está um exemplo com python NLTK:
fonte
WordNetLemmatizer
'slemmatize()
pode ter um tag POS. Então, do seu exemplo:" ".join([wnl.lemmatize(i, pos=VERB) for i in sent.split()])
dá'cat run run cactus cactuses cacti community communities'
.pos=NOUN
? BTW: Há quanto tempo, espero que nos encontremos na conferência em breve =)pos=VERB
você só faz a lematização dos verbos. Os substantivos permanecem os mesmos. Eu só tive que escrever um pouco do meu próprio código para girar em torno das tags POS Penn Treebank reais para aplicar a lematização correta a cada token. Além disso,WordNetLemmatizer
fede em lematizar o tokenizer padrão do nltk. Portanto, exemplos comodoes n't
não lematizar parado not
.port.stem("this")
produzthi
eport.stem("was")
wa
, mesmo quando a posição certa é fornecida para cada um.A página oficial de Martin Porter contém um Porter Stemmer em PHP e outras linguagens .
Se você realmente quer uma boa lematização, vai precisar começar com algo como o Algoritmo de Porter, refine-o adicionando regras para corrigir casos incorretos comuns ao seu conjunto de dados e, finalmente, adicione muitas exceções às regras . Isso pode ser facilmente implementado com pares de chave / valor (dbm / hash / dicionários) onde a chave é a palavra a ser pesquisada e o valor é a palavra raiz para substituir o original. Um mecanismo de pesquisa comercial em que trabalhei uma vez acabou com 800 algumas exceções a um algoritmo de Porter modificado.
fonte
http://wordnet.princeton.edu/man/morph.3WN
Para muitos dos meus projetos, prefiro o lematizador WordNet baseado em léxico em vez do lematizador Porter mais agressivo.
http://wordnet.princeton.edu/links#PHP tem um link para uma interface PHP para as APIs WN.
fonte
Com base em várias respostas no Stack Overflow e em blogs que encontrei, este é o método que estou usando e parece retornar palavras reais muito bem. A ideia é dividir o texto recebido em uma série de palavras (use o método que desejar) e, em seguida, encontrar as classes gramaticais (POS) para essas palavras e usá-las para ajudar a drenar e lematizar as palavras.
Sua amostra acima não funciona muito bem, porque o POS não pode ser determinado. No entanto, se usarmos uma frase real, as coisas funcionam muito melhor.
fonte
Procure no WordNet, um grande banco de dados lexical para o idioma inglês:
http://wordnet.princeton.edu/
Existem APIs para acessá-lo em vários idiomas.
fonte
Parece interessante: MIT Java WordnetStemmer: http://projects.csail.mit.edu/jwi/api/edu/mit/jwi/morph/WordnetStemmer.html
fonte
Dê uma olhada no LemmaGen - biblioteca de código aberto escrita em C # 3.0.
Resultados para suas palavras de teste ( http://lemmatise.ijs.si/Services )
fonte
Os pacotes de topo Python (em nenhuma ordem específica) para lematização são:
spacy
,nltk
,gensim
,pattern
,CoreNLP
eTextBlob
. Eu prefiro a implementação de spaCy e gensim (com base no padrão) porque eles identificam a marca POS da palavra e atribuem o lema apropriado automaticamente. O fornece lemas mais relevantes, mantendo o significado intacto.Se você planeja usar nltk ou TextBlob, você precisa se preocupar em encontrar a tag POS certa manualmente e encontrar o lema certo.
Exemplo de lematização com spaCy:
Exemplo de lematização com Gensim:
Os exemplos acima foram emprestados desta página de lematização .
fonte
Faça uma pesquisa por Lucene, não tenho certeza se existe uma porta PHP, mas sei que Lucene está disponível para muitas plataformas. Lucene é uma biblioteca de indexação e pesquisa OSS (da Apache). Naturalmente, ele e os extras da comunidade podem ter algo interessante para observar. No mínimo você pode aprender como é feito em uma linguagem para que possa traduzir a "ideia" para PHP
fonte
Se eu puder citar minha resposta à pergunta que StompChicken mencionou:
Como não entendem a língua e não fogem de um dicionário de termos, não têm como reconhecer e responder adequadamente aos casos irregulares, como "correu" / "correu".
Se precisar lidar com casos irregulares, você precisará escolher uma abordagem diferente ou aumentar sua lematização com seu próprio dicionário personalizado de correções para executar depois que o lematizador tiver feito seu trabalho.
fonte
A versão mais atual do lematizador em NLTK é Snowball.
Você pode encontrar exemplos de como usá-lo aqui:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.stem.snowball2-pysrc.html#demo
fonte
Você pode usar o lematizador Morpha. UW carregou morpha stemmer no Maven central se você planeja usá-lo em um aplicativo Java. Existe um invólucro que o torna muito mais fácil de usar. Você só precisa adicioná-lo como uma dependência e usar a
edu.washington.cs.knowitall.morpha.MorphaStemmer
classe. As instâncias são threadsafe (o JFlex original tinha campos de classe para variáveis locais desnecessariamente). Instancie uma classe e executemorpha
a palavra que deseja derivar.fonte
.Net lucene tem um lematizador de Porter embutido. Você pode tentar isso. Mas observe que o radical de Porter não considera o contexto da palavra ao derivar o lema. (Passe pelo algoritmo e sua implementação e você verá como funciona)
fonte
Martin Porter escreveu Snowball (uma linguagem para algoritmos de lematização) e reescreveu o "English Stemmer" em Snowball. Existe um Stemmer em inglês para C e Java.
Ele afirma explicitamente que o Porter Stemmer foi reimplementado apenas por razões históricas, portanto, testar a correção de stemming com o Porter Stemmer obterá resultados que você (deveria) já conhecer.
Dr. Porter sugere usar o lematizador inglês ou Porter2 em vez do lematizador Porter. O lematizador em inglês é o que realmente é usado no site de demonstração, como @StompChicken respondeu anteriormente.
fonte
Em Java, eu uso tartargus-snowball para derivar palavras
Maven:
Código de amostra:
fonte
Experimente este aqui: http://www.twinword.com/lemmatizer.php
Entrei sua consulta no demo
"cats running ran cactus cactuses cacti community communities"
e obtive["cat", "running", "run", "cactus", "cactus", "cactus", "community", "community"]
com o flag opcionalALL_TOKENS
.Código de amostra
Esta é uma API para que você possa se conectar a ela de qualquer ambiente. Esta é a aparência da chamada PHP REST.
fonte
Eu recomendo fortemente o uso de Spacy (análise e marcação de texto base) e Textacy (processamento de texto de nível superior construído em cima do Spacy).
Palavras lematizadas estão disponíveis por padrão no Spacy como um
.lemma_
atributo de token e o texto pode ser lematizado ao fazer muitos outros pré-processamento de texto com textacy. Por exemplo, ao criar um pacote de termos ou palavras ou, geralmente, antes de executar algum processamento que o exija.Recomendo que você verifique os dois antes de escrever qualquer código, pois isso pode economizar muito tempo!
fonte
fonte