计算列表第一列的uniqe单词的总数

时间:2016-09-19 19:12:00

标签: python nlp

我有一个由许多波斯语句子组成的文件。每行包含一个句子,然后是一个“tab”,然后是一个单词,再一个是“tab”,然后是一个英文单词。我必须知道句子中唯一单词的数量(标签后面的单词不应该在计算中)。为此,我将文件更改为列表,因此我有一个包含大量行的列表,每行包含三个索引;句子,波斯语,英语单词。现在我可以完成句子了。问题是,我写的代码分别返回每行的唯一字数。例如,如果文件有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)

样本数据:

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

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

您使用Espresso.closeSoftKeyboard()来计算拆分后的字数:

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))

答案 2 :(得分: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")

我无法测试它,因为在我的机器上,在剪切和粘贴样本数据后,第一列显示英文单词“wind”。