2014-02-20 2 views
0

필자는 CS 클래스에서 셰익스피어의 연극과 소네트의 전체 코퍼스를 읽고 특정 단어가 나오는 횟수를 프린트하는 작업을했습니다. 아무도 내가 이걸 가지고 발을 뺄 수있게 도와 줄 수 있니? 다음은 제가 주어진 단계별 상세 검색의 첫 단계입니다.파일 토큰 화하기

레벨 0 파일 토큰 화 기능을 정의하여 토큰 배열을 반환합니다. 배열을 반복하면서 한 줄에 하나씩 각 토큰을 인쇄하십시오. 내가 파일을 토큰 화하고 파이썬에 배열로 읽어 어떻게 내 진짜 질문은 생각

def main(): 
    tokens = readTokens("shakespeare.txt") 
    for i in range(0,len(tokens),1): 
     print(tokens[i]) 

: 예를 들어, 전문의 주요 이렇게 뭔가를 조회 할 수 있습니다? 죄송합니다. 이런 종류의 질문이이 웹 사이트가 아니라면, 저는 약간의 도움을 찾고 있습니다. 감사.

+0

귀하의 질문이 너무 광범위합니다. 시도한 것과 뭘하지 않았는지/부분적으로 효과가있는 것을 제공하면 도움을받을 가능성이 더 커집니다. –

+2

"토큰"을 어떻게 정의합니까? – poke

답변

2
goodletters = set("abcdefghijklmnopqrstuvwxyz' \t") 

def tokenize_file(fname): 
    tokens = [] 
    with open(fname) as inf: 
     for line in inf: 
      clean = ''.join(ch for ch in line.lower() if ch in goodletters) 
      tokens.extend(clean.split()) 
    return tokens 

명확성을 기하기 위해 다음과 같이 쓰여 있습니다. 프로덕션에서는 inf.read().translate()을 사용 하겠지만 파이썬 2.x와 3.x에서는 그 설정이 크게 다르며 필요한 것보다 더 혼란스럽지 않으려합니다.

+0

+1 TIL 'goodletters'의 사용;) – zhangxaochen

0
from collections import Counter 

def readTokens(file): 
    tokens = Counter() 
    with open(file) as f: 
     for line in f: 
      tokens += Counter(word.strip() for word in line.split()) 
      # if you're trying to count "Won't", "won't", and "won't!" 
      # all together, do this instead: 
      ## tokens += Counter(word.strip('"!?,.;:').casefold() for word in line.split()) 
    return tokens 

def main(): 
    tokens = readTokens('shakespeare.txt') 
    for token in tokens: 
     print(token) 
    print("The most commonly used word is {}".format(max(tokens.items(), key= 
                lambda x: x[1]))) 
+0

카운터의 사용은 훌륭하지만, "will not", "will not", "will not"과 같이 계산됩니다. 별도의 단어로 (구두점을 제거하거나 대문자를 표준화하지 않음). –

+0

@HughBothwell OP의 더 많은 정보가 없으면 그가 그것을 원하고 있는지 여부를 말하기 어렵습니다. 맨손으로 뼈를 구현했지만 추가 입력없이 입력 텍스트를 제거하는 것이 싫은 경우. –

+0

@HughBothwell 말하길, 당신의'goodletters' 구현은 훌륭하다고 생각합니다! 나는 그것을 훔친 것으로 생각했다;). 어쩌면 우리는 답을 결합해야합니까? –

관련 문제