java - 了解两个不同的 pdf 是否是同一篇研究论文

标签 java pdf hash

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

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

既然能够导入 friend 的论文转储就太好了, 我正在考虑如何生成论文的 paper_id:恕我直言,应该生成 根据 pdf 的文本,保证两个不同的集合仅对相同的论文具有相同的 id。 目前,我使用 iText 库提取第一页的文本(删除可能的注释),并根据文本计算 simhash 足迹。 主要问题是有时文本略有不同(是的,它会发生!例如 thisthis ),所以我想容忍。 使用 simhash,我可以计算它们与原始文档的相似程度,因此,如果足迹不在存储库中,我将不得不迭代集合以查找 “附近”的脚印。

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

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

最佳答案

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

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

关于java - 了解两个不同的 pdf 是否是同一篇研究论文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762045/

相关文章:

java - 使用 Selenium Java 下载 PDF 在 Chrome 中不起作用

c++ - 你会如何设计一个完美哈希的函数?

java - 如何使用 float 图标将所有复选框值返回到字符串

java - Quartz 作业中的 Websphere JNDI 查找失败

c# - 如何使用 iTextSharp 设置 PDF 段落的字体?

c++ hash<string> 有没有办法在 linux 和 windows 中获得相同的值

algorithm - universal hashing是不是每次操作完成后都会重新选择一个新的hash函数?

java - 矩形内 BufferedImage 的渲染部分

java - 应用程序启动方法中出现异常。 OpenJFX 13 与 Maven

ios - 从打开的 PDF 返回到应用程序