2016-09-19 71 views
0

我有一個文件包含許多波斯語句子。每行包含一個句子,然後是一個「標籤」,然後是一個詞,再次是一個「標籤」,然後是一個英文單詞。我必須知道句子中唯一字的數量(標籤後面的單詞不應該在計算中)。爲此,我將文件更改爲列表,所以我有一個包含大量行的列表,每行包含三個索引;句子,波斯詞,英語單詞。現在我可以達到這些句子。問題是,我寫的代碼分別返回每行獨特字的數量。例如,如果文件有100行,它會返回100個數字,每個數字都在一個新行中。但我想要所有數字的總和,並且只有一個數字表示唯一字的總數。我如何更改代碼?計算列表第一列的唯一字的總數

from hazm import* 

def WordsProbs (file): 
    with open (file, encoding = "utf-8") as f1: 
     normalizer = Normalizer() 
     for line in f1: 
     tmp = line.strip().split("\t") 
     tmp[0] = normalizer.normalize(tmp[0]) 
     corpus.append(tmp) 
    for row in corpus: 
     UniqueWords = len(set(row[0].split())) 
     print (UniqueWords) 

的樣品數據:

بادبارشبرفوزشباد,کولاکیخبندانسطح風

+0

你只在句子上應用'Normalizer'嗎? – Kasramvd

+0

是的。因爲我從一個非常大的語料庫中提取它們。但是我標出了自己的標籤。所以只是句子需要規範化 – Vahideh

+0

所以還有一個問題,這個模塊有沒有任何機會可以使用word_tokenizer函數?像NLTK – Kasramvd

回答

0

假設TMP [0]包含來自每行中的句子,在句子的各個單詞可以在不建立一個語料庫進行計數。

from hazm import* 

def WordsProbs (file): 
    words = set() 
    with open (file, encoding = "utf-8") as f1: 
     normalizer = Normalizer() 
     for line in f1: 
      tmp = line.strip().split("\t") 
      words.update(set(normalizer.normalize(tmp[0].split()))) 
    print(len(words), "unique words") 

我無法測試它,因爲我的機器上,英文單詞「風」剪切和粘貼示例數據後,顯示出來的第一列。

+0

我知道分割tmp [0]是很重要的,但是當我運行代碼時,會發生下面的錯誤。 – Vahideh

+0

AttributeError:'list'對象沒有屬性'translate' >>> – Vahideh

+0

https://www.dropbox.com/s/r88hglemg7aot0w/F.txt?dl=0 – Vahideh

1

有一個簡單的解決方案。正如你所說,你有行列表。所以下面的代碼應該得到你想要的

sample_data = """This is One sentence word1 word2 
This is Second sentence word1 word2""" 
lines = sample_data.split("\n") 
word_list = [] 
for line in lines: 
    line = line.split("\t")[0] 
    word_list.extend(line.split(" ")) 
print len(set(word_list)) 
+0

AttributeError:'list'對象沒有屬性'split'。發生此錯誤 – Vahideh

+0

列表中沒有拆分對象,但是如果您的數據如您所描述的那樣應該是字符串類型。 –

+0

'len(set(word_list))'只會返回每行中包含唯一字的集合的數量,這不是OP的意圖。 – Kasramvd

0

你是按順序拆分後算話的人數使用collections.Counter

from collections import Counter 
from itertools import chain 

def WordsProbs (file_name): 
    with open (file_name, encoding = "utf-8") as f1: 
     all_words = chain.from_iterable(word_tokenizer(line.split(None, 1)[0]) for line in f1) 
     return Counter(all_words) 

chain.from_iterable意志鏈分裂詞放在一起作爲一個整體迭代器,以便Counter可以從所有單詞創建一個計數器對象。

如果你只是希望所有的獨特單詞數len(WordsProbs(file_name))會給你,但另一種方法是使用上,我們與cahin.from_iterable創建的迭代器設置:

def WordsProbs (file_name): 
    with open (file_name, encoding = "utf-8") as f1: 
     all_words = chain.from_iterable(word_tokenizer(line.split(None, 1)[0]) for line in f1) 
     return len(set(all_words)) 

如果你想要的號碼每行的唯一字:

def WordsProbs (file_name): 
    with open (file_name, encoding = "utf-8") as f1: 
     each_line_numbers = [len(set(word_tokenizer(line.split(None, 1)[0]))) for line in f1) 
     return each_line_numbers 
+0

謝謝,但出現此錯誤:NameError:名字「線」沒有定義 – Vahideh

+0

@suneye有一個簡單的拼寫錯誤,現在就來試試吧。 – Kasramvd

+0

那麼它將返回:計數器({ 'باد':1, 'غرقش':1, 'کاش':1, 'مناطق':1, 'حیف':1, 'کار':1, 'افزایش':1, 'پایان':1, 'تهران':1, 'مجبورم':1, 'الان':1, 'رطوبتهای':1, – Vahideh

相關問題