Cara menghapus kata berhenti menggunakan nltk atau python

110

Jadi saya memiliki kumpulan data yang ingin saya hapus kata-kata henti dari penggunaan

stopwords.words('english')

Saya berjuang bagaimana menggunakan ini dalam kode saya untuk hanya mengambil kata-kata ini. Saya sudah memiliki daftar kata-kata dari kumpulan data ini, bagian yang saya perjuangkan adalah membandingkan dengan daftar ini dan menghapus kata-kata berhenti. Bantuan apa pun dihargai.

Alex
sumber
4
Dari mana Anda mendapatkan stopwords? Apakah ini dari NLTK?
tumultous_rooster
37
@ MattO'Brien from nltk.corpus import stopwordsuntuk calon karyawan Google
danodonovan
13
Ini juga perlu dijalankan nltk.download("stopwords")agar kamus stopword tersedia.
sffc
1
Perhatikan bahwa kata seperti "tidak" juga dianggap sebagai stopword di nltk. Jika Anda melakukan sesuatu seperti analisis sentimen, pemfilteran spam, negasi dapat mengubah keseluruhan arti kalimat dan jika Anda menghapusnya dari tahap pemrosesan, Anda mungkin tidak mendapatkan hasil yang akurat.
Darkov

Jawaban:

206
from nltk.corpus import stopwords
# ...
filtered_words = [word for word in word_list if word not in stopwords.words('english')]
Daren Thomas
sumber
Berkat kedua jawaban, keduanya berfungsi meskipun tampaknya saya memiliki cacat dalam kode saya yang mencegah daftar berhenti berfungsi dengan benar. Haruskah ini menjadi postingan pertanyaan baru? belum yakin bagaimana hal-hal bekerja di sini!
Alex
51
Untuk meningkatkan kinerja, pertimbangkan stops = set(stopwords.words("english"))sebagai gantinya.
isakkarlsson
1
>>> impor nltk >>> nltk.download () Sumber
2
stopwords.words('english')adalah huruf kecil. Jadi pastikan untuk hanya menggunakan kata-kata dengan huruf kecil dalam daftar misalnya[w.lower() for w in word_list]
AlexG
19

Anda juga bisa melakukan set diff, misalnya:

list(set(nltk.regexp_tokenize(sentence, pattern, gaps=True)) - set(nltk.corpus.stopwords.words('english')))
David Lemphers
sumber
16
Catatan: ini mengubah kalimat menjadi SET yang menghapus semua kata duplikat dan oleh karena itu Anda tidak akan dapat menggunakan penghitungan frekuensi pada hasilnya
David Dehghan
1
mengonversi ke satu set mungkin menghapus informasi yang layak dari kalimat tersebut dengan menghilangkan beberapa kemunculan kata penting.
Ujjwal
14

Saya kira Anda memiliki daftar kata (word_list) yang ingin Anda hapus stopwordsnya. Anda bisa melakukan sesuatu seperti ini:

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
das_weezul
sumber
5
ini akan jauh lebih lambat daripada pemahaman daftar Daren Thomas ...
drevicko
12

Untuk mengecualikan semua jenis kata-kata penghenti termasuk kata-kata penghenti nltk, Anda dapat melakukan sesuatu seperti ini:

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]
sumitjainjr
sumber
Saya mendapatkan len(get_stop_words('en')) == 174vslen(stopwords.words('english')) == 179
rubencart
6

Ada paket python ringan yang sangat sederhana stop-wordshanya untuk kepentingan ini.

Pertama instal paket menggunakan: pip install stop-words

Kemudian Anda dapat menghapus kata-kata Anda dalam satu baris menggunakan pemahaman daftar:

from stop_words import get_stop_words

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

Paket ini sangat ringan untuk diunduh (tidak seperti nltk), berfungsi untuk Python 2dan Python 3, dan memiliki kata-kata penghenti untuk banyak bahasa lain seperti:

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

Gunakan pustaka textcleaner untuk menghapus stopwords dari data Anda.

Ikuti tautan ini: https://yugantm.github.io/textcleaner/documentation.html#remove_stpwrds

Ikuti langkah-langkah berikut untuk melakukannya dengan perpustakaan ini.

pip install textcleaner

Setelah menginstal:

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

Gunakan kode di atas untuk menghapus kata-kata penghenti.

Yugant Hadiyal
sumber
1

Anda dapat menggunakan fungsi ini, Anda harus memperhatikan bahwa Anda perlu menurunkan semua kata

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
Mohammed_Ashour
sumber
1

menggunakan filter :

from nltk.corpus import stopwords
# ...  
filtered_words = list(filter(lambda word: word not in stopwords.words('english'), word_list))
Saeid BK
sumber
3
jika word_listbesar kode ini sangat lambat. Lebih baik untuk mengkonversi daftar stopwords untuk set sebelum menggunakannya: .. in set(stopwords.words('english')).
Robert
1

Inilah pendapat saya tentang ini, jika Anda ingin segera mendapatkan jawaban menjadi string (bukan daftar kata yang difilter):

STOPWORDS = set(stopwords.words('english'))
text =  ' '.join([word for word in text.split() if word not in STOPWORDS]) # delete stopwords from text
justadev
sumber
Jangan gunakan pendekatan ini dalam bahasa Prancis l 'atau tidak akan tertangkap.
David Beauchemin
0

Jika data Anda disimpan sebagai Pandas DataFrame, Anda dapat menggunakan remove_stopwordsdari textero yang menggunakan daftar stopwords NLTK secara default .

import pandas as pd
import texthero as hero
df['text_without_stopwords'] = hero.remove_stopwords(df['text'])
Jonathan Besomi
sumber
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) 
HM
sumber
-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
Muhammad Yusuf
sumber
yang terbaik adalah menambahkan stopwords.words ("english") daripada menentukan setiap kata yang perlu Anda hapus.
Memimpin