nltk 또는 python을 사용하여 불용어를 제거하는 방법


110

그래서 사용에서 불용어를 제거하고 싶은 데이터 세트가 있습니다.

stopwords.words('english')

나는 단순히이 단어를 제거하기 위해 코드 내에서 이것을 사용하는 방법에 어려움을 겪고 있습니다. 이 데이터 세트의 단어 목록이 이미 있습니다. 제가 고민하고있는 부분은이 목록과 비교하여 불용어를 제거하는 것입니다. 도움을 주시면 감사하겠습니다.


4
불용어는 어디서 얻었습니까? NLTK에서 온 건가요?
tumultous_rooster 2014

37
@ MattO'Brien from nltk.corpus import stopwordsfor future googlers
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')]

두 답변 덕분에 중지 목록이 올바르게 작동하지 못하게하는 코드에 결함이있는 것처럼 보이지만 둘 다 작동합니다. 새로운 질문 게시물이어야합니까? 아직 여기에서 어떻게 작동하는지 모르겠습니다!
알렉스

51
성능을 향상 시키려면 stops = set(stopwords.words("english"))대신 고려하십시오 .
isakkarlsson 2013 년

1
>>> import nltk >>> nltk.download () 소스

2
stopwords.words('english')소문자입니다. 따라서 목록에서 소문자 단어 만 사용하십시오. 예[w.lower() for w in word_list]
AlexG

19

예를 들어 다음과 같이 set diff를 수행 할 수도 있습니다.

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

15
참고 : 이것은 문장을 모든 중복 단어를 제거하는 SET로 변환하므로 결과에 대한 빈도 계산을 사용할 수 없습니다
David Dehghan

집합으로 변환하면 중요한 단어를 여러 번 긁어내어 문장에서 실행 가능한 정보를 제거 할 수 있습니다.
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
이 ... 다렌 토마스의 지능형리스트보다 느리게 훨씬 될 것입니다
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')) == 174대 받고 있어요len(stopwords.words('english')) == 179
rubencart

6

이를 위해 매우 간단한 경량 파이썬 패키지가 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

위의 코드를 사용하여 불용어를 제거하십시오.


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

필터 사용 :

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'))..
로버트

1

다음은 필터링 된 단어 목록 대신 문자열로 답을 즉시 얻고 자하는 경우에 대한 제 생각입니다.

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

프랑스어 l '에서이 접근 방식을 사용하지 마십시오. 그렇지 않으면 캡처되지 않습니다.
David Beauchemin

0

데이터가로 저장된 경우 기본적으로 NLTK 불용어 목록을 사용하는 textero에서 사용할 Pandas DataFrame수 있습니다 .remove_stopwords

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 ( "english")를 추가하는 것이 가장 좋습니다.
주도
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.