2012-03-31 14 views
13

Estoy tratando de encontrar etiquetas (palabras clave) para una receta mediante el análisis de una larga cadena de texto. El texto contiene los ingredientes de la receta, instrucciones y una pequeña propaganda.Técnica para eliminar palabras comunes (y sus versiones plurales) de una cadena

¿Cuál crees que sería la forma más eficaz de eliminar palabras comunes de la lista de etiquetas?

Por palabras comunes, me refiero a palabras como: 'el', 'en', 'no', 'su' etc.

tengo 2 metodologías que puedo usar, que crees que es más eficiente en términos de velocidad y ¿sabes de una manera más eficiente que podría hacer esto?

Metodología 1:
- Determinar el número de veces que ocurre cada palabra (usando las colecciones de la biblioteca)
- Tener una lista de palabras comunes y eliminar todas las 'palabras comunes' del objeto Collection, tratando de eliminar esa clave del objeto Collection si existe.
- Por lo tanto, la velocidad será determinado por la longitud de la variable 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() 

Metodología 2:
- Para las palabras comunes que pueden ser plural, mirar cada palabra de la cadena receta, y comprobar si contiene parcialmente la versión no plural de una palabra común. P.ej; Para la cadena "Hay una prueba", compruebe cada palabra para ver si contiene "allí" y elimínela si lo hace.

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

No puedo darle una respuesta completa aquí, pero sí quería mencionar algo que podría ayudarlo. Al hacer cualquier clase de análisis textual, generalmente se desea poder tratar las pluralizaciones, las conjugaciones y otras transformaciones como todas relacionadas con la misma 'palabra'. Por ejemplo: es posible que desee tratar delimitar, delimitar, delimitar, delimitar, delimitar ... como lo mismo. Este proceso se llama 'derivación' y hay una serie de algoritmos bien investigados, con ejemplos de una variedad de lenguajes de programación, que intentarán hacer esto por usted. ¡Buena suerte! Ojalá pudiera ser más ayuda. – soundslikeneon

+2

En realidad, recomendaría más o menos lo contrario. Si la intención es simplemente "eliminar" las palabras "comunes" predefinidas, simplemente crearía la lista completa, completa con todas las variaciones de cada palabra que desee eliminar. No te preocupes por qué palabras son plurales de los cuales. Mucho más simple/más rápido/menos propenso a errores. –

Respuesta

9

Tu problema es "Natural Language Processing".

Si no desea reinventar la rueda, use NLTK, busque stemming en los documentos.

Dado que NLP es uno de los temas más difíciles en la informática, la reinvención de esta rueda es mucho trabajo ...

1

Usted pregunta acerca de la velocidad, pero debería estar más preocupado con exactitud. Ambas sugerencias cometerán muchos errores, eliminando demasiado o muy poco (por ejemplo, hay mucho de palabras que contienen la subcadena "at"). Apoyo la sugerencia de buscar en el módulo nltk. De hecho, uno de los primeros ejemplos en the NLTK book implica eliminar palabras comunes hasta que las más comunes restantes revelan algo sobre el género. Obtendrá no solo herramientas, sino instrucciones sobre cómo hacerlo.

De todos modos, pasarás mucho más tiempo escribiendo tu programa de lo que gastará tu computadora al ejecutarlo, así que concéntrate en hacerlo bien.

23

que acababa de hacer algo como esto:

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()) 

que imprime

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

y en términos de complejidad debe ser O (n) en el número de palabras en la cadena, si cree que la búsqueda del conjunto hash es O (1).

Fwiw, mi versión de NLTK define stopwords 127:

'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' 

, obviamente, puede proporcionar su propio conjunto; Estoy de acuerdo con el comentario sobre su pregunta que es probablemente el más fácil (y el más rápido) simplemente proporcionar todas las variaciones que desea eliminar por adelantado, a menos que quiera eliminar muchas más palabras que esto, pero luego se convierte en una cuestión más de detectar los interesantes que eliminar los espurios.

+3

Asegúrese de ejecutar nltk.download() primero para recuperar su corpus. –

Cuestiones relacionadas