2017-05-16 24 views
0

단어 목록의 모든 단어가 대화에서 발견되는 횟수를 찾고 있습니다. 각 단어의 개별 빈도를 고려하지 않고 전체 카운트 만 고려합니다. 단어 목록은 uptill 3Python : 텍스트 대화에서 [n-grams가있는] 단어 목록을 찾는 가장 빠른 방법

from nltk.util import ngrams 
find = ['car', 'motor cycle', 'heavy traffic vehicle'] 
data = pd.read_csv('inputdata.csv') 
def count_words(doc, find): 
    onegram = [' '.join(grams) for grams in ngrams(doc.split(), 1)] 
    bigrams = [' '.join(grams) for grams in ngrams(doc.split(), 2)] 
    trigrams = [' '.join(grams) for grams in ngrams(doc.split(), 3)] 
    n_gram = onegrams + bigrams + trigrams 
    ''' get count of unique bag of words present in doc ''' 
    lst = ".".join([i for i in find if i in n_gram]) 
    cnt = np.count_nonzero(np.unique(lst.split("."))) 
    return cnt 
result = data['text'].apply(lambda x: count_words(x, find)) 

이 단계는 매우 과정이 무거운 대형 데이터 세트의 경우에 실행하는 데 시간이 오래 걸릴 ngrams이 포함되어 있습니다. 현재 접근법을 최적화하는 옵션은 무엇입니까? 아니면 다른 대안 단계가 있습니까?

답변

0

먼저 번을 번으로 분할하십시오 (각 통화에서 3 번이 아닌).

def count_words(doc, find): 
    word_list = doc.split() 
    onegram = [' '.join(grams) for grams in ngrams(word_list, 1)] 
    ... 

둘째, 당신은 컬렉션을 Counter 클래스를 사용하여 잘 셀 수 있습니다. 그렇다면 계산은 당신의 코드에서 사소하고 파이썬만큼 빠릅니다.