Domanda

Devo prendere un paragrafo di testo ed estrarre da esso un elenco di " tag " ;. La maggior parte di questo è abbastanza semplice. Tuttavia ho bisogno di aiuto ora per ottenere l'elenco di parole risultante per evitare duplicati. Esempio: Comunità / Comunità

Ho usato un'implementazione dell'algoritmo di Porter Stemmer (sto scrivendo in PHP a proposito):

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

Funziona, fino a un certo punto, ma non restituisce "reale" parole. L'esempio sopra è derivato da " commun " ;.

Ho provato " Snowball " (suggerito in un altro thread Stack Overflow).

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

Per il mio esempio (comunità / comunità), Snowball deriva da " communiti " ;.

Domanda

Esistono altri algoritmi di derivazione che lo faranno? Qualcun altro ha risolto questo problema?

Il mio pensiero attuale è che potrei usare un algoritmo di derivazione per evitare duplicati e quindi scegliere la parola più corta che incontro per essere la parola effettiva da visualizzare.

È stato utile?

Soluzione

Il problema principale qui è che gli algoritmi di derivazione operano su base fonetica esclusivamente sulla base delle regole di ortografia della lingua senza una reale comprensione della lingua con cui stanno lavorando. Per produrre parole reali, probabilmente dovrai unire l'output dello stemmer con una qualche forma di funzione di ricerca per riconvertire gli stem in parole reali. In sostanza posso vedere due potenziali modi per farlo:

  1. Individua o crea un dizionario di grandi dimensioni che associ ogni possibile origine a una parola reale. (ad es. comunità - > community)
  2. Crea una funzione che confronta ogni radice con un elenco delle parole che sono state ridotte a quella radice e tenta di determinare quale sia la più simile. (ad esempio, il confronto tra "community" e "community" e "community" in modo tale che "community" venga riconosciuta come l'opzione più simile)

Personalmente, penso che il modo in cui lo farei sarebbe una forma dinamica di # 1, costruendo un database di dizionario personalizzato registrando ogni parola esaminata insieme a ciò a cui è derivata e quindi assumendo che la parola più comune sia quella che dovrebbe essere usato. (ad esempio, se il mio corpo di testo sorgente utilizza "comunità" più spesso di "comunità", quindi mappa comunità - > comunità.) Un approccio basato sul dizionario sarà più accurato in generale e lo costruirà sulla base dell'input più acuto fornirà risultati personalizzati per i tuoi testi, con il principale svantaggio di essere lo spazio richiesto, che in genere non è un problema al giorno d'oggi.

Altri suggerimenti

Se capisco correttamente, ciò di cui hai bisogno non è uno stemmer ma un lemmatizzatore. Lemmatizer è uno strumento con conoscenza di finali come -ies , -ed , ecc., E formule di parole eccezionali come scritto , ecc. Lemmatizer mappa il inserisci la forma del suo lemma, che è garantito per essere un "reale" parola.

Ci sono molti lemmatizzatori per l'inglese, tuttavia ho usato solo morpha . Morpha è solo un grande file lex che puoi compilare in un eseguibile. Esempio di utilizzo:

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

Puoi ottenere morpha da http: // www .informatics.sussex.ac.uk / ricerca / gruppi / NLP / Carroll / morph.html

Ehi, non so se forse è troppo tardi, ma c'è solo uno script derivato da PHP che produce parole reali: http: // phpmorphy .sourceforge.net / & # 8211; & nbsp; mi ci sono voluti anni per trovarlo. Tutti gli altri stemmer devono essere compilati e anche dopo funzionano solo secondo l'algoritmo Porter, che produce stems, non lemmi (cioè community = communiti). PhpMorphy one funziona perfettamente, è facile da installare e inizializzare e ha dizionari inglesi, russi, tedeschi, ucraini ed estoni. Viene inoltre fornito con uno script che è possibile utilizzare per compilare altri dizionari. La documentazione è in russo, ma la metti attraverso Google Translate e dovrebbe essere facile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top