Technique pour enlever les mots communs (et leurs versions plurielles) d'une chaîne
J'essaie de trouver des tags(mots-clés) pour une recette de l'analyse d'une longue chaîne de texte. Le texte contient des ingrédients de la recette, les directions et un court texte de présentation.
Que pensez-vous serait le moyen le plus efficace pour supprimer les mots de la liste de balises?
Par le commun des mots, je veux dire des mots comme: 'le', 'en', 'y', 'leurs' etc.
J'ai 2 méthodes que je peux utiliser, qui pensez-vous est le plus efficace en termes de vitesse et connaissez-vous un moyen plus efficace, je pourrais faire cela?
Méthodologie 1:
- Déterminer le nombre de fois que chaque mot se produit(à l'aide des Collections de la bibliothèque)
- Avoir une liste de mots courants et de supprimer tous les "Mots Communs" de l'objet de Collection, en essayant de supprimer la clé de l'objet de Collection, si elle existe.
- Par conséquent, la vitesse sera déterminée par la longueur 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()
Méthodologie 2:
- Pour les mots courants qui peuvent être pluriel, regarder chaque mot dans la recette de la chaîne, et de vérifier si elle a partiellement contient les non-pluriel version d'une parole commune. Par exemple; Pour la chaîne "Il y a un test de" vérifier chaque mot pour voir si elle contient des "y" et le supprimer si il n'.
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()
source d'informationauteur Jake M
Vous devez vous connecter pour publier un commentaire.
Je venais de faire quelque chose comme ceci:
qui imprime
et en termes de complexité doit être O(n) en nombre de mots dans la chaîne, si vous croyez que le haché set de recherche est O(1).
FWIW, ma version de NLTK définit 127 les mots vides:
évidemment, vous pouvez fournir votre propre jeu; je suis d'accord avec le commentaire sur votre question qu'il est probablement plus facile (et plus rapide) de fournir toutes les variations que vous souhaitez éliminer à l'avant, sauf si vous voulez éliminer beaucoup plus de mots que de cela, mais ensuite il devient de plus en plus une question de repérage intéressantes que d'éliminer les fausses.
Votre problème de domaine est "Traitement Du Langage Naturel".
Si vous ne voulez pas de réinventer la roue, utilisez NLTKrecherche pour découlant dans les docs.
Étant donné que La PNL est l'un des plus difficiles de sujets en sciences de l'informatique, de réinventer la roue, c'est beaucoup de travail...
Vous vous posez au sujet de la vitesse, mais vous devriez être plus concernés par l'exactitude. À la fois vos suggestions font beaucoup de fautes, la suppression ou trop ou trop peu (par exemple, il y a beaucoup de mots contenant la sous-chaîne "à"). Je seconde la suggestion de regarder dans les nltk module. En fait, l'un des premiers exemples dans le NLTK livre implique la suppression des mots communs jusqu'à ce que le plus commun de ceux qui restent révéler quelque chose sur le genre. Vous obtiendrez non seulement des outils, mais des instructions sur la façon d'aller à ce sujet.
De toute façon vous allez passer beaucoup plus de temps à écrire votre programme de votre ordinateur va passer de l'exécuter, donc se concentrer sur le faire bien.