比较字符串以在Python中找到匹配单词的最佳方法是什么?

问题描述 投票:0回答:1

我有两个文本,文本A和文本B。文本B不是文本A的精确副本,它具有很多特殊字符,这些特殊字符不在文本A中,但是从技术上讲,它是相同的文本。我需要比较字符串并将文本B中的对应项映射到文本A中的对应项。

该文本不是英语,并且不能轻松地翻译成英语,因此下面的示例仅用于演示一些问题。

文本A中的某些单词不在文本B中,但文本B中的所有单词都应在文本A中:

text_a = "he experienced déjà vu"
text_b = ['he', 'experienced']

文本B中的某些单词与文本A使用不同的字符,但是是相同的单词:

text_a = "she owns & runs the cafe florae"
text_b = ['she', 'owns', 'and', 'runs', 'the', 'cefé', 'floræ']

文本B中的单词通常按正确的顺序排列,但并不总是这样:

text_a = "an uneasy alliance"
text_b = ['uneasy', 'alliance', 'an']

文本B中的某些单词由较小的组成部分,它们也包含在文本B中,这些较小的组成部分是不必要的:

text_a = "we should withdraw our claim"
text_b = ['we', 'should', 'with', 'draw', 'withdraw', 'our', 'claim']

文本A中的某些单词由文本B中的两个或多个单词表示:

text_a = "they undercut their competitors"
text_b = ['they', 'under', 'cut', 'their', 'competitors']

我想用文本B中的单词替换文本A中的单词。为此,我需要编写一个函数来匹配两个文本之间的单词。

我已经尝试编写一个函数,该函数使用edit distance库中的nltk方法以及一小撮RegEx来比较字符串。这只能做的很好,所以我研究了使用sequence allignment之类的库中的biopython技术,但我无法理解。

尤其是在使用编辑距离时,很难将“ under”和“ cut”等词匹配到“ undercut”,同时还要避免短字符串中的错误。这是因为在包含类似标记(如“ to”和“ tu”)的句子中,这些标记与诸如“tú”之类的标记具有相同的编辑距离,并且从理论上讲是同等有效的候选词,尽管此处明显的匹配项是“ tu” ',而不是'to'。

是否有高度准确的方法来匹配文本A中文本B的字符串?我想要一个类似的输出:

text_a = "the cafe florae undercut their competitors then withdrew their claim"
text_b = ['the', 'café', 'floræ', 'under', 'cut', 'their', 'competitors', 'then',
          'with', 'drew', 'withdrew', 'their', 'claim']

match_list = some_matchfunc(text_a, text_b)

print(match_list)

[['the', 'the'], ['cafe', 'café'], ['florae', 'floræ'], ['undercut', 'under'],
 ['undercut', 'cut'], ['their', 'their'], ['competitors', 'competitors'], ['then', 'then'],
 ['withdrew', 'withdrew'], ['their', 'their'], ['claim', 'claim']]

理想情况下,这还将包括文本A中每个匹配单词的开头和结尾的索引,以避免混淆,例如与单词“ their”在以下两次出现:]

[['the', [0, 3] 'the'], ['cafe', [4, 8] 'café'], ['florae', [9, 15] 'floræ'],
 ['undercut', [16, 24], 'under'], ['undercut', [16, 24], 'cut'], ['their', [25, 30], 'their'],
 ['competitors', [31, 42], 'competitors'], ['then', [43, 47], 'then'], ['withdrew', [48, 56], 'withdrew'],
 ['their', [57, 62], 'their'], ['claim', [63, 68], 'claim']]

如上所述,文本不是英语,使用NLP技术将其翻译以比较单词实际上是不可行的,因此它确实需要基于字符串比较。我认为必须已经存在某种方法或库,该方法或库使用的序列比对算法要比使用RegEx和编辑距离要有效,但我找不到。

有人知道比较字符串以达到此结果的高精度方法吗?

我有两个文本,文本A和文本B。文本B不是文本A的精确副本,它具有很多特殊字符,这些特殊字符不在文本A中,但是从技术上讲,它是相同的文本。我需要比较一下字符串...

python edit-distance sequence-alignment
1个回答
0
投票

问题本身非常复杂,我建议在适当的时候将字典与合适的同义词组合起来,然后再使用序列比对方法。 biopython中的实现可能真的不适合这种情况(例如,BLAST依赖于分数矩阵,该分数矩阵仅对核苷酸或氨基酸序列有意义,对真实单词没有意义)。我建议您看看SequenceMatcher,它可以完成这项工作。一个非常简单(尽管很幼稚)的解决方案是对所有候选项进行成对对齐,然后选择最接近的匹配项。取决于对准的复杂性,例如是否需要间隙/更换(想象SequenceMatcher)。

© www.soinside.com 2019 - 2024. All rights reserved.