วิธีลบคำหยุดโดยใช้ nltk หรือ python


110

ดังนั้นฉันจึงมีชุดข้อมูลที่ฉันต้องการลบคำหยุดไม่ให้ใช้

stopwords.words('english')

ฉันกำลังดิ้นรนที่จะใช้สิ่งนี้ภายในรหัสของฉันเพื่อเพียงแค่เอาคำเหล่านี้ ฉันมีรายการคำจากชุดข้อมูลนี้อยู่แล้วส่วนที่ฉันกำลังดิ้นรนคือการเปรียบเทียบกับรายการนี้และลบคำหยุด ขอความช่วยเหลือใด ๆ


4
คุณได้คำหยุดจากที่ไหน นี่มาจาก NLTK หรือเปล่า?
tumultous_rooster

37
@ MattO'Brien from nltk.corpus import stopwordsสำหรับGoogler ในอนาคต
danodonovan

13
นอกจากนี้ยังจำเป็นต้องเรียกใช้nltk.download("stopwords")เพื่อให้พจนานุกรมคำหยุดพร้อมใช้งาน
sffc


1
โปรดทราบว่าคำอย่าง "not" ถือเป็นคำหยุดใน nltk ด้วย หากคุณทำบางอย่างเช่นการวิเคราะห์ความรู้สึกการกรองสแปมการปฏิเสธอาจเปลี่ยนความหมายทั้งหมดของประโยคและหากคุณลบออกจากขั้นตอนการประมวลผลคุณอาจไม่ได้ผลลัพธ์ที่ถูกต้อง
Darkov

คำตอบ:


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

ขอบคุณสำหรับคำตอบทั้งสองคำทั้งสองใช้งานได้แม้ว่าดูเหมือนว่าฉันจะมีข้อบกพร่องในรหัสที่ทำให้รายการหยุดทำงานไม่ถูกต้อง นี่ควรเป็นกระทู้คำถามใหม่หรือไม่? ยังไม่แน่ใจว่าสิ่งต่างๆที่นี่เป็นอย่างไร!
Alex

51
หากต้องการปรับปรุงประสิทธิภาพให้พิจารณาstops = set(stopwords.words("english"))แทน
isakkarlsson

1
>>> import nltk >>> nltk.download () ที่มา

2
stopwords.words('english')เป็นตัวพิมพ์เล็ก ดังนั้นอย่าลืมใช้เฉพาะคำตัวพิมพ์เล็กในรายการเช่น[w.lower() for w in word_list]
AlexG

19

คุณยังสามารถตั้งค่าความแตกต่างได้เช่น:

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

16
หมายเหตุ: สิ่งนี้จะแปลงประโยคเป็น SET ซึ่งจะลบคำที่ซ้ำกันทั้งหมดดังนั้นคุณจะไม่สามารถใช้ความถี่ในการนับผลลัพธ์ได้
David Dehghan

1
การแปลงเป็นชุดอาจลบข้อมูลที่เป็นประโยชน์ออกจากประโยคโดยการขูดคำสำคัญหลาย ๆ คำ
Ujjwal

14

ฉันคิดว่าคุณมีรายการคำ (word_list) ที่คุณต้องการลบคำหยุด คุณสามารถทำสิ่งนี้:

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
นี่จะช้ากว่าความเข้าใจในรายการของ Daren Thomas อย่างมาก ...
drevicko

12

หากต้องการยกเว้นคำหยุดทุกประเภทรวมถึงคำหยุด nltk คุณสามารถทำสิ่งนี้ได้:

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]

ฉันได้รับlen(get_stop_words('en')) == 174vslen(stopwords.words('english')) == 179
rubencart

6

มีแพ็คเกจ python น้ำหนักเบาที่เรียบง่ายมากstop-wordsเพื่อประโยชน์นี้

กำปั้นติดตั้งแพ็คเกจโดยใช้: pip install stop-words

จากนั้นคุณสามารถลบคำของคุณในหนึ่งบรรทัดโดยใช้ความเข้าใจรายการ:

from stop_words import get_stop_words

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

แพคเกจนี้มีน้ำหนักเบามากในการดาวน์โหลด (ไม่เหมือน nltk) ใช้งานได้ทั้งPython 2และPython 3และมีคำหยุดสำหรับภาษาอื่น ๆ เช่น:

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

3

ใช้ไลบรารีtextcleanerเพื่อลบคำหยุดออกจากข้อมูลของคุณ

ตามลิงค์นี้: https://yugantm.github.io/textcleaner/documentation.html#remove_stpwrds

ทำตามขั้นตอนเหล่านี้เพื่อดำเนินการกับไลบรารีนี้

pip install textcleaner

หลังจากติดตั้ง:

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

ใช้รหัสด้านบนเพื่อลบคำหยุด


2

ใช้ตัวกรอง :

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

3
ถ้าword_listมีขนาดใหญ่รหัสนี้จะช้ามาก .. in set(stopwords.words('english'))มันจะดีกว่าที่จะแปลงคำหยุดรายการชุดก่อนที่จะใช้มัน
Robert

1

คุณสามารถใช้ฟังก์ชันนี้คุณควรสังเกตว่าคุณต้องลดคำทั้งหมดลง

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

นี่คือสิ่งที่ฉันใช้ในกรณีที่คุณต้องการรับคำตอบในสตริงทันที (แทนที่จะเป็นรายการคำที่กรอง):

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

อย่าใช้วิธีนี้ในภาษาฝรั่งเศสไม่เช่นนั้นจะไม่ถูกจับ
David Beauchemin

0

ในกรณีที่ข้อมูลของคุณจะถูกเก็บไว้เป็นPandas DataFrameคุณสามารถใช้remove_stopwordsจาก textero ที่ใช้รายการ NLTK คำหยุดโดยค่าเริ่มต้น

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

วิธีที่ดีที่สุดในการเพิ่ม stopwords.words ("ภาษาอังกฤษ") แทนที่จะระบุทุกคำที่คุณต้องการลบ
นำ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.