使用分类器查找类似的HTML页面

时间:2013-03-14 05:24:21

标签: python svm scikit-learn

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

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

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

这个第一层过滤器在精确度与回忆特性方面可能不完美,但当然,虽然它可以接受精度不高(即产生相对多的误报),但它的召回不应该太小了,以免有太多有效的类似页面被遗漏。

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

背景资料:
为了支持现有的验证器逻辑,数据集中的每个HTML页面都通过将标题和正文标记为unigrams和bigrams进行预处理。如果增加的处理的计算成本与其提供的用于提高滤波器逻辑的有效性的支持相当,则欢迎对额外预处理的建议。

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

1 个答案:

答案 0 :(得分:1)

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

也就是说,你将整个文档集矢量化(应该是可行的;大规模地,考虑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 -means模型拟合到培训文档中,并选择与传入文档最相似的文档集合作为候选者。如果您符合 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有点像黑色艺术,因此可能需要反复尝试。