我查看了《智能网络的算法》,书中第55页描述了一种有趣的算法——称为DocRank,用于为商业文档(例如没有链接的PDF、MS Word文档等)创建类似于PageRank的评分。简而言之,它分析集合中每个文档之间的术语频率交集。
还有其他人能否指出其他地方描述的有趣算法,或者在这里分享一些新颖的算法,用于这些类型的文档以改进搜索结果?
请避免涉及点击跟踪或其他与分析实际文档无关的答案。
回答:
第一种技术:逐步相似性
我可以提供一个例子——我实际上已经对真实数据进行了测试/验证。如果你收集了许多技术,并根据两个轴对它们进行排名——固有的复杂性或实施的难易程度以及性能(分辨率或预测准确性),这种技术在第一个轴上排名较高,在第二个轴上排名居中;这是一种简单而有效的技术,但可能在面对最先进的技术时表现不佳。
我们发现,低频关键词交集与文档阅读者/观众的相似性相结合,是文档内容的相当强有力的预测指标。换句话说:如果两个文档有一组非常低频的术语(例如,特定领域的术语,如“决策流形”等)相似,并且它们有相似的入站流量模式,这种组合强烈表明文档的相似性。
相关细节如下:
第一过滤器:低频术语。我们解析了一大组文档以获取每个术语的频率。我们使用这个词频谱作为“指纹”,这很常见,但我们应用了逆向加权,使得常见术语(如“a”、“of”、“the”)在相似性度量中几乎不计,而罕见术语则计入很多(这很常见,你可能知道)。
仅根据这一点来判断两个文档是否相似是有问题的;例如,两个文档可能共享一组与MMO相关的罕见术语,但文档仍然不相似,因为一个是针对玩MMO的,另一个是针对设计MMO的。
第二过滤器:读者。显然我们不知道谁读过这些文档,所以我们从流量来源推断读者的情况。你可以看到这在上面的例子中是如何帮助的。MMO玩家网站/文档的入站流量反映了内容,同样适用于针对MMO设计的文档。
第二种技术:核主成分分析(kPCA)
kPCA是一种无监督技术(在数据传入之前,类标签已从数据中移除)。该技术的核心只是基于特征向量的矩阵分解(在这种情况下是协方差矩阵)。这种技术通过核技巧处理非线性问题,核技巧只是将数据映射到更高维的特征空间,然后在该空间中执行PCA。在Python/NumPy/SciPy中,这大约需要25行代码。
数据是从对文学作品的简单文本解析中收集的——特别是,这四位作者的大部分已出版作品:莎士比亚、简·奥斯汀、杰克·伦敦、弥尔顿。(我相信,尽管我不确定,普通大学生会参加课程,在这些课程中他们被分配阅读这些作者的小说。)
这个数据集在机器学习中被广泛使用,并且可以在网络上的许多地方找到。
因此,这些作品被分成872个部分(大致对应于小说中的章节);换句话说,每位作者大约有220个不同的实质性文本片段。
接下来,对合并的语料文本进行了词频扫描,并选择了研究中最常见的70个词,其余的频率扫描结果被丢弃。
这70个词是:
[ 'a', 'all', 'also', 'an', 'and', 'any', 'are', 'as', 'at', 'be', 'been', 'but', 'by', 'can', 'do', 'down', 'even', 'every', 'for', 'from', 'had', 'has', 'have', 'her', 'his', 'if', 'in', 'into', 'is', 'it', 'its', 'may', 'more', 'must', 'my', 'no', 'not', 'now', 'of', 'on', 'one', 'only', 'or', 'our', 'should', 'so', 'some', 'such', 'than', 'that', 'the', 'their', 'then', 'there', 'things', 'this', 'to', 'up', 'upon', 'was', 'were', 'what', 'when', 'which', 'who', 'will', 'with', 'would', 'your', 'BookID', 'Author' ]
这些成为了字段(列)名称。最后,准备了一行对应于872个文本的数据(来自截断的词频扫描)。这是一个数据点:
[ 46, 12, 0, 3, 66, 9, 4, 16, 13, 13, 4, 8, 8, 1, 0, 1, 5, 0, 21, 12, 16, 3, 6, 62, 3, 3, 30, 3, 9, 14, 1, 2, 6, 5, 0, 10, 16, 2, 54, 7, 8, 1, 7, 0, 4, 7, 1, 3, 3, 17, 67, 6, 2, 5, 1, 4, 47, 2, 3, 40, 11, 7, 5, 6, 8, 4, 9, 1, 0, 1 ]
总之,数据由70个维度组成(每个维度是一个特定词在给定文本中的频率或总数,这些文本来自这四位作者之一)。
再次强调,虽然这些数据主要用于有监督分类(类标签的存在是有原因的),但我使用的技术是无监督的——换句话说,我从未向算法展示类标签。kPCA算法完全不知道这四个不同的聚类(如下图所示)对应什么,也不知道它们彼此如何不同——算法甚至不知道数据由多少组(类)组成。我只是给了它数据,它根据固有的排序非常整齐地将其划分为四个不同的组。
结果如下:
再次强调,我在这里使用的算法是kPCA。使用Python、NumPy和Matplotlib,生成这些结果的脚本大约有80行代码——用于IO、数据处理、应用kPCA和绘制结果。
不多,但对于SO帖子来说太多了。无论如何,任何想要这个代码的人都可以从我的仓库中获取它。同时,在这些Python包中也有一个完整的、文档齐全的用Python + NumPy编写的kPCA算法(所有这些都可以在mloss.org获得):shogun(“大规模机器学习工具箱”)、’sdpy(一组针对计算机视觉和机器学习的模块),以及mlpy(“Python中的机器学习”)。