2016-10-12 2 views
2

현재 내 텍스트 처리 전체에 대해 bigram 검색을 위해이 코드를 실행 중입니다.Bigram을 발생 횟수로 정렬 NLTK

변수 alltext 내가 할 수 bigrams에 대한 주파수 발생에 대한 검색 위에

from nltk.tokenize import RegexpTokenizer 
from nltk.corpus import stopwords 
import re 



tokenizer = RegexpTokenizer(r'([A-za-z]{2,})') 
tokens = tokenizer.tokenize(alltext) 
stopwords_list = stopwords.words('english') 
tokens = [word for word in tokens if word not in stopwords.words('english')] 
finder = BigramCollocationFinder.from_words(tokens, window_size = 2) 
bigram_measures = nltk.collocations.BigramAssocMeasures() 

for k,v in finder.ngram_fd.items(): 
    print k,v 

코드를 음절 추출이 코드를 실행 정말 긴 텍스트 (100 만 단어 이상)

입니다.

이 코드는 bigrams와 그 발생 횟수를 많이 출력합니다.

출력은 이와 유사합니다.

(('upper', 'front'), 1) 
(('pad', 'Teething'), 1) 
(('shoulder', 'strap'), 1) 
(('outer', 'breathable'), 1) 
(('memory', 'foam'), 1) 
(('shields', 'inner'), 1) 
(('The', 'garment'), 2) 
...... 

type(finder.ngram_fd.items()) is a list. 

빈도를 가장 높은 순서에서 가장 낮은 순서로 정렬 할 수 있습니까? 내 욕망 결과가 될 것입니다.

(('The', 'garment'), 2) 
(('upper', 'front'), 1) 
(('pad', 'Teething'), 1) 
(('shoulder', 'strap'), 1) 
(('outer', 'breathable'), 1) 
(('memory', 'foam'), 1) 
(('shields', 'inner'), 1) 

대단히 감사합니다. nltk 및 텍스트 처리가 새로 도입되어 설명이 명확하지 않을 수 있습니다.

+0

사용', V :

양자 택일로, 당신은 같은 일을 operator.itemgetter 모듈과 람다를 대체 할 수 t을 [-1], reverse = True) ' –

답변

3

finder.ngram_fd은 사전입니다. 이 경우 Python 3에서 items() 메서드는 목록을 반환하지 않으므로이 메서드를 캐스팅해야합니다.

당신이 목록을 갖게되면, 당신은 단순히 우리가에 대해 정렬하는지 지정되는 sort() 방법의 key= 매개 변수를 사용할 수 있습니다 : 당신은 그렇지 않으면 결과가 될 것이기 때문에 reverse=True을 추가해야

ngram = list(finder.ngram_fd.items()) 
ngram.sort(key=lambda item: item[-1], reverse=True) 

오름차순. 그러면 목록 에 정렬됩니다. 이는 복사를 피할 때 가장 좋습니다. 대신 새 목록을 얻으려는 경우 동일한 인수를 사용하여 sorted() 내장 함수를 사용하십시오. 분류 (finder.ngram_fd.items(), 키 = 람다 t에서 k에 대한

ngram.sort(key=operator.itemgetter(-1), reverse=True) 
+0

대단히 감사합니다! –