4

이 텍스트 나에게 단어의 주파수를 제공합니다워드 주파수는

fullWords = re.findall(r'\w+', allText) 

d = defaultdict(int) 

for word in fullWords : 
      d[word] += 1 

finalFreq = sorted(d.iteritems(), key = operator.itemgetter(1), reverse=True) 

self.response.out.write(finalFreq) 

를 이것은 또한 "는" "는" "A"

을 같이 나에게 쓸모없는 단어를 제공합니다

제 질문은,이 모든 일반적인 단어를 제거 할 수있는 파이썬으로 사용할 수있는 정지 단어 라이브러리가 있습니까? 나는 구글 앱 엔진이 실행

+1

또는 http://stackoverflow.com/questions/3169051에서 경쟁 하시겠습니까? –

답변

5

불용어 목록을 다양한 형식의 파일로 다운로드 할 수 있습니다. here에서 - 파이썬이해야 할 일은 파일을 읽는 것입니다 (그리고 이것들은 csv 모듈로 쉽게 읽을 수있는 형식입니다). 세트를 만들고 그 세트의 멤버십을 사용합니다 카운트에서 단어를 제외합니다.

0
stopwords = set(['an', 'a', 'the']) # etc... 
finalFreq = sorted((k,v) for k,v in d.iteritems() if k not in stopwords, 
         key = operator.itemgetter(1), reverse=True) 

이것은 stopwords 세트에있는 모든 키를 걸러합니다.

+0

내 의견을 DavidZ의 대답을 참조하십시오, 당신의 문제는 똑같습니다. –

+0

정말 문제가 아닙니다. 성능이 현명합니다. 정규 표현식이 일치하는 각 단어에 대한 집합 조회를 위해 각 결과 키의 집합 조회를 거래하고 있습니다. 더 효율적인 것은 문제 집합의 매개 변수에 따라 달라집니다. 당신은 이미 출력을 위해 결과 키 세트를 반복하고 있습니다. 어쨌든, 필터링을위한 생성자 표현식은 많은 추가 오버 헤드를 필요로하지 않습니다. 추가리스트가 생성되지 않으며, dict가 수정되지 않습니다. 실제로는 "추출"하지 않고 정렬 된 목록으로 만들 수 없도록 필터링합니다. – Amber

3

약간 당신이 가지고있는 코드를 수정하여이 문제를 해결할 수있는 가장 쉬운 방법이있다 (요한의 의견을 반영하기 위해 편집) :

stopWords = set(['a', 'an', 'the', ...]) 
fullWords = re.findall(r'\w+', allText) 
d = defaultdict(int) 
for word in fullWords: 
    if word not in stopWords: 
     d[word] += 1 
finalFreq = sorted(d.iteritems(), key=lambda t: t[1], reverse=True) 
self.response.out.write(finalFreq) 

이러한 접근 방식은 두 단계의 정렬 된 목록을 구성 : 먼저이에 단어를 필터링 원하는 "중지 단어"목록 (효율성을 위해 set으로 변환 됨)은 나머지 항목을 정렬합니다.

+2

Ummmm : 스톱 워드를 삽입 한 다음 다시 스팸을 제거하는 이유는 무엇입니까? 해결할 두 줄 :'stopwords에없는 단어 인 경우 : d [word] + = 1' 다음에 간단한 'finalFreq = d.items()'가 있습니다. –

+0

@ 존 : 나는 그것을 놓쳤습니다. 불용어의 수는 한정되어 있기 때문에 그렇게 큰 문제는 아닙니다. –

+0

최근 편집 :'[]'('sorted()'는 반복 가능)을 필요로하지 않으며,'(k, v)의 k, d.iteritems()'의 v는'd '입니다. iteritems()' –

2

NLTK에는 영어가 포함 된 여러 언어의 중지 단어가 포함되어 있습니다. 자세한 내용은 here을 참조하십시오. NLTK는 또한 단어 빈도 카운터를 가지고 있습니다. 자연어 처리를위한 훌륭한 모듈로서 사용을 고려해야합니다.