-1

我正在尝试根据标题和正文的内容查找类似的 HTML 页面。相似,我的意思是语义相似,即与相同的内容/主题/主题相关。

我有一个可靠的“验证器”方法来断言一对HTML 页面的语义接近性,即一次只为两个 HTML 页面工作。然而,该数据集包含大约 100 万个 HTML 页面,并且比较两个页面的所有可能组合是非常不可行的......

因此,我正在寻找一种相对快速但不完美的“分类器”来为基于对的验证器生成“候选者”列表。这样的分类器/过滤器会从数据集中生成一个 [相对较短的] HTML 页面列表,这些页面可能在语义上接近给定的 HTML 页面。然后,第一层过滤器的输出将成对地馈送到现有的验证器方法,以生成与参考页面有效相似的 HTML 页面子集。

就其精度与召回特性而言,第一层过滤器可能不完美,但当然,虽然它的精度差是可以接受的(即产生相对较多的误报),但它的召回率不应该太小,以免遗漏太多有效相似的页面。

选择这些候选人的最佳方式是什么?

背景信息:
为了支持现有的验证器逻辑,数据集中的每个 HTML 页面都经过预处理,将标题和正文标记为一元和二元。如果添加处理的计算成本与其为提高过滤器逻辑的有效性提供的支持相称,则欢迎提出额外预处理的建议。

虽然,虽然这可能对第一层过滤器的设计影响不大,但“验证器”的工作原理如下:
对于一对 HTML 页面,我正在生成与它们对应的特征向量并将其提供给分类器,所以以获取它们是否相似。
我使用 python 进行编码,使用 SVM 作为分类器。

4

1 回答 1

1

这是一项无监督的任务,而不是分类任务。我要尝试的第一件事是对从页面构建的 tf-idf 向量进行简单的旧余弦相似度(即老式信息检索)。

即,您将矢量化整个文档集(应该是可行的;在大规模情况下,考虑 a HashingVectorizer)以获得一个矩阵Xtrain,然后使用相同的矢量化器对传入的文档进行矢量化以产生Xnew,确保两者都是 CSR 格式(散列处理这也是)并计算它们之间的余弦相似度:

cosine_sim = (Xtrain * Xnew.T).toarray()

这是一个相似度分数的n_train×n_new矩阵。您可以通过与测试文档的相似性对训练文档进行排序i

most_similar = np.argsort(cosine_sim[:, i])[::-1]
candicates = most_similar[:100]  # or however many you desire

另一种方法是将k均值模型拟合到训练文档,并选择与传入文档最相似的文档集群作为候选。如果你有一个k -means 模型km,那就是:

# get closest clusters for new documents
closest = km.predict(Xnew)

并且对于每个文档/行Xnew[i, :]np.where(km.labels_ == closest[i])给出候选人。

考虑使用MiniBatchKMeans; scikit-learn 的前沿版本可以处理非常大的文档集。设置参数n_clusters有点像魔法,因此可能需要反复试验。

于 2013-03-15T11:08:41.840 回答