首页 > 解决方案 > 如何保存另一个文件中存在的关键字?

问题描述

我有一个包含一对关键字(k1k2)的列表。这是一个示例:

print (word_pairs)
--->[('salaire', 'dépense'), ('gratuité', 'argent'), ('causesmwedemwelamwemort', 'cadres'), ('caractèresmwedumwedispositif', 'historique'), ('psychomotricienmwediplôme', 'infirmier'), ('impôtmwesurmwelesmweréunionsmwesportives', 'compensation'), ('affichage', 'affichagemweopinion'), ('délaimweprorogation', 'défaillance'), ('créancemwenotion', 'généralités')]

我有一个文本文件r_isa.txt(205MB),其中包含共享“isa”关系的单词。这是一个示例,其中\t表示文字制表符:

égalité de Parseval\tformule_0.9333\tégalité_1.0
filiation illégitime\tfiliation_1.0
Loi reconnaissant l'égalité\tloi_1.0
égalité entre les sexes\tégalité_1.0
liberté égalité fraternité\tliberté_1.0

这基本上意味着,“égalité de Parseval”是一个得分为 0.9333 的“公式”和一个得分为 1 的“égalité”。等等。

我想根据 r_isa 文件知道关键字是否与关键字k1有上位词关系,反之亦然k2。(如果k1is-ak2k2is-a k1)。在输出文件中,我想在每一行中保存一对确实具有 is-a 关系的单词。

这是我所做的:

#Reading data as list
keywords = [line for line in open('version_final_PMI_espace.txt', encoding='utf8')]
keywords = ast.literal_eval(keywords[0])
word_pairs = []

for k,v in keywords.items():
    if v:
        word_pairs.append((k,v[0][0]))
len(list(set(word_pairs)))
 #####  


with open("r_isa.txt",encoding="utf-8") as readfile, open('Hyperonymy_file_pair.txt', 'w') as writefile:
    for line in readfile:
        firstfield = line.split('\t')[0]
        for w in word_pairs:
            if w[0]==firstfield:
                if w[1] in line: 
                    writefile.write("".join(w[0]) + "\t"+"".join(w[1]) +"\n" )

这不会给我任何错误,但这是我的问题:

时间太长了:我让它运行了一个小时,它并没有停止。

这种只处理一种方式 ( if w[0]==firstfield),计划是一旦它完成运行,我通过更改w[0]w[1](不是很优雅) 独立处理另一种方式。还有其他选择吗?

标签: pythonregex

解决方案


目前,您正在循环一个 205mb 的文件,并且只将 w 存储在您的单词对中(因此,如果您的单词对列表只有一个条目,那么您仍在循环 205mb!)

由于这里的内存不是问题,但速度是问题,您可以使用 2 个字典查找;使用 k1/ w[0] 作为第一个字典中的键(以 k2s 列表作为值),在第二个字典中使用 k2 作为键,并以 k1s 列表作为值。

一旦您准备好字典一次,您就可以将字典提取出来,而不是读取制表符分隔的文本文件。应该快一点。


推荐阅读