2009-10-15 5 views
36

Come faccio a estrarre dati in una pila di testo per ottenere le parole chiave in base all'utilizzo? ("Jacob Smith" o "recinzione")Come estrarre le parole chiave utilizzate nel testo?

E c'è già un software per farlo? anche semi-automaticamente, e se può filtrare parole semplici come "il", "e", "o", allora potrei arrivare agli argomenti più velocemente.

risposta

39

L'algoritmo generale sta per andare in questo modo:

 
- Obtain Text 
- Strip punctuation, special characters, etc. 
- Strip "simple" words 
- Split on Spaces 
- Loop Over Split Text 
    - Add word to Array/HashTable/Etc if it doesn't exist; 
     if it does, increment counter for that word 

Il risultato finale è un conteggio di frequenza di tutte le parole del testo. È quindi possibile prendere questi valori e dividere per il numero totale di parole per ottenere una percentuale di frequenza. Qualsiasi ulteriore elaborazione spetta a te.

Si vorrà anche esaminare Stemming. Lo stemming è usato per ridurre le parole alla radice. Ad esempio going => go, cars => car, ecc.

Un algoritmo come questo è comune nei filtri antispam, nell'indicizzazione di parole chiave e simili.

+0

puoi dare qualche fonte di -> lista di parole "semplici" di strisce. Non riesco a trovarli –

+0

In linguaggio naturale, le parole "semplici" sono spesso definite parole di arresto. http://en.wikipedia.org/wiki/Stop_words. Ci sono un sacco di file stopwords.txt in giro ... ad es. http://ir.dcs.gla.ac.uk/resources/linguistic_utils/stop_words – roy

+0

Un elenco di parole di arresto in inglese: http://xpo6.com/list-of-english-stop-words/ –

119

Questa è una domanda aperta in PNL, quindi non esiste una risposta semplice.

La mia raccomandazione per "il meglio per me" veloce e sporco è topia.termextract.

Yahoo ha un servizio di estrazione parole chiave (http://developer.yahoo.com/search/content/V1/termExtraction.html) che è un richiamo basso ma di alta precisione. In altre parole, ti dà un piccolo numero di termini di alta qualità, ma manca molti dei termini nei tuoi documenti.

In Python, esiste topia.termextract (http://pypi.python.org/pypi/topia.termextract/). È relativamente rumoroso e propone molte parole chiave fasulle, ma è semplice da usare.

Termine (http://www.nactem.ac.uk/software/termine/) è un servizio Web del Regno Unito che è anche relativamente rumoroso e propone molte parole chiave fasulle. Tuttavia, mi sembra leggermente più preciso di topia.termextract. YMMV.

Un modo per eliminare i risultati con troppe parole chiave (ad esempio topia.termextract e termine) è creare un vocabolario di termini che si verificano frequentemente e quindi eliminare termini proposti che non fanno parte del vocabolario. In altre parole, esegui due passaggi sul corpus: il primo passaggio, conta la frequenza di ciascuna parola chiave. Nel secondo passaggio, scarta le parole chiave che sono troppo rare.

Se si vuole scrivere il proprio, forse la migliore introduzione è scritta da Park, che è ora a IBM:

  • "estrazione glossario automatica: al di là di identificazione terminologia" disponibile presso http://portal.acm.org/citation.cfm?id=1072370
  • "Glossario l'estrazione e l'utilizzo nella ricerca di informazioni e sistema di consegna per il supporto tecnico IBM"

Qui ci sono alcuni più riferimenti, se volete saperne di più:

  • http://en.wikipedia.org/wiki/Terminology_extraction
  • "CorePhrase: Keyphrase estrazione per Document Clustering"
  • Liu et al 2009 dalle NAACL HLT
  • "identificazione automatica di frasi non-compositivi"
  • "Data Mining Soddisfa Collocazioni Discovery"
  • Così come una serie di altri riferimenti è possibile approfondire l'argomento.
5

Non hai specificato una tecnologia con cui stai lavorando, quindi suppongo che anche uno script di shell sia una possibilità.

Sono sempre stato impressionato con l'esempio analisi di frequenza parola nel Advanced Bash-Scripting Guide (12-11)

Il seguente ad esempio recupera un libro da progetto Gutenburg e scrive una parola di frequenza analisi 'report':

wget http://www.gutenberg.org/files/20417/20417-8.txt -q -O- | 
sed -e 's/\.//g' -e 's/\,//g' -e 's/ /\ 
/g' | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr > output.txt 

dovrà applicare anche ad escludere parole da una lista 'comune' (l ', e, una ...), ecc

9

C'è anche un servizio chiamato Alchemy che può fare termine di estrazione, il concetto di tagging , sentimento analisi e così via.

È valido, l'ho provato ma non conosco le politiche commerciali (se presenti). Forniscono API per qualsiasi tipo di linguaggio (praticamente).

Ho letto da qualche parte (mi dispiace non ricordo più dove) che l'output dato da Alchemy è meno rumoroso rispetto a quelli proposti da Joseph.

+0

"Alchimia" sembra per essere molto efficace. Ma esiste un equivalente offline? Coz, quando si tratta di dati lotsa, una soluzione basata su cloud sembra essere meno efficiente. – bdhar

+1

C'è un Python Toolkit che sembra molto promettente (da un paio di valutazioni empiriche che ho fatto tempo fa): http://www.nltk.org/ –

0

Ho usato NTLK a recognize named entities prima con un po 'di successo. È particolarmente bravo a riconoscere i nomi delle persone e dell'organizzazione.