尝试比较两个采用UTF-8编码的文本文件,以查找和计算相似的单词

时间:2019-04-01 03:25:21

标签: python utf-8 file-handling

我想比较两个采用UTF-8编码的文本文件,文件1是单词词典,文件2包含句子。我想找出文件1和文件2中存在的相似词语。

import codecs
f1 = codecs.open('poswords.txt', 'r', 'UTF-8')
for line in f1:
    print(line)
f2 = codecs.open('0001b.txt', 'r', 'UTF-8')
words=set(line.strip() for line in f1)
for line in f2:
    word,freq =line.split()
    if word in words:
        print (word)

文件1(即字典)包含

کرخت
ناجائز فائدہ
آب دیدہ
ابال
ابال کر پکانا
**ابالنا**
ابتدائ
ابتر

文件2包含一个句子:

وفاقی وزیر اطلاعات فواد چودھری سے استعفیٰ لے لیا**ابالنا** گیا ہے

我要在两个文件中找到它们并计算它们的出现,这两个词很常见。 我希望它应该返回类似的单词,但是它返回一个错误,指出ValueError:太多值无法解包(预期2)

1 个答案:

答案 0 :(得分:0)

您正在尝试从split中检索两个值:

word, freq = line.split()

这仅在一行上刚好有两个词时才起作用(通过变量命名,第二个词显然应该是频率计数)。

另一个问题是,print占用了第一个文件中的所有行。一旦从句柄中读取了所有行,尝试读取更多行将仅不返回任何内容。简单的解决方法是将每个输入字打印并保存到同一循环内设置的words中。 (也许实际上注释掉print()import logging并将其更改为logging.debug()。这还可以确保诊断输出不会与程序的常规标准输出混合在一起。)

在Python 3中,UTF-8应该是大多数理智平台上的默认编码(尽管这明显且着重排除了Windows);也许您根本不需要显式的codecs

最后,您应该知道Unicode通常可以以多种方式表示相同的字符串。我不会读阿拉伯语,但是例如,您可以简单地将“ salaam”写为单个字形U+FDF5或将其拼写出来。 Unicode规范化试图消除所有此类皱纹,因此您可以确保显示相同内容的文本也写成相同的文字,从而与Python的字符串比较运算符相同。

import codecs
import unicodedata

with codecs.open('poswords.txt', 'r', 'UTF-8') as f1:
    words = set()
    for line in f1:
        print(line)
        words.add(unicodedata.normalize('NFC', line.strip()))

with codecs.open('0001b.txt', 'r', 'UTF-8') as f2:
    for line in f2:
        for word in line.split():
            if unicodedata.normalize('NFC', word) in words:
                print (word)