2014-02-20 24 views
0

在我的CS課程中,我已經完成了一項任務,可以讀取莎士比亞的劇本和十四行詩的整個語料庫,並打印特定單詞出現的次數。任何人都可以幫助我讓腳離開這個地方。這是我得到的逐步改進的第一級。Tokenizing一個文件

Level 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(),但是對於Python 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

使用計數器很好,但是這會計數,即「不會」,「不會」和「不會」。作爲單獨的詞語(它不去除標點或正常化大小寫)。 –

+0

@HughBothwell沒有來自OP的更多信息,很難說他是否願意。我實現了裸露的骨骼,但沒有進一步的輸入,我厭惡剝去輸入文本。 –

+0

@HughBothwell這就是說,我認爲你的'goodletters'實現很棒!我認爲偷了它;)。也許我們應該結合我們的答案? –