Answers:
有多种不同的处理方式,具体取决于要保留多少语义信息以及文档标记化的难易程度(html文档可能很难标记化,但是可以想象,您可以使用标签和上下文来做一些事情)
ffriend提到了其中的一些,user1133029的段落向量确实很可靠,但是我只是想对不同方法的优缺点进行更深入的探讨。
edit distance
,通常仅用于单个令牌级别(单词,双字母组等)。通常,我不建议使用这种度量标准,因为它不仅会丢弃任何语义信息,而且往往会非常相似地对待非常不同的单词更改,但是对于这种情况,它是一种极为常见的度量标准topic modeling
。LSA最近已经过时了,以我的经验,它不是最强大的主题建模方法,但是它实现起来相对简单,并且有一些开源实现topic modeling
,但是与LDA的不同之处LSA
在于,它实际上学习的是倾向于更平滑和直观的内部表示形式。通常,从中获得的结果LDA
对于建模文档相似性要比更好LSA
,但对于学习如何在主题之间进行强烈区分的效果却不那么好。LDA
,唯一的缺点是培训时间更长,而且开源实现也更难实现Count Vectorizers
和等技术产生的稀疏矢量更合理的矢量TF-IDF
。Word2vec很棒,因为它有许多开源实现。一旦有了向量,就可以在其上使用任何其他相似性度量标准(例如余弦距离),从而显着提高功效。paragraph vectors
,这是Google一系列论文中最新,最出色的,旨在研究文档的密集矢量表示形式。gensim
python中的库具有一个word2vec
非常简单的实现,可以相当合理地利用它来进行构建doc2vec
,但是如果您想走这条路线,请务必牢记许可证希望能对您有所帮助,请让我知道。
从经验上我发现,在每次尝试的每个数据集上,LSA都大大优于LDA。我已经和其他说过同样话的人谈过。它也被用来赢得许多SemEval竞赛,以衡量文档之间的语义相似性,通常与基于词网的度量结合使用,因此我不会说它过时了,或者绝对不如LDA,后者更好与某些响应者所说的相反,我的经验不是主题相似性,而是主题建模。
如果您使用gensim(一个python库),它具有LSA,LDA和word2vec,因此您可以轻松比较3。doc2vec是一个不错的主意,但是扩展性不是很好,您可能必须自己实现没有意识到任何开源实现。它不能很好地扩展,因为对于每个文档,都必须使用SGD(一种缓慢的机器学习算法)构建新的单独模型。但这可能会给您最准确的结果。LSA和LDA也不能很好地扩展(但是word2vec可以扩展),总体而言LDA的扩展性更差。但是,Gensim的实现非常快,因为它使用了迭代SVD。
另一个要注意的是,如果您使用word2vec,则仍然必须确定一种从文档组合向量的方法,因为它为每个词提供了不同的向量。最简单的方法是对每个向量进行归一化,并对文档中所有单词向量取均值,或者通过对每个单词进行idf加权获得加权均值。因此,它不如“ use word2vec”那么简单,您将需要做一些进一步的工作来计算文档相似度。
我个人会选择LSA,因为我从经验上看它运作良好,并且gensim的库可扩展性很好。但是,这里没有免费的午餐,因此最好尝试每种方法,看看哪种方法更适合您的数据。
最新的技术似乎是在最近的论文中引入的“段落向量”:http://cs.stanford.edu/~quocle/paragraph_vector.pdf。段落向量之间的余弦/欧几里得距离可能比其他方法更有效。由于缺乏开源实现,这可能尚不可行。
其次,最好的是LSA向量之间的余弦距离或原始BOW向量之间的余弦距离。有时选择不同的加权方案(例如TF-IDF)会更好。
在您的工具包中包含一组本地敏感哈希算法非常有用。这个族根本没有语义。实际上是将文本视为位序列。当同一文本多次出现但略有不同时,我发现它在脏数据集中很有用。
您可以使用ssdeep(基于Nilsimsa hash)来识别此类文档。Ssdeep最初计划用于垃圾邮件领域。垃圾邮件发送者通常会在邮件中做一些小的更改(添加空格),以防止被确切的签名(例如md5)检测到。
由于同一数据集中几乎相同文档的许多版本都会对将应用于其上的统计方法造成破坏,因此进行此类清理非常有益。