parser parseo parse example python parsing processing-efficiency

python - parseo - Técnica para eliminar palabras comunes(y sus versiones plurales) de una cadena



python bnf (3)

El dominio de su problema es " Procesamiento de lenguaje natural ".

Si no desea reinventar la rueda, use NLTK , busque derivación en los documentos.

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

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.

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

Con palabras comunes, me refiero a palabras como: ''the'', ''at'', ''there'', ''their'', etc.

Tengo 2 metodologías que puedo usar, ¿cuál crees que es más eficiente en términos de velocidad y conoces una forma más eficiente de hacerlo?

Metodología 1:
- Determine el número de veces que aparece cada palabra (usando las colecciones de la biblioteca)
- Tener una lista de palabras comunes y eliminar todas las ''Palabras comunes'' del objeto Collection al intentar eliminar esa clave del objeto Collection si existe.
- Por lo tanto, la velocidad estará determinada 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 palabras comunes que pueden ser plurales, observe cada palabra en la cadena de recetas, y verifique 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()


Usted pregunta por la velocidad, pero debería preocuparse más por la precisión. Ambas sugerencias cometerán muchos errores, eliminando demasiado o muy poco (por ejemplo, hay muchas palabras que contienen la subcadena "at"). Apoyo la sugerencia de buscar en el módulo nltk. De hecho, uno de los primeros ejemplos del libro NLTK 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.


Yo solo haría 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 número de palabras en la cadena, si usted cree que la búsqueda del conjunto hash es O (1).

FWIW, mi versión de NLTK define 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''

obviamente puedes proporcionar tu propio set; Estoy de acuerdo con el comentario sobre su pregunta de que probablemente sea más fácil (y 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.