文本相似度算法

14

我有两个字幕文件。 我需要一个函数来判断它们是否代表相同的文本,或者是相似的文本

有时候只有一个文件中才有像“风在吹……音乐在播放”这样的注释。 但是80%的内容都是相同的。该函数必须返回TRUE(文件表示相同的文本)。 有时候会出现拼写错误,比如1而不是l(one - L),就像这里一样: 她1离开了行李。 当然,这意味着函数必须返回TRUE。

我的评论:
该函数应该返回文本的相似度百分比-同意

“所有人都很高兴”和“所有人都不高兴” - 在这里这将被视为拼写错误,因此被认为是相同的文本。确切地说,函数返回的百分比将更低,但足够高以表明这些短语是相似的。

请考虑是否要对整个文件还是仅对搜索字符串应用Levenshtein算法-不确定Levenshtein,但是算法必须应用于整个文件。虽然它将是一个非常长的字符串。


2
该函数应返回文本相似度的百分比,您可以决定TRUE或FALSE的阈值。 - YOU
你需要非常认真地考虑相似性准则,我认为这可能是你所尝试做的最困难的部分。例如,“所有的人都很快乐”和“所有的人都不快乐”在文本上是相似的,但意义完全相反。提供一些类似和不相似文本的例子可能会有帮助。 - glenatron
1
请查看Soundex(http://en.wikipedia.org/wiki/Soundex),看看它是否符合您的需求。 - Buhake Sindi
请考虑您是想在整个文件上应用Levenshtein算法还是仅在搜索字符串上应用。 - bcosca
6个回答

13

2
+1:整数结果需要被规范化以确定整个文件的相似度。例如,相似度=Levenshtein距离/字符数。我还建议在应用此算法之前对文件进行预处理以纠正拼写错误。 - Adamski
在Apache Commons的StringUtils中有Levenshtein距离的实现:http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html#getLevenshteinDistance(java.lang.String, java.lang.String) - Fabian Steeg
2
@Fabian:这是PHP中的内置函数:http://php.net/manual/en/function.levenshtein.php - soulmerge
Levinstain 距离算法不适用于长字符串。例如,使用 StringUtils 实现,如果每个文件的大小约为 ~300kb,则处理一个文件需要几分钟的时间。 - Yonatan

6
对于您所描述的问题(即比较大字符串),您可以使用余弦相似度,它返回介于0(完全不同)到1(相同)之间的数字,基于词频向量。
您可能想看一下这里描述的几个实现:余弦相似度

2
请看一下近似匹配grep。它可能会给你一些指针,但在像你所说的大块文本上执行效果几乎肯定很差。

编辑:agrep的原始版本不是开源的,因此您可能会从http://en.wikipedia.org/wiki/Agrep获取到OSS版本的链接。


2

你期望的过高了,看起来你需要为你特定的需求编写一个函数。我建议从现有的文件比较应用程序开始(也许diff已经拥有你所需的一切),并改进它以提供你输入的良好结果。


或者,渲染文本时使用已知的字体大小(和字体),然后比较像素。这样,具有类似外观形状的符号可以被制作成相似的外观,更容易检测到。 - Chii
@Chii 但是在更大的符号移位时,页面的其余部分会被扰乱。 - Jens Schauder
我认为这个问题与OCR无关,只涉及纯文本。 - bcosca

1

0
如果您仍在寻找解决方案,那么可以选择S-Bert(句子Bert),它是一种轻量级算法,内部使用余弦相似度。

1
除了这个答案,添加额外的支持信息将有助于其他人确认您的答案是否正确。您能否提供关于相似性算法如何工作的引用或文档?您还提到了余弦相似度,您可能也想引用一下。您可以在帮助中心找到有关如何编写好答案的更多信息。 - charlie-map
这里是提供更多细节的问题。 https://dev59.com/bVMH5IYBdhLWcg3w3EVO - balu datascience

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接