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

Python 使用分类器查找相似的HTML页面,python,svm,scikit-learn,Python,Svm,Scikit Learn,我试图找到类似的HTML网页的基础上的标题和正文的内容。所谓相似,我指的是语义相似,即与相同的内容/主题/主题相关 我有一个可靠的“验证器”方法来断言一对HTML页面的语义接近性,即一次只处理两个HTML页面。然而,数据集包含大约100万个HTML页面,比较两个页面的所有可能组合是不可能的 因此,我正在寻找一个相对快速但不完美的“分类器”,为基于对的验证器生成“候选对象”列表。这种分类器/过滤器将从数据集中生成一个[相对较短的]HTML页面列表,这些页面在语义上可能与给定的HTML页面相近。然后

我试图找到类似的HTML网页的基础上的标题和正文的内容。所谓相似,我指的是语义相似,即与相同的内容/主题/主题相关

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

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

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

选择这些候选人的最佳方式是什么? 背景信息:
为了支持现有的验证器逻辑,数据集中的每个HTML页面都通过将标题和正文标记为Unigram和Bigram进行了预处理。如果增加的处理的计算成本与它为提高过滤逻辑的有效性提供的支持相称,则欢迎对额外预处理的建议

虽然,和“虽然这可能对第一层过滤器的设计影响不大,“验证器”的工作原理如下:
对于一对HTML页面,我将生成一个对应于它们的特征向量,并将其提供给分类器,以获得它们是否相似

我使用python进行编码,使用SVM作为分类器。

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

即,您可以将整个文档集向量化(应该是可行的;大规模地考虑A)得到一个矩阵<代码> xCals>代码>,然后使用相同的矢量化器对传入的文档进行矢量化,生成<代码> Xnew < /代码>,确保两者都是CSR格式(散列也要注意这一点),并计算它们之间的余弦相似性:

cosine_sim = (Xtrain * Xnew.T).toarray()
这是一个
n_序列
×
n_新的
相似性得分矩阵。您可以按照与测试文档
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。其中(km.labels.==最近的[i])
给出了候选文档


考虑使用;scikit learn的最新版本可以处理非常大的文档集。设置参数
n\u clusters
有点像黑工,因此可能需要反复试验。

您的问题不太清楚。你的问题是为你的受监督机器学习者准备一个训练数据集吗?你为什么需要成对地输入HTML页面?对于有监督或无监督分类器,这似乎不适合任何典型的工作流。通常,在分类器加载/训练了多个项目后,可以向其输入一个项目,并反过来提供该新项目与训练期间建模的各种类别/项目群的接近度@mjv:是的,你的总结是对的。有100多万个HTML页面,它们经过预处理,将标题和正文标记为单字和单字bigrams@user2115183:鉴于您在这些评论中所作的澄清,我冒昧地对这个问题进行了彻底的修改。”试图增加流量/回答这个非常有趣的问题。如果我不知何故泄露了你问题的实质,请随时回复到你的原始版本或进行你认为合适的编辑。事实上,当我重新阅读其中一条评论时,我现在有一些疑问:
创建的单个特征向量对应于一对HTML文件。。。想要告诉我给定给它的特征向量是属于一对相似的HTML文件还是不同的。
验证器是否返回布尔值(相似或不相似)?或者它是否返回一个数字值来度量它们的相似程度?