我想检测文件之间的相似之处。这样做的一种方法是对文件进行编码,以减少相似性算法的输入空间,然后为结果提供更准确的结果。这是通过仅考虑文档的信息特征来完成的。这样做的一种方法是将文件转换为遵循 tf-idf 频率的向量空间转换,这会放大信息量很大的术语并缩小频繁的术语。我的问题是这是否可以在不保留其文本表示的文档中完成。例如,假设首先将文档转换为一个大整数数组,其中其字符表示为其 ASCII 值。
3 回答
正如@Ivan Koblik 指出的那样,字节数组中的文档编码不是问题,因为文本总是用数字数据编码。你的任务是一个标准的文档相似性检测问题。我建议以下步骤:
预处理
- 解码
- 标记化;
- 外壳折叠;
- 删除停用词;
- 词干。
生成特征
- 正如您所指出的, tf-idf 可能是一个不错的选择。
- 一组加权特征构成一个高维向量。
指纹识别
使用simhash
或locality-sensitive-hash,您可以将高维向量转换为f-bit
指纹,例如f=64
。这正是 Google 用于检测近似重复网页的技术。
我们维护一个 f 维向量 V ,其每个维度都初始化为零。一个特征被散列成一个 f 位的散列值。这些 f 位(该特征独有)通过该特征的权重递增/递减向量的 f 个分量,如下所示:如果哈希值的第 i 位为 1,则 V 的第 i 个分量递增该特征的权重;如果哈希值的第 i 位为 0,则 V 的第 i 个分量按该特征的权重递减。处理完所有特征后,V 的某些分量为正,而其他分量为负。分量的符号决定了最终指纹的对应位。
但是,在您的情况下,您可能会发现余弦距离或欧几里德距离等其他相似性函数表现更好。simhash
如果不适合您,请尝试为您的问题找到最佳相似度函数。
查询类似文件
为每个文档生成指纹后,相似的文档应该具有相似的指纹(相似意味着它们的指纹汉明距离小)。更多详情请参考 近重复网页检测。
编辑
如果你不能做第一步,即解码,简单地计算每个唯一整数的出现仍然是可行的。您可以将 tf-idf 应用于这些唯一整数并遵循子序列步骤。
嗯有趣的问题。AFAIK 的答案是不
文本文档意味着单词 ei 同义词、搭配、后缀、前缀(词干)......
大整数字节数组 无法涵盖所有这些内容。因此,比较转换为字节数组的文件不会告诉您是否有相似的文本。
将此答案作为标题的答案。您的问题的主体相当复杂,似乎您将更多的东西混合在一起(很难理解) - 也许提出更简单的问题会有所帮助......
如果您不介意 TF-IDF 方法,布隆过滤器适合您的情况:http
://research.microsoft.com/en-us/um/people/navendu/mypapers/webdb-167.pdf
这样您就可以制作矢量任意小或大取决于您对误报的容忍度。
无论如何,看看 NLP 工具包,大多数算法都可以适应任务,问题是你如何指定相似度?
如果您可以指定不同类别的文档,那么值得研究朴素贝叶斯,或者如果您想以不同方式定义相似性 MaxEnt 模型可能适合您: http ://www.kamalnigam.com/papers/maxent-ijcaiws99.pdf