我有两个文本,文本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中的词。为此,我需要编写一个函数来匹配两个文本之间的词
我已经尝试过编写一个函数,它使用nltk
库中的edit distance
方法与一些正则表达式来比较字符串。这只是一个不错的工作,所以我研究了使用像biopython
这样的库中的sequence alignment
技术,但我无法理解这些
特别是,在使用编辑距离时,很难将“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中每个匹配单词的开头和结尾的索引,以避免混淆,如下面出现两次的单词“他们的”:
[['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技术将其翻译为比较单词是不可行的,因此需要基于字符串比较。我认为一定有某种方法或库已经存在,它采用了比我使用正则表达式和编辑距离更有效的序列对齐算法,但我找不到
有人知道一种非常精确的方法来比较字符串以获得这个结果吗
这个问题本身非常复杂,我建议在合适的时候将字典与合适的同义词结合起来,然后回到序列对齐方法。biopython中的实现可能并不真正适用于这种情况(例如,BLAST依赖于一个分数矩阵,该矩阵对真实单词没有意义,只对核苷酸或氨基酸序列有意义)。我建议你去看看^{} ,它可以胜任这项工作。一个非常简单(尽管很幼稚)的解决方案是对所有候选对象进行两两对齐,然后选择最接近的匹配项。根据路线的复杂性,例如是否需要间隙/替换(想象一下
"they're" -> "they are"
)请记住,在某些情况下,需要进行多对多、一对多和多对一的替换(您的示例中已经有了其中的一些替换)。序列比对并不能自动解决这个问题,因此我建议使用字典(如果负担得起的话,可以使用双向字典)。如果同义词语料库非常大,我甚至会考虑数据库来执行这些任务。
此外,有些示例需要单词级替换,有些示例需要字母级替换。我建议你把这些分开处理。如果你不必处理打字错误,我会从更大的(单词)规模开始,然后再转到字母级替换
相关问题 更多 >
编程相关推荐