2016-09-19 69 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