2013-11-05 2 views
1

파이썬 2.7을 사용하고 있습니다. 중국어로 단어의 빈도를 세고 싶습니다. 어떻게 토큰 화 된 목록을 사용하여이 작업을 수행 할 수 있습니까? 다음 단계에서 문장의 위치를 ​​찾고 싶습니다. 자, 바라건대, 나는 단어의 빈도를 세고, 또한 나에게 같은 단어의 각 단어의 시작점과 끝점을 주었다.토큰 화 된 목록에서 중국어 단어 빈도를 계산하는 방법은 무엇입니까?

입력 파일에서 단어 토큰을 계산하려고했는데 토큰 화와 관련이 없습니다. 그러나 그것은 또한 저에게 잘못된 결과를줍니다. ({u는 'u7684을 \': 1}) 카운터 : 카운터 파트에 , 그것은 나에게 이것을 보여줍니다,하지만 내 예상 된 결과가 카운터입니다 ({ '的': 27})

#coding=UTF-8 
userinput = raw_input('Enter the name of a file') 
import codecs 
f= codecs.open(userinput,"r","UTF-8") 
str=f.read() 
f.close() 
import jieba 
result=jieba.tokenize(str) 
for tk in result: 
     print "word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]) 
from collections import Counter 
with open(userinput) as inf: 
cnt = Counter() 
for word in [u'的']: 
    cnt[word] += 1 
print (cnt) 

답변

2

이 아니다 수정 :

for word in [u'的']: 
    cnt[word] += 1 

을 당신은 파일의 단어를 통해 루프를 실행해야합니다

for word in open(userinput,'r').read().split(): 
    cnt[word] += 1 
0
for word in [u'的']: 
    cnt[word] += 1 

이 전체입니다 귀하의 축적 루프의 티. 한글 문자u'的'을 루핑합니다. 나는 그것이 당신이하고 싶은 것이 아니라고 생각합니다.

Counter은 iterable을 피드 할 때 가장 잘 작동합니다. 이 cnt += 1 물건을 잊어 버리면 느려지고 카운터를 defaultdict처럼 처리하십시오. 한 번에 전체 반복 가능 피드 :

cnt = Counter(inf.read().split()) 

불필요하게이 파일을 다시 여는 것처럼 보입니다. 위의 내용을 이미 result으로 토큰 화 했으므로 다음을 고려하십시오.

cnt = Counter(tk[0] for tk in result) 
관련 문제