2012-03-31 7 views
13

Sto tentando di trovare tag (parole chiave) per una ricetta analizzando una lunga stringa di testo. Il testo contiene gli ingredienti della ricetta, le indicazioni e una breve descrizione.Tecnica per rimuovere le parole comuni (e le loro versioni plurali) da una stringa

Quale pensi che sarebbe il modo più efficace per rimuovere parole comuni dall'elenco di tag?

Con parole comuni, voglio dire parole come: 'la', 'a', 'c'e', 'loro' ecc

Ho 2 metodologie che posso usare, che pensi che sia più efficiente in termini di velocità e sai di un modo più efficiente che potrei fare?

Metodologia 1:
- determinare il numero di volte in cui si verifica ogni parola (utilizzando le collezioni della biblioteca)
- Avere una lista di parole comuni e rimuovere tutte le 'parole comuni' dall'oggetto Collection tentando di cancellare quella chiave dall'oggetto Collection se esiste.
- Pertanto la velocità sarà determinata dalla lunghezza della variabile delims

import collections from Counter 
delim  = ['there','there\'s','theres','they','they\'re'] 
# the above will end up being a really long list! 
word_freq = Counter(recipe_str.lower().split()) 
for delim in set(delims): 
    del word_freq[delim] 
return freq.most_common() 

Metodologia 2:
- Per parole comuni che possono essere plurale, osservare ogni parola della stringa ricetta, e controllare se contiene parzialmente la versione non plurale di una parola comune. Per esempio; Per la stringa "There's a test" controlla ogni parola per vedere se contiene "there" ed eliminala se lo fa.

delim   = ['this','at','them'] # words that cant be plural 
partial_delim = ['there','they',] # words that could occur in many forms 
word_freq  = Counter(recipe_str.lower().split()) 
for delim in set(delims): 
    del word_freq[delim] 
# really slow 
for delim in set(partial_delims): 
    for word in word_freq: 
     if word.find(delim) != -1: 
      del word_freq[delim] 
return freq.most_common() 
+3

Non posso darti una risposta completa qui, ma volevo menzionare qualcosa che potrebbe aiutarti. Quando si esegue un qualsiasi tipo di analisi testuale, in genere si desidera essere in grado di trattare pluralizzazioni, coniugazioni e altre trasformazioni simili a quelle relative alla stessa "parola". Ad esempio: puoi considerare delimit, delimiti, delimitati, delimitatori, delimitatori ... come gli stessi. Questo processo è chiamato "arginamento" e ci sono una serie di algoritmi ben studiati, con esempi tratti da una varietà di linguaggi di programmazione, che tenteranno di farlo per voi. In bocca al lupo! Vorrei poter essere di più aiuto. – soundslikeneon

+2

In realtà, consiglierei praticamente il contrario. Se l'intento è puramente di "rimuovere" le parole "comuni" predefinite, vorrei semplicemente creare l'elenco completo, completo di tutte le varianti di ogni parola che si desidera rimuovere. Non preoccuparti di quali parole sono plurali di cui. Molto più semplice/più veloce/meno soggetto a errori. –

risposta

9

Il dominio del problema è "Natural Language Processing".

Se non si desidera reinventare la ruota, utilizzare NLTK, cercare stemming nei documenti.

Dato che NLP è uno dei temi più difficili in informatica, reinventare questa ruota è un sacco di lavoro ...

1

Mi chiedi di velocità, ma si dovrebbe essere più interessato a precisione. Entrambi i tuoi suggerimenti faranno molti errori, eliminando troppo o troppo poco (ad esempio, ci sono molto di parole che contengono la sottostringa "at"). Seguo il suggerimento per esaminare il modulo nltk. In effetti, uno dei primi esempi in the NLTK book riguarda la rimozione di parole comuni fino a quando le restanti più comuni rivelano qualcosa sul genere. Non otterrai solo strumenti, ma istruzioni su come procedere.

In ogni caso, trascorrerai molto più tempo a scrivere il programma di quanto il tuo computer impiegherà a eseguirlo, quindi concentrati a farlo bene.

23

avevo appena fare qualcosa di simile:

from nltk.corpus import stopwords 
s=set(stopwords.words('english')) 

txt="a long string of text about him and her" 
print filter(lambda w: not w in s,txt.split()) 

che stampa

['long', 'string', 'text'] 

sia in termini di complessità dovrebbe essere O (n) nel numero di parole nella stringa, se si credo che la ricerca del set hash sia O (1).

FWIW, la mia versione di NLTK definisce 127 stopwords:

'all', 'just', 'being', 'over', 'both', 'through', 'yourselves', 'its', 'before', 'herself', 'had', 'should', 'to', 'only', 'under', 'ours', 'has', 'do', 'them', 'his', 'very', 'they', 'not', 'during', 'now', 'him', 'nor', 'did', 'this', 'she', 'each', 'further', 'where', 'few', 'because', 'doing', 'some', 'are', 'our', 'ourselves', 'out', 'what', 'for', 'while', 'does', 'above', 'between', 't', 'be', 'we', 'who', 'were', 'here', 'hers', 'by', 'on', 'about', 'of', 'against', 's', 'or', 'own', 'into', 'yourself', 'down', 'your', 'from', 'her', 'their', 'there', 'been', 'whom', 'too', 'themselves', 'was', 'until', 'more', 'himself', 'that', 'but', 'don', 'with', 'than', 'those', 'he', 'me', 'myself', 'these', 'up', 'will', 'below', 'can', 'theirs', 'my', 'and', 'then', 'is', 'am', 'it', 'an', 'as', 'itself', 'at', 'have', 'in', 'any', 'if', 'again', 'no', 'when', 'same', 'how', 'other', 'which', 'you', 'after', 'most', 'such', 'why', 'a', 'off', 'i', 'yours', 'so', 'the', 'having', 'once' 

, ovviamente, è possibile fornire il proprio set; Sono d'accordo con il commento sulla tua domanda che probabilmente è più facile (e più veloce) fornire solo tutte le varianti che vuoi eliminare, a meno che tu non voglia eliminare molte più parole di questa, ma poi diventa più una domanda di individuare quelli interessanti che eliminare quelli spuri.

+3

Assicurati di eseguire nltk.download() prima di recuperare il tuo corpus. –