2017-03-08 27 views
5

Tôi muốn xóa các từ dừng khỏi cột Dữ liệu trong tệp của mình. Tôi lọc ra dòng khi người dùng cuối nói. Nhưng nó không lọc ra các từ dừng với usertext.apply(lambda x: [word for word in x if word not in stop_words]) tôi đang làm gì sai?Xóa các từ dừng khỏi tệp

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

đầu tiên có thể y ou 1) in 'stop_words', 2) thử' clean = usertext.apply (lambda x: []) 'để xem nó có xóa tất cả các từ không? (chỉ để kiểm tra) –

+0

Dữ liệu [] chatid [] dtype: đối tượng ['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 ',' ma ',' tôi ',' meer ',' đàn ông ',' gặp ',' mij ',' mijn ',' moet ',' na ',' naar ' , 'niet', 'niets', 'nog', 'nu', 'của', 'om', 'omdat', ...] Đây là đầu ra của cả hai – DataNewB

Trả lời

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

nếu nó hoạt động, tôi đề nghị sử dụng một ' set' cho 'stop_words' để đạt hiệu quả. –

+0

tôi nhận được NameError: ("tên 'từ' không được xác định", 'xảy ra tại chỉ mục Dữ liệu') khi tôi chạy nó – DataNewB

+0

@DataNewB xin lỗi nó phải là x – galaxyan

1

Bạn có thể xây dựng một mô hình regex các từ dừng của bạn và gọi vectorised str.replace để loại bỏ chúng:

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 

ở đây chúng tôi thực hiện một danh sách hiểu để xây dựng một mô hình xung quanh mỗi từ dừng với '\b' là thời gian nghỉ ngơi và sau đó chúng tôi or tất cả các từ sử dụng '|'

1

Hai vấn đề:

Trước tiên, bạn có mô-đun được gọi là stop_words và sau đó bạn tạo biến có tên stop_words. Đây là hình thức xấu.

Thứ hai, bạn đang chuyển hàm lambda tới .apply muốn tham số x là danh sách chứ không phải giá trị trong danh sách.

Tức là, thay vì làm df.apply(sqrt) bạn đang thực hiện df.apply(lambda x: [sqrt(val) for val in x]).

Bạn có thể phải làm danh sách, chế biến cho mình:

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

Hoặc bạn nên làm như áp dụng, với một hàm mang theo một chữ tại một thời điểm:

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

Như @ Jean- François Fabre đã đề xuất trong nhận xét, bạn có thể tăng tốc mọi thứ nếu stop_words của bạn là tập hợp thay vì danh sách:

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 '') 
Các vấn đề liên quan