尝试比较2个大文件的行并保持匹配的行,但没有匹配

时间:2018-05-09 22:10:33

标签: python python-3.x

我有一个语音识别引擎的字典文件,我正在尝试减小它的大小。字典包含133k +行,如下所示:

abella AH B EH L AH
abeln AE B IH L N
abelow AE B AH L OW
abels EY B AH L Z
abelson AE B IH L S AH N
abend AE B EH N D
abend(2) AH B EH N D

我正在尝试将其缩小为仅保存美国最常用的单词和名称,文件中包含15k +行,如下所示:

configurations
poison
james
john
robert

当我运行以下脚本时,它会产生一个空白文件,就好像字典中第一行标记和公共字数据集的行之间没有匹配。我的文件对我这样做的方式来说太大了吗?我做错了什么?

import os

file_name = 'small_cmudict-en-us.dict'
f = open(file_name, 'w+')

with open('common_names_words.txt', 'r') as n:
        for line in n:
                line = line[:-1] #remove newline char
        with open('cmudict-en-us.dict', 'r') as d:
                for line2 in d:
                        dict_entry = line2.split()

                        #words with multiple pronunciations; abend, abend(2)
                        if dict_entry[0][-3:] == '(': 
                                if dict_entry[0][:-3] in n:
                                        f.write(line)

                        if dict_entry[0] in n:
                                f.write(line)
f.close 

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

你有几个问题。首先,您迭代整个文件但不保存任何内容

for line in n:
        line = line[:-1] #remove newline char

然后你问你想要的单词是否在你已经用该循环耗尽的文件中

if dict_entry[0] in n:

一旦你从事检查遏制,你应该考虑集合。它们可以快速查找像字符串这样的可清除对象。您还可以通过剥离(2)之类的内容并决定要比较的案例来“规范化”数据。也许两个文件都已经是小写,但我认为情况可能会有所不同。

file_name = 'small_cmudict-en-us.dict'

with open(file_name, 'w+') as f:

    with open('common_names_words.txt', 'r') as n:
        common = set(line.strip().lower() for line in n)

    with open('cmudict-en-us.dict', 'r') as d:
        for line2 in d:
            # account for e.g, "abend" and "abend(2)"
            word = line2.split()[0].split('(')[0].strip().lower()
            if word in common:
                f.write(line2)

您还可以使用writelines和为您过滤线条的生成器来压缩该代码。

    with open('cmudict-en-us.dict', 'r') as d:
        f.writelines(line for line in d
            if line.split()[0].split('(')[0].strip().lower() in common)