2017-03-08 18 views
5

Chcę usunąć stopwords z kolumny Data w moim pliku. Odfiltrowałem linię, gdy mówi użytkownik końcowy. Ale to nie odfiltrowuje stoperów z usertext.apply(lambda x: [word for word in x if word not in stop_words]) co robię źle?Usuwanie stopwords z pliku

import pandas as pd 
from stop_words import get_stop_words 
df = pd.read_csv("F:/textclustering/data/cleandata.csv", encoding="iso-8859-1") 
usertext = df[df.Role.str.contains("End-user",na=False)][['Data','chatid']] 
stop_words = get_stop_words('dutch') 
clean = usertext.apply(lambda x: [word for word in x if word not in stop_words]) 
print(clean) 
+0

pierwszy może y ou 1) wydrukuj 'stop_words', 2) spróbuj' clean = usertext.apply (lambda x: []) 'aby sprawdzić, czy usuwa wszystkie słowa? (tylko do testowania) –

+0

Dane [] chatid [] dtype: obiekt ['aan', 'al', 'alles', 'als', 'altijd', 'andere', 'ben', 'bij' "daar", "dan", "dat", "de", "der", "deze", "die", "dit", "doch", "doen", "door", "dus", " een "," eens "," en "," er "," ge "," geen "," geweest "," haar "," had "," heb "," hebben "," heeft "," hem " "het", "hier", "hij", "hoe", "hun", "iemand", "iets", "ik", "in", "is", "ja", "je", " kan "," kon "," kunnen "," maar "," me "," meer "," men "," met "," mij "," mijn "," moet "," na "," naar " , "niet", "niets", "nog", "nu", "of", "om", "omdat", ...] To jest wynik zarówno – DataNewB

Odpowiedz

0
clean = usertext.apply(lambda x: x if x not in stop_words else '') 
+0

, jeśli to działa, proponuję użyć ' ustaw 'dla' stop_words', aby uzyskać efektywność. –

+0

Otrzymuję NameError: ("nazwa" słowo "nie jest zdefiniowane", "wystąpiło przy indeksie danych") kiedy go uruchomię – DataNewB

+0

@DataNewB przykro, że powinno być x – galaxyan

1

można zbudować wzorzec regex swojego zatrzymania słów i wywołać wektoryzowane str.replace celu ich usunięcia:

In [124]: 
stop_words = ['a','not','the'] 
stop_words_pat = '|'.join(['\\b' + stop + '\\b' for stop in stop_words]) 
stop_words_pat 

Out[124]: 
'\\ba\\b|\\bnot\\b|\\bthe\\b' 

In [125]:  
df = pd.DataFrame({'text':['a to the b', 'the knot ace a']}) 
df['text'].str.replace(stop_words_pat, '') 

Out[125]: 
0   to b 
1  knot ace 
Name: text, dtype: object 

tutaj wykonujemy listowych zbudować wzorzec otaczającą każde słowo zatrzymania z '\b', która jest zerwaniem, a następnie or wszystkimi słowami z użyciem '|'

1

Dwa numery:

Po pierwsze, masz moduł o nazwie stop_words, a później utworzysz zmienną o nazwie stop_words. To jest zła forma.

Po drugie, przekazujesz funkcję lambda do .apply, która chce, aby jej parametr x był listą, a nie wartością z listy.

Oznacza to, że zamiast wykonywać df.apply(sqrt), robisz df.apply(lambda x: [sqrt(val) for val in x]).

należy albo zrobić lista przetwarzania siebie:

clean = [x for x in usertext if x not in stop_words] 

Albo należy wykonać zastosować, z funkcji, która zajmuje jedno słowo na raz:

clean = usertext.apply(lambda x: x if x not in stop_words else '') 

Jako @ Jean- François Fabre sugeruje w komentarzu, można przyspieszyć, jeśli stop_words jest zbiorem zamiast listy:

from stop_words import get_stop_words 

nl_stop_words = set(get_stop_words('dutch')) # NOTE: set 

usertext = ... 
clean = usertext.apply(lambda word: word if word not in nl_stop_words else '')