Попытка сравнить два текстовых файла в кодировке UTF-8, чтобы найти и посчитать похожие слова - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу сравнить два текстовых файла в кодировке 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 голосов
/ 02 апреля 2019

Вы пытаетесь получить два значения из 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)
...