我有一个由许多波斯语句子组成的文件。每行包含一个句子,然后是一个“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
答案 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”。