Python 尝试比较两个大文件的行并保留匹配的行,但不保留匹配的行
我有一个语音识别引擎的字典文件,我正试图缩小它的大小。字典包含133k+行,如下所示:Python 尝试比较两个大文件的行并保留匹配的行,但不保留匹配的行,python,python-3.x,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 configurations poison james john robert 我正试图将其简化为仅保存美国最常见的单词和名称,
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
configurations
poison
james
john
robert
我正试图将其简化为仅保存美国最常见的单词和名称,这些单词和名称来自一个包含15k+行的文件,如下所示:
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
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
谢谢您的时间。您有几个问题。首先,迭代整个文件,但不保存任何内容
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)
多发音的单词将在其末尾附加“(some_number)”。我尽量保持每场比赛的发音。这就是为什么我尝试检查这两种情况(末尾有一个数字,没有)。感谢您的回复。这行代码有点问题:common=set(line.strip().lower()表示in-line in n)。我假设它将每一行存储为集合中的一个元素,但我不确定。我遇到了一个语法错误,当我删除第一个“in”来解决它时,我得到了一条没有定义“line”的消息。我让它使用列表而不是集合来工作(只是因为我更熟悉它),并调整了一些东西。再次感谢您的帮助和建议。感谢您让我知道这些错误。我更新了答案。
set
与列表类似,不同之处在于它只允许输入一个给定值(如果原始文件多次被设置为“abend”,则只能获得一份副本),“in”操作符速度更快。如果你有1.5万个常用词,这将有很大的好处。也就是说,这个清单也会起作用。