Cách xóa các từ dừng bằng nltk hoặc python


110

Vì vậy, tôi có một tập dữ liệu mà tôi muốn xóa các từ dừng sử dụng

stopwords.words('english')

Tôi đang đấu tranh làm cách nào để sử dụng điều này trong mã của mình để chỉ đơn giản là lấy ra những từ này. Tôi đã có một danh sách các từ trong tập dữ liệu này rồi, phần tôi đang đấu tranh là so sánh với danh sách này và loại bỏ các từ dừng. Bất kỳ trợ giúp được đánh giá cao.


4
Bạn lấy từ dừng ở đâu? Đây có phải là từ NLTK không?
tumultous_rooster

37
@ MattO'Brien from nltk.corpus import stopwordscho những người dùng google trong tương lai
danodonovan

13
Nó cũng cần thiết để chạy nltk.download("stopwords")để cung cấp từ điển từ khóa.
sffc


1
Hãy chú ý rằng một từ như "not" cũng được coi là một từ dừng trong nltk. Nếu bạn làm điều gì đó như phân tích tình cảm, lọc thư rác, một phủ định có thể thay đổi toàn bộ ý nghĩa của câu và nếu bạn xóa nó khỏi giai đoạn xử lý, bạn có thể không nhận được kết quả chính xác.
Darkov

Câu trả lời:


206
from nltk.corpus import stopwords
# ...
filtered_words = [word for word in word_list if word not in stopwords.words('english')]

Nhờ cả hai câu trả lời, chúng đều hoạt động mặc dù có vẻ như tôi có một lỗ hổng trong mã của mình khiến danh sách dừng hoạt động chính xác. Đây có nên là một bài đăng câu hỏi mới không? không chắc mọi thứ hoạt động xung quanh đây như thế nào!
Alex

51
Để cải thiện hiệu suất, hãy xem xét stops = set(stopwords.words("english"))thay thế.
isakkarlsson

1
>>> import nltk >>> nltk.download () Nguồn

2
stopwords.words('english')là chữ thường. Vì vậy, hãy chắc chắn để sử dụng các từ trường hợp duy nhất thấp hơn trong danh sách ví dụ[w.lower() for w in word_list]
AlexG

19

Bạn cũng có thể thực hiện một bộ khác biệt, ví dụ:

list(set(nltk.regexp_tokenize(sentence, pattern, gaps=True)) - set(nltk.corpus.stopwords.words('english')))

15
Lưu ý: điều này chuyển đổi câu thành SET để loại bỏ tất cả các từ trùng lặp và do đó bạn sẽ không thể sử dụng tính năng đếm tần suất trên kết quả
David Dehghan 21/02/17

chuyển đổi thành một tập hợp có thể loại bỏ thông tin khả thi khỏi câu bằng cách loại bỏ nhiều lần xuất hiện của một từ quan trọng.
Ujjwal

14

Tôi cho rằng bạn có một danh sách các từ (word_list) mà bạn muốn xóa từ dừng. Bạn có thể làm điều gì đó như sau:

filtered_word_list = word_list[:] #make a copy of the word_list
for word in word_list: # iterate over word_list
  if word in stopwords.words('english'): 
    filtered_word_list.remove(word) # remove word from filtered_word_list if it is a stopword

5
đây sẽ là một toàn bộ rất nhiều chậm hơn so với danh sách hiểu Daren Thomas ...
drevicko

12

Để loại trừ tất cả các loại từ dừng bao gồm nltk từ dừng, bạn có thể làm như sau:

from stop_words import get_stop_words
from nltk.corpus import stopwords

stop_words = list(get_stop_words('en'))         #About 900 stopwords
nltk_words = list(stopwords.words('english')) #About 150 stopwords
stop_words.extend(nltk_words)

output = [w for w in word_list if not w in stop_words]

Tôi nhận được len(get_stop_words('en')) == 174vslen(stopwords.words('english')) == 179
rubencart

6

Có một gói mỡ trăn nhẹ rất đơn giản stop-wordschỉ dành cho mục đích này.

Fist cài đặt gói bằng cách sử dụng: pip install stop-words

Sau đó, bạn có thể xóa các từ của mình trong một dòng bằng cách sử dụng khả năng hiểu danh sách:

from stop_words import get_stop_words

filtered_words = [word for word in dataset if word not in get_stop_words('english')]

Gói này rất nhẹ để tải xuống (không giống như nltk), hoạt động cho cả Python 2Python 3và nó có các từ dừng cho nhiều ngôn ngữ khác như:

    Arabic
    Bulgarian
    Catalan
    Czech
    Danish
    Dutch
    English
    Finnish
    French
    German
    Hungarian
    Indonesian
    Italian
    Norwegian
    Polish
    Portuguese
    Romanian
    Russian
    Spanish
    Swedish
    Turkish
    Ukrainian

3

Sử dụng thư viện textcleaner để xóa các từ dừng khỏi dữ liệu của bạn.

Theo liên kết này: https://yugantm.github.io/textcleaner/documentation.html#remove_stpwrds

Làm theo các bước sau để làm như vậy với thư viện này.

pip install textcleaner

Sau khi cài đặt:

import textcleaner as tc
data = tc.document(<file_name>) 
#you can also pass list of sentences to the document class constructor.
data.remove_stpwrds() #inplace is set to False by default

Sử dụng mã trên để loại bỏ các từ dừng.


1

bạn có thể sử dụng chức năng này, bạn nên lưu ý rằng bạn cần phải hạ thấp tất cả các từ

from nltk.corpus import stopwords

def remove_stopwords(word_list):
        processed_word_list = []
        for word in word_list:
            word = word.lower() # in case they arenet all lower cased
            if word not in stopwords.words("english"):
                processed_word_list.append(word)
        return processed_word_list

1

sử dụng bộ lọc :

from nltk.corpus import stopwords
# ...  
filtered_words = list(filter(lambda word: word not in stopwords.words('english'), word_list))

3
nếu word_listlớn, mã này rất chậm. Nó là tốt hơn để chuyển đổi danh sách các tệp từ dừng một tập hợp trước khi sử dụng nó: .. in set(stopwords.words('english')).
Robert

1

Đây là ý kiến ​​của tôi về vấn đề này, trong trường hợp bạn muốn ngay lập tức nhận được câu trả lời thành một chuỗi (thay vì danh sách các từ đã lọc):

STOPWORDS = set(stopwords.words('english'))
text =  ' '.join([word for word in text.split() if word not in STOPWORDS]) # delete stopwords from text

Không sử dụng phương pháp này bằng tiếng Pháp, nếu không sẽ không bị bắt.
David Beauchemin

0

Trong trường hợp dữ liệu của bạn được lưu trữ dưới dạng a Pandas DataFrame, bạn có thể sử dụng remove_stopwordstừ textero sử dụng danh sách từ dừng NLTK theo mặc định .

import pandas as pd
import texthero as hero
df['text_without_stopwords'] = hero.remove_stopwords(df['text'])

0
from nltk.corpus import stopwords 

from nltk.tokenize import word_tokenize 

example_sent = "This is a sample sentence, showing off the stop words filtration."

  
stop_words = set(stopwords.words('english')) 
  
word_tokens = word_tokenize(example_sent) 
  
filtered_sentence = [w for w in word_tokens if not w in stop_words] 
  
filtered_sentence = [] 
  
for w in word_tokens: 
    if w not in stop_words: 
        filtered_sentence.append(w) 
  
print(word_tokens) 
print(filtered_sentence) 

-3
   import sys
print ("enter the string from which you want to remove list of stop words")
userstring = input().split(" ")
list =["a","an","the","in"]
another_list = []
for x in userstring:
    if x not in list:           # comparing from the list and removing it
        another_list.append(x)  # it is also possible to use .remove
for x in another_list:
     print(x,end=' ')

   # 2) if you want to use .remove more preferred code
    import sys
    print ("enter the string from which you want to remove list of stop words")
    userstring = input().split(" ")
    list =["a","an","the","in"]
    another_list = []
    for x in userstring:
        if x in list:           
            userstring.remove(x)  
    for x in userstring:           
        print(x,end = ' ') 
    #the code will be like this

tốt nhất là thêm stopwords.words ("tiếng anh") hơn là chỉ định mọi từ bạn cần xóa.
Được dẫn vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.