1

我正在考虑写一个简单的研究论文管理器。这个想法是有一个存储库,其中包含每篇论文的元数据

paper_id -> [title, authors, journal, comments...]

由于有可能导入朋友的纸质转储会很好,我正在考虑如何生成论文的 paper_id:恕我直言,应该由 pdf 的文本生成,以保证两个不同的集合有相同的 ID 仅适用于相同的论文。目前,我使用 iText 库提取第一页的文本(删除可能的注释),并从文本中计算 simhash 足迹。主要问题是有时文本略有不同(是的,它发生了!例如thisthis)所以我想宽容。使用 simhash 我可以计算出与原始文档有多少相似之处,因此如果足迹不在 repo 中,我将不得不遍历集合以寻找“接近”的足迹。

我不相信这种方法,你能建议一些更好的方法来为这类文件生成签名(短的、数字的或字母数字的)吗?

更新我有这个想法:将第一页分成 8 个(或多或少)不重叠的正方形,覆盖所有页面,然后考虑每个正方形中的文本并生成一个 simhash 签名。最后,我将得到一个 8x64=512 位的签名,如果两篇论文的 simhash 签名集之间的差异之和低于某个阈值,我可以认为它们是相同的。

4

1 回答 1

1

如果您实际上有一个输入两个文本并返回其相似性度量的函数,则不必迭代整个存储库。给定一篇不在存储库中的文章,您可以只迭代长度大致相同的文章。例如,给定一篇有 1000 个字符的文章,您会将其与 950 到 1050 个字符的文章进行比较。为此,您需要有一个将范围映射到文章的数据结构,并且您必须微调范围的大小。范围太大 - 每个范围内的项目太多。范围太小 - 错过的可能性更高。

当然,这在某些极端情况下会失败。例如,如果您有两个文档,而第二个文档只是第一个被复制粘贴了两次:您可能希望它们被视为相等,但您甚至不会比较它们,因为它们的长度相差太大。也有一些方法可以解决这个问题,但你可能“不需要它”。

于 2012-10-07T17:46:44.233 回答