Python 在矩阵中寻找句子对齐的路径

Python 在矩阵中寻找句子对齐的路径,python,matrix,nlp,deep-learning,Python,Matrix,Nlp,Deep Learning,下面的问题:我正在使用python,我有两个不同语言的文本(texta和textb),它们都有很多句子。目的是将texta中的每个句子与textb中的一个句子对齐。总的长度大致相等,但句子的数量却不尽相同。大约是1:1.3,所以有时候一句texta可能会得到两句textb。两个文本中句子的顺序都需要保留。 现在我有一个CNN,它输出所有句子的矩阵和它们的概率分数,它们是彼此的翻译。 这可能以简化的方式如下所示: [0.5,0.2,.0.0] [0.1,0.6,0.4] [0.2,0.3,0.8]

下面的问题:我正在使用python,我有两个不同语言的文本(texta和textb),它们都有很多句子。目的是将texta中的每个句子与textb中的一个句子对齐。总的长度大致相等,但句子的数量却不尽相同。大约是1:1.3,所以有时候一句texta可能会得到两句textb。两个文本中句子的顺序都需要保留。 现在我有一个CNN,它输出所有句子的矩阵和它们的概率分数,它们是彼此的翻译。 这可能以简化的方式如下所示:

[0.5,0.2,.0.0]
[0.1,0.6,0.4]
[0.2,0.3,0.8]
这些预测的准确率约为50%。因此,当我只选择每行的最佳结果时,我得到了50%的精度。
现在,人们会期望理想的路径或多或少是对角的,因为两个文本在同一个地方或多或少包含相同的信息。然而,事实并非总是如此。一个句子可以是短的,一个句子可以是长的,有时一个段落缺失(翻译错误)。所以我想知道什么是解决这个问题的好方法。我的第一个想法是测量到对角线中心的距离,并给出一个惩罚,当元素远离该中心时,该惩罚会进一步降低概率分数。然而,这种方法在段落缺失的情况下很弱,因此较长的句子序列距离中心更远。因此,我正在寻找一种优化技术,但我还不知道从哪里开始。

我会尝试采用分而治之的策略

正如您所指出的,由于省略了段落,您无法确定测量距离。所以这打破了你的近距离检查

既然你已经有了一个概率矩阵,我会试着找出那些明显匹配的句子。所以现在你有两个新的小问题围绕着他们。如果你可以重新运行你的概率程序,在新的小节中,你会得到一个更准确的概率,因为你不会因为遥远的句子而失去空间。你们会得到更稀疏的矩阵,你们只要加入。您将把完整的图形矩阵更改为

所以你从这个开始

a b c d e f g h i j k l m n o p q r s t u v w x y z e f .8 h i j k l m n o p q r s t u v w x y z a b c d a b c d .7 f g h i j k l m n o p q r s t u v w x y z e f g h i j k l m n o p q r s t u v w x y z .9 b c d a b c d e f g h i j k l m n o p q r s t u v w x y z e f g h i j k l m n o p q r s t u v w x y z a b c d a b c d e f g h i j k l m a b c d e f g h i j k l m n无p q r s t u v w x y z e f.8 h i j k l m n o p q r s t u v w x y z a b c d a b c d.7 f g h i j k l m n无p q r s t u v w x y z e f g h i j k l m n o p q r s t u v w x y z.9 b c d a b c d e f g h i j k l m n无p q r s t u v w x y z e f g h i j k l m n o p q r s t u v w x y z a b c d a b c d e f g h i j k l m 你固定了3个高概率的句子,你得到了这个(这是可能的,因为你明确地说有严格的顺序保留)

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零 0 0 0 0 j k l m 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 k l 0 0 0 0 0 0 0 0 0 x y 0 0 0 0 0 0 0 0 0 0 0 o p 0 0 0 0 0 0 0 0 0 0 0 0 0 b c 0 0 0 0 0 0 0 0 0 0 0 0 0 1 注:重新计算后,上面的字母与下面的字母不同

因此,在对角线上留下子矩阵,在其他地方留下零。每个块从第一行和第一列中的1和0开始;并在最后一行和最后一列中以1和0结尾


这样,您就可以有效地将缺少的段落装箱到子矩阵中。此方法在很大程度上取决于您的高概率匹配的质量。

请阅读并遵循帮助文档中的发布指南,正如您创建此帐户时建议的那样。在这里申请。你用非常笼统的术语描述一个问题,但你给出的唯一具体的例子并不是你想要解决的问题。结果不够明确,太宽泛了。谢谢,这非常有用!通过在第一次运行时设置一个非常高的阈值,精度可以提高到95%以上,但随后只产生很少的结果(只有所有句子的15%左右)。但是这些句子之间的距离不再那么高了,平均约9句。我想这就是对角线/惩罚方法非常有效的地方!太棒了,那是一个巨大的撞击。 1 0 0 0 0 0 0 0 0 0 0 0 0 0 a 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 y 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 s t u v 0 0 0 0 0 0 0 0 0 j k l m 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 k l 0 0 0 0 0 0 0 0 0 0 0 x y 0 0 0 0 0 0 0 0 0 0 0 o p 0 0 0 0 0 0 0 0 0 0 0 b c 0 0 0 0 0 0 0 0 0 0 0 0 0 1