用最近的索引组合单词

2024-10-03 23:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件的条款与他们的索引上下文中的两种语言,如这种格式

1. (2- human rights, 10- workers rights)>> (3- droits de l'homme, 7- droit des travailleurs)
2. (2- human rights, 10- workers rights, 19- women rights)>> (5- droits de l'homme, 15- les droits des femmes)

目标是将第一语言(英语)中的每个单词附加到另一语言(法语)中句子中最接近的单词上,因此输出将是

 human rights : droits de l'homme
 workers rights : droit des travailleurs
 human rights : droits de l'homme
 women rights  : les droits des femmes

这就是评论:人权>;人权法:由于n.2(英语句子中“人权”的位置)与n.3(法语句子中“人权法”的位置)接近,因此与法语列表中的其他数字(在本例中为n.7)相比;同样,“工人权利”也接近于“劳动法”

人权>;人权法:由于n.2(英语句子中“人权”的位置)接近n.5(法语句子中“人权法”的位置),与法语列表中的其他数字(本例中为n.15)相比;同样,“妇女权利”>;“女性权利”:因为n.19接近n.15(与n.10相比)

有人能找到同样的方法得到这个输出吗?你知道吗


Tags: gt权利语言de句子workershumandes
1条回答
网友
1楼 · 发布于 2024-10-03 23:28:22

尚未完成,但应该会让您开始:

from bisect import bisect
import re

with open("test.txt") as f:
    r = re.compile("(\d+)")
    for line in f:
        a, b = line.lstrip("0123456789. ").split(">> ")
        a_keys = [int(i.group()) for i in r.finditer(a)]
        b_keys =  [int(i.group()) for i in r.finditer(b)]
        a = a.strip("()\n").split(",")
        b = b.strip("()\n").split(",")
        for ele, s in zip(a, a_keys):
            ind = bisect(b_keys, s, hi=len(b) - 1)
            print("{} -> {}".format(ele, b[ind]))

输出:

2- human rights -> 3- droits de l'homme
 10- workers rights ->  7- droit des travailleurs
2- human rights -> 5- droits de l'homme
 10- workers rights ->  15- les droits des femmes
 19- women rights ->  15- les droits des femmes

你需要修正格式,再做一次检查,根据ind和ind-1的ele的绝对差来找到min。你知道吗

要捕捉上一个ind-1元素的绝对差值较小的位置:

from bisect import bisect
import re

with open("test.txt") as f:
    r = re.compile("(\d+)")
    for line in f:
        a, b = line.lstrip("0123456789. ").split(">> ")
        a_keys = [int(i.group()) for i in r.finditer(a)]
        b_keys = [int(i.group()) for i in r.finditer(b)]
        a = a.strip("()\n").split(",")
        b = b.strip("()\n").split(",")
        for ele, k in zip(a, a_keys):
            ind = bisect(b_keys, k, hi=len(b) - 1)
            ind -= k - b_keys[ind] < b_keys[ind-1] - k
            print("{} -> {}".format(ele, b[ind]))

因此:

1. (2- human rights, 10- workers rights)>> (3- droits de l'homme, 7- droit des travailleurs)
2. (2- human rights, 10- workers rights, 19- women rights)>> (1- droits de l'homme ,4- foobar, 15- les droits des femmes)

我们得到:

2- human rights -> 3- droits de l'homme
 10- workers rights ->  7- droit des travailleurs
2- human rights -> 1- droits de l'homme 
 10- workers rights ->  15- les droits des femmes
 19- women rights ->  15- les droits des femmes

原始代码将输出2- human rights -> 4- foobar,因为我们没有考虑前一个元素的绝对差在哪里更小。你知道吗

使用您的评论中的数据可以看出区别:

l1 = [10, 33, 50, 67]
l2 = [7, 16, 29, 55]

for s in l1:
    ind = bisect(l2, s, hi=len(l2) - 1)
    print("{} -> {}".format(s, l2[ind]))

输出:

10 -> 16
33 -> 55
50 -> 55
67 -> 55

现在检查前面的元素:

l1 = [10, 33, 50, 67]
l2 = [7, 16, 29, 55]

for s in l1:
    ind = bisect(l2, s, hi=len(l2) - 1)
    ind -= s - l2[ind-1] < l2[ind] - s
    print("{} -> {}".format(s, l2[ind]))

输出:

10 -> 7
33 -> 29
50 -> 55
67 -> 55

bisect.bisect

Similar to bisect_left(), but returns an insertion point which comes after (to the right of) any existing entries of x in a. The returned insertion point i partitions the array a into two halves so that all(val <= x for val in a[lo:i]) for the left side and all(val > x for val in a[i:hi]) for the right side.

所以对分得到元素应该在有序的数字列表中的哪个位置,所有元素都小于元素左边的位置,这意味着元素大于所有前面的元素。为了根据差值找到最接近的值,我们需要检查前面的元素,因为abs差值可能较小。你知道吗

相关问题 更多 >