我正在考虑写一个简单的研究论文经理。
想法是为每个论文建立一个包含元数据的存储库
paper_id -> [title, authors, journal, comments...]
由于很可能可以导入朋友的纸张转储,
我正在考虑如何生成论文的paper_id:应该生成恕我直言
通过pdf的文本,以确保两个不同的集合仅对同一篇论文具有相同的id。
此刻,我使用iText库提取了第一页的文本(删除了可能的注释),并从文本中计算出Simhash足迹。
主要的问题是,有时文本会稍有不同(是的,它发生了!例如this和this),所以我想宽容。
使用simhash,我可以计算出原始文档有多少相似之处,因此,如果仓库中没有占用空间,我就必须遍历整个集合以寻找
“近乎”的足迹。
我不相信这种方法,您能提出一些更好的签名方法吗?
(简短,数字或字母数字)用于此类文档?
更新我有这个想法:将第一页分成8个(或多或少)不重叠的正方形,覆盖所有页面,然后考虑每个正方形中的文本
并生成simhash签名。最后,我将获得一个8x64 = 512bit的签名,我可以考虑
如果两个论文的Simhash签名集之间的差异之和在某个阈值以下,则它们是相同的。
最佳答案
如果实际上您有一个输入两个文本并返回其相似度的度量的函数,则不必迭代整个存储库。
如果给定的文章不在资源库中,则只能迭代长度大致相同的文章。例如,给定一个具有1000个字符的文章,您可以将其与950至1050个字符的文章进行比较。为此,您将需要一个将范围映射到文章的数据结构,并且必须微调范围的大小。范围太大-每个范围内的项目过多。范围太小-错过机会更高。
当然,这在某些情况下会失败。例如,如果您有两个文档,而第二个文档只是复制了两次的第一个文档:您可能希望它们被认为是相等的,但是由于它们的距离太远,您甚至不会比较它们。也有解决这个问题的方法,但是您可能“不需要”。