我有一个语音识别引擎的字典文件,我正在尝试减小它的大小。字典包含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
感谢您的时间。
答案 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)