【问题标题】:Fetch the line that has two specific keywords获取具有两个特定关键字的行
【发布时间】:2020-08-12 09:43:58
【问题描述】:

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

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 isa k2,如果k2是-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].lower()
        for w in word_pairs:
            if w[0]==firstfield:
                if w[1] in line: 
                    writefile.write("".join(w[0]) + "\t"+"".join(w[1]) +"\n" )

这会向我返回随机对,例如:

salaire\targent
dépense\tcadres

不是(在现有 isa 关系的情况下)

salaire\tdépense
causesmwedemwelamwemort\tcadres

我哪里做错了?

【问题讨论】:

  • 你能添加预期的输出吗?怎么会有人看懂(k1,k6)(k1,k3)
  • 有没有可能一行可以包含多对?
  • 请包含更多代码,包括 word_pairs 是如何填写的。如需帮助,请参阅 MVE:stackoverflow.com/help/minimal-reproducible-example
  • @deadshot 谢谢你的时间。我编辑了帖子,提供了有关输出的更多详细信息。我检查过,但它返回给我的这对之间绝对没有关系。
  • @NL5025 如果您发布与发布的文本文件数据匹配的预期输出可能会更好

标签: python python-3.x list


【解决方案1】:

更新答案

声明if w[1] in line: 是高度可疑的。请参阅以下代码,了解我认为应该是什么逻辑。由于我无权访问您的文件,因此我将readfile 转换为字符串列表以用于测试目的,而不是将输出写入writefile,我只是打印一些结果。我为word_pairsreadfile 添加了一些值,以便得到一些结果。另请注意,如果您要将输入文件转换为小写,那么您的单词对也必须是小写。

此代码检查 k1 是否为 k2,如果不是,则检查 k2 是否为 k1。

word_pairs = [('égalité de parseval', 'égalité'), ('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')]
word_pairs2 = [(pair[1], pair[0]) for pair in word_pairs] # reverse the words
word_dict = dict(word_pairs) # create a dictionary for fast searching
word_dict2 = dict(word_pairs2)

readfile = [
    'é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',
    'dépense\tsalaire_.9'
]

for line in readfile:
    fields = line.lower().split('\t')
    first_word = fields.pop(0)
    isa_word = word_dict.get(first_word, word_dict2.get(first_word)) # check k2 isa k1 if k1 isa k2 is false
    if isa_word is not None:
        for field in fields: # check each one
            fields2 = field.split('_')
            second_word, score = fields2
            if second_word == isa_word:
                print(first_word, second_word, score)

打印:

égalité de parseval égalité 1.0
dépense salaire .9

如果 k1 可能是 k2 并且 k2 是 k1,那么您需要更通用(但更复杂)的代码:

word_pairs = [('égalité de parseval', 'égalité'), ('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')]
word_pairs2 = [(pair[1], pair[0]) for pair in word_pairs] # reverse the words
word_dict = dict(word_pairs) # create a dictionary for fast searching
word_dict2 = dict(word_pairs2)

readfile = [
    'é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',
    'salaire\tdépense_1.0',
    'dépense\tsalaire_.9'
]

for line in readfile:
    fields = line.lower().split('\t')
    first_word = fields.pop(0)
    # k1 isa k2?
    isa_word = word_dict.get(first_word)
    if isa_word is not None:
        for field in fields: # check each one
            fields2 = field.split('_')
            second_word, score = fields2
            if second_word == isa_word:
                print(first_word, second_word, score)
    # k2 isa k1?
    isa_word = word_dict2.get(first_word)
    if isa_word is not None:
        for field in fields: # check each one
            fields2 = field.split('_')
            second_word, score = fields2
            if second_word == isa_word:
                print(first_word, second_word, score)

打印:

égalité de parseval égalité 1.0
salaire dépense 1.0
dépense salaire .9

【讨论】:

  • 谢谢。这适用于 k1 isa k2 的情况,配对为 (k1,k2)。如果我想看看 k2 是否是 k1,你建议我如何继续?(根据你的代码)
  • 我已经根据 k1 isa k2 和 k2 isa k1 是否可以同时为 True 更新了两个变体的答案。第二个变体更通用,无论如何总是正确的。
【解决方案2】:
kw = [('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')]

lines_from_file = ['é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',
                   'créancemwenotion\tgénéralités_1.0',
                   'généralités\tcréancemwenotion_1.0']

who_is_who_dict = {}
for line in lines_from_file:
    words = line.split('\t')
    key = words[0]
    other_words = [w.split('_')[0] for w in words[1:]]
    if key in who_is_who_dict:
        who_is_who_dict[key] = who_is_who_dict[key] + other_words
    else:
        who_is_who_dict[key] = other_words

pairs_to_write = []
for kw1, kw2 in kw:
    if (kw1 in who_is_who_dict and kw2 in who_is_who_dict[kw1]
            and kw2 in who_is_who_dict and kw1 in who_is_who_dict[kw2]):
        pairs_to_write.append((kw1, kw2))

print(pairs_to_write)

输出:

[('créancemwenotion', 'généralités')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多