我想检测文件之间的相似之处。这样做的一种方法是对文件进行编码以减少相似性算法的输入空间,其次是为结果提供更准确的结果。这是通过仅考虑文档的信息特征来完成的。这样做的一种方法是将文件转换为跟随tf-idf频率的向量空间变换,该变换扩展了非常有用的术语并缩减了频繁的术语。我的问题是,这是否可以在不保留其文本表示的文档中完成。例如,假设首先将文档转换为大整数数组,其中的字符表示为ASCII值。
答案 0 :(得分:3)
文件在字节数组中的编码不是问题,因为@Ivan Koblik指出,因为文本总是用数字数据编码。您的任务是标准文档相似性检测问题。我建议采取以下步骤:
使用simhash
或locality-sensitive-hash,您可以将高维向量转换为f-bit
指纹,例如f=64
。这正是Google用于near duplicate web page detection的技术。
我们维持一个 f维向量V,其每个维度被初始化为零。将特征散列为f位散列值。这些f位(特征独有)递增/递减 矢量的f分量由该特征的权重 如下:如果散列值的第i位为1,则V的第i个分量增加该特征的权重; 如果散列值的第i位是0,则是第i个分量 V的值减去该特征的权重。什么时候 已经处理了所有功能,V的一些组件 积极而有些则是消极的。组件的迹象 确定最终指纹的相应位。
但是,在您的情况下,您可能会发现其他相似函数,如余弦距离或欧几里德距离表现更好。如果simhash
不适合您,请尝试为您的问题找到最佳相似度函数。
为每个文档生成指纹后,类似的文档应该有类似的指纹(类似意味着他们的指纹的汉明距离很小)。有关详细信息,请参阅near duplicate web page detection。
如果你不能做第一步,即解码,那么简单地计算每个唯一整数的出现仍然是可行的。您可以将tf-idf应用于这些唯一的整数,并按照子序列步骤操作。
答案 1 :(得分:1)
如果您不介意TF-IDF方法,布隆过滤器适合您的情况:http://research.microsoft.com/en-us/um/people/navendu/mypapers/webdb-167.pdf
这样,您可以根据您对误报的容忍度,使矢量任意小或大。
无论如何看NLP工具包大多数算法都可以适应任务,问题是你如何指定相似性?
如果您可以指定不同类别的文档,那么值得研究Naive Bayes,或者如果您想以不同方式定义相似性,MaxEnt模型可能对您有用: http://www.kamalnigam.com/papers/maxent-ijcaiws99.pdf