2017-08-14 4 views
1

Je suis nouveau au traitement de texte Python, j'essaie de mot de mot dans le document de texte, a environ 5000 lignes.Stemming mots avec NLTK (python)

J'ai écrit ci-dessous le script

from nltk.corpus import stopwords # Import the stop word list 
from nltk.stem.snowball import SnowballStemmer 

stemmer = SnowballStemmer('english') 

def Description_to_words(raw_Description): 
    # 1. Remove HTML 
    Description_text = BeautifulSoup(raw_Description).get_text() 
    # 2. Remove non-letters   
    letters_only = re.sub("[^a-zA-Z]", " ", Description_text) 
    # 3. Convert to lower case, split into individual words 
    words = letters_only.lower().split()      

    stops = set(stopwords.words("english"))     
    # 5. Remove stop words 
    meaningful_words = [w for w in words if not w in stops] 
    # 5. stem words 
    words = ([stemmer.stem(w) for w in words]) 

    # 6. Join the words back into one string separated by space, 
    # and return the result. 
    return(" ".join(meaningful_words)) 

clean_Description = Description_to_words(train["Description"][15]) 

Mais quand je teste des résultats mots ne sont pas découlaient, quelqu'un peut me aider à savoir ce qui est question, je fais quelque chose de mal dans la fonction « Description_to_words »

Et, quand j'exécute la commande de tige séparément comme ci-dessous cela fonctionne.

from nltk.tokenize import sent_tokenize, word_tokenize 
>>> words = word_tokenize("MOBILE APP - Unable to add reading") 
>>> 
>>> for w in words: 
...  print(stemmer.stem(w)) 
... 
mobil 
app 
- 
unabl 
to 
add 
read 

Répondre

1

Ici, chaque étape de votre fonction est corrigée.

  1. Supprimer le code HTML.

    Description_text = BeautifulSoup(raw_Description).get_text() 
    
  2. Enlever les non-lettres, mais ne suppriment pas tout de suite les espaces blancs. Vous pouvez aussi simplifier un peu votre regex.

    letters_only = re.sub("[^\w\s]", " ", Description_text) 
    
  3. Convertir en minuscules, divisé en mots: Je recommande d'utiliser word_tokenize à nouveau, ici.

    from nltk.tokenize import word_tokenize 
    words = word_tokenize(letters_only.lower())     
    
  4. Supprimer les mots d'arrêt.

    stops = set(stopwords.words("english")) 
    meaningful_words = [w for w in words if not w in stops] 
    
  5. Mots de la racine. Voici un autre problème. Tige meaningful_words, pas words.

    return ' '.join(stemmer.stem(w) for w in meaningful_words]) 
    
+0

c'est tout simplement génial. Merci beaucoup pour ta réponse. Ça marche. Je suis très heureux :) – user3734568

+0

juste une question que nous pouvons utiliser la même logique dans la lemmatisation word.lemmatize() correct – user3734568

+1

@ user3734568 oui, vous pouvez, juste en changeant 'stemmer.stem (w)' à 'lemmatizer.lemmatize (mot) ' –