什么尝试和真正的算法建议相关的文章在那里?

kch*_*kch 23 text information-retrieval machine-learning document-classification

很常见的情况,我打赌.你有一个博客或新闻网站,你有很多文章或blags或你称之为的任何东西,你想在每个网站的底部建议其他似乎相关的东西.

让我们假设每个项目的元数据非常少.也就是说,没有标签,类别.视为一大块文本,包括标题和作者姓名.

你如何找到可能相关的文件?

我对实际的算法很感兴趣,而不是现成的解决方案,虽然我可以看看在ruby或python中实现的东西,或者依赖于mysql或pgsql.

编辑:目前的答案还不错,但我想看到更多.对于一两件事,可能有一些非常简单的示例代码.

Mer*_*son 38

这是一个非常重要的主题 - 除了人们在这里提出的答案之外,我建议您查看教学大纲中的几个信息检索课程,并查看分配给他们的教科书和论文.也就是说,这里是我自己的研究生日的简要概述:

最简单的方法称为一袋词.每个文档都缩减为稀疏的{word: wordcount}对矢量,你可以在表示你的文档集的向量集上抛出NaiveBayes(或其他)分类器,或者计算每个包和每个其他包之间的相似性得分(这称为k-最近邻分类).KNN快速查找,但需要O(n ^ 2)存储分数矩阵; 但是,对于博客来说,n不是很大.对于大型报纸大小的东西,KNN迅速变得不切实际,因此动态分类算法有时会更好.在这种情况下,您可以考虑使用排名支持向量机.SVM很整洁,因为它们不会限制您使用线性相似性度量,并且仍然非常快.

词干是词袋技术的常见预处理步骤; 这涉及在计算单词包之前减少与形态相关的单词,例如"猫"和"猫","鲍勃"和"鲍勃",或"相似"和"类似",直到它们的根.那里有许多不同的词干算法; 维基百科页面包含多个实现的链接.

如果词袋的相似性不够好,你可以将它抽象为一层N-gram相似度,在这里你可以根据词对或三元组创建表示文档的向量.(你可以使用4元组甚至更大的元组,但在实践中这没有多大帮助.)这样做的缺点是产生更大的矢量,因此分类会花费更多的工作,但你得到的匹配会更接近语法.OTOH,你可能不需要这个用于语义相似性; 对抄袭检测这样的东西更好.也可以使用分块或将文档缩减为轻量级分析树(对于树有分类算法),但这对于诸如作者身份问题("给出一个来历不明的文档,谁编写它?")更有用. ).

对您的用例可能更有用的是概念挖掘,其涉及将单词映射到概念(使用诸如WordNet的词库),然后基于所使用的概念之间的相似性对文档进行分类.这通常最终比基于单词的相似性分类更有效,因为从单词到概念的映射是还原性的,但预处理步骤可能相当耗时.

最后,还有话语解析,包括解析文档的语义结构; 你可以在语篇树上运行相似性分类器,就像在分块文档上一样.

这些都涉及从非结构化文本生成元数据; 在原始文本块之间进行直接比较是难以处理的,因此人们首先将文档预处理为元数据.


Fru*_*nsi 5

你应该阅读《集体智能编程:构建智能 Web 2.0 应用程序》(ISBN 0596529325)这本书!

对于某些方法和代码:首先问问自己,是否想要根据单词匹配找到直接相似之处,或者是否想要显示可能与当前文章不直接相关但属于同一文章集群的相似文章。

请参阅聚类分析/分区聚类

寻找直接相似性的一个非常简单(但理论上且缓慢)的方法是:

预处理:

  1. 存储每篇文章的平面单词列表(不要删除重复的单词)。
  2. “交叉连接”文章:计算文章 A 中与文章 B 中相同单词匹配的单词数。您现在有一个矩阵int word_matches[narticles][narticles](您不应该这样存储它,A->B 的相似度与 B->A 相同,因此稀疏矩阵节省了几乎一半的空间)。
  3. 将 word_matches 计数标准化为范围 0..1!(找到最大计数,然后除以任何计数) - 你应该在那里存储浮点数,而不是整数;)

查找类似文章:

  1. 从 word_matches 中选择匹配度最高的 X 篇文章