14

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

有时仅在一个文件中会出现诸如“风在吹……音乐正在播放”之类的评论。但是 80% 的内容将是相同的。该函数必须返回 TRUE(文件代表相同的文本)。有时会出现像 1 这样的拼写错误,而不是 l (one - L),如下所示: She 1eft the bag。当然,这意味着函数必须返回 TRUE。

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

“所有人都很开心”和“所有人都不开心”——在这里这会被认为是拼写错误,所以会被认为是相同的文本。确切地说,函数返回的百分比会更低,但足以说明短语相似

请考虑是否要将 Levenshtein 应用于整个文件或只是一个搜索字符串 - 不确定 Levenshtein,但该算法必须应用于整个文件。不过,这将是一个很长的字符串。

4

5 回答 5

13

Levenshtein 算法:http ://en.wikipedia.org/wiki/Levenshtein_distance

除了零结果之外的任何内容都意味着文本不是“相同的”。“相似”是衡量它们有多远/多近的量度。结果是一个整数。

于 2010-02-24T11:42:51.660 回答
6

对于您描述的问题(即比较大字符串),您可以使用Cosine Similarity,它根据术语频率向量返回一个介于 0(完全不同)到 1(相同)之间的数字。

您可能想查看此处描述的几种实现:余弦相似度

于 2011-11-06T14:06:33.183 回答
2

看看近似 grep。它可能会为您提供指导,尽管几乎可以肯定它会像您所说的那样在大块文本上表现得非常糟糕。

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

于 2010-02-24T11:36:59.580 回答
2

您在这里期望太多,看起来您必须为您的特定需求编写一个函数。我建议从现有的文件比较应用程序开始(也许diff已经拥有您需要的一切)并对其进行改进以为您的输入提供良好的结果。

于 2010-02-24T11:37:59.460 回答
1

Levenshtein 距离有许多替代方案。例如Jaro-Winkler 距离

这种算法的选择取决于语言、单词的类型、人类输入的单词等等……

在这里,您可以在一个库中找到多种算法的有用实现

于 2014-05-20T06:32:06.107 回答