我有一个项目,我需要将多章文档与第二个文档进行比较,以确定它们的相似性。问题是我不知道如何做到这一点,存在什么方法或者他们是否有任何库。
我的第一个问题是......有什么相似之处?匹配的单词数,匹配的连续单词数?
我可以看到编写一个解析器,将每个文档放入一个包含单词和位置的数组中,然后进行比较。
然而,它似乎与我试图做的有些不同。人们可能拥有的任何选项或指示都会很棒!
答案 0 :(得分:1)
“什么是类似的”我们无法告诉您,这是对您项目的基本要求的陈述。如果您不知道这一点,那么很快就会考虑如何去做。
提出“为什么”这个问题可能会有所帮助。相似度量将用于什么?
例如,如果目的是检测抄袭,那么检测到两篇论文是相似的,因为他们谈论相同的科目并提出类似的参考文献不太可能有用 - 整个班级都会提交类似的论文!所以你可能正在寻找匹配完整的句子和短语。
如果您正在尝试为某些文档构建目录,那么您可能会搜索关键词。如果两个文件使用相同的单词词汇量或类似的专有名词,则两个文档是相似的。
这两个例子旨在证明,在我们理解类似的含义之前,很难给出很多建议。
然而,这是一种可能的方法。你可以写两个主要的东西:一个提取器和一个比较器。
提取器的工作是挖掘文档并生成文档本质的块(或列表,是否需要订购?):这些可能是单个单词或句子和短语。
比较者的工作是评估两个文件“本质”的相似性。
简单示例:从文档中提取8个字母或更多字母的唯一字词列表。 然后比较可能是两个文件是相似的,如果一个集合包含超过75%的其他文件。
答案 1 :(得分:1)
一种简单的方法是将文档文本连接在一起,然后压缩它们。压缩比可以告诉你你有多少相似之处。
答案 2 :(得分:1)
您可以使用的一种方法称为Shingling。该过程涉及对两个文档中的所有单词进行标记,例如。
D1 = {"An", "Example", "Document", "To", "Show", "Shingling"}
D2 = {"Another", "Example", "Document", "To", "Show", "Shingling", "but", "longer"}
然后取一组窗口长度为n的连续子序列(记住集合中没有重复)。
S(D1, 3) = {{"An", "Example", "Document"}, {"Example", "Document", "To"}, {"Document", "To", "Show"}, {"To", "Show", "Shingling"}}
S(D2, 3) = {{"Another", "Example", "Document"}, {"Example", "Document", "To"}, {"Document", "To", "Show"}, {"To", "Show", "Shingling"}, {"Show", "Shingling", "but"}, {"Shingling", "but", "longer"}}
然后相似性是交叉点的基数除以联合的基数。所以对于我们的例子3/7 = 43%相似。
可以通过使用随机选择的草图(一组带状疱疹的子集)进行有效的近似。
答案 3 :(得分:0)
答案 4 :(得分:0)
这取决于你想要达到的目标。如果目标是在一组文档中找到与给定文档类似的文档,您可以尝试这样的事情:
根据文档的不同,您可以先从长文档中提取最有意义的关键词或关键句,以提取文本的本质(谷歌“关键词提取”)。然后,您可以使用文本相似性算法(如k-最近邻算法)来捕获类似的文档。关键是要提取文本的关键部分。