结合独立分数,在重复检测算法中进行总分

时间:2012-03-05 03:19:32

标签: python machine-learning scoring

我正在构建一个重复的检测器,我已经确定了一些与重复相关的因素:

我可以很容易地得到任何这些因素的0-1值,但我遇到的是如何将这些因素组合成一个聚合。

因此,例如,如果长度是现场并且标题非常相似,我可以假设它是重复的,即使引用是相当不同的,因为引用在这个语料库中是混乱的。或者你可以想象类似的事情(长度是关闭的,但其他因素都在;所有因素都很好但不是很好;等等)。

最终,我想要做的是让系统识别可能重复的文件(这部分很容易),然后我说yay或nay。当我对这些重复项进行投票时,它确定了在有效副本中应该预期的分数类型,并且在没有我或你的情况下学习如何继续进行。

2 个答案:

答案 0 :(得分:1)

您可以使用某种机器学习classification algorithm,将您的输入用作功能。

也就是说,你所要求的是一个黑盒功能,每个因素都需要0-1的分数,并给出一个关于文档对是否应被视为重复的总分。您需要根据(输入,输出)对列表选择这样的函数,其中输入是上面的四个特征(或者您认为可能有意义的任何其他特征),输出为0(不重复)或1(重复)。

这正是分类的标准设置。完成此操作的一些选项包括logistic regressiondecision treesneural networkssupport vector machines以及更多内容。

逻辑回归可能是一个不错的选择;它实现起来相当容易和快速,但也非常强大。基本上,它选择基于训练数据分配给每个维度的权重,然后通过将加权特征相加并通过逻辑函数1/(1+exp(sum))传递该总和来预测,以给出重复的概率。这相当于在您的特征选择的4维空间中选择分离超平面:如果4维输入点位于一侧,则为正,而另一侧则为负。

如果你想要一个简单的numpy实现来查看我为类分配编写的here's one的参考。


请注意,此方法仅告诉您如何进行成对比较:除非您的文档数量非常少,否则您可能不希望为每对文档执行此操作(因为模糊内容至少匹配是计算可能相当昂贵,但通过逻辑回归,实际预测相当容易)。您可能需要提出一些启发式方法来决定哪些文档会被视为重复(基于,例如,最近邻标题搜索或引文匹配或TF-IDF分数等)。

答案 1 :(得分:1)

您要求的是数据模型 - 即,如何配置数据以输入ML算法。

这是一种方法 - 可能有其他方法可以做到,但我知道这会有效:

第1步 将数据集中的每一列(例如,文档长度)映射到一个值离散变量中的连续变量或“因子”。例如,“文档长度”可以表示为“总单词”。 OP中提到的其他内容不那么简单,但仍然不难,例如,“引用”可以用比特数表示。这是在ML预处理中处理这种类型的数据的常见模式。特别是,您从阵列中的所有文档中收集所有引用,从该数组中获取唯一值,该值表示所有文章中的所有引用。该组唯一值的长度是位数组的长度。因此,对于第一个文档,如果引用#1,则索引0处的偏移量(位阵列中的第一项)设置为“1”(即,在索引0处的该位数组上调用“setbit”)。

第2步: 考虑删除由派生自其他列的数据组成的列;非正交特征可能会使您的分类器混淆;例如,摆脱“格式塔模式匹配”

第3步: 症结:通过成对,端到端连接创建转换后的数据集每个文档的数据向量与每个其他文档的向量; 如果您有100个文档,那么在转换的数据集中将有100 ^ 2个向量(实际输入到分类器的数据):

>>> d1 = [0, 1, 0, 1, 1]    
>>> d2 = [0, 0, 0, 1, 0]

>>> d12 = d1 + d2

第4步: 添加类标签 (到每个连接的向量对的末尾)你的表格数据);换句话说,如果两个文档匹配,则在向量的末尾附加“1”;如果不匹配,则追加“0”。因此,变换后的数据由n ^ 2个数据向量(n是原始数据集的大小)组成,其中每个向量是来自原始集合的两个数据向量加上类标签的端到端级联。 / p>

>>> d12 = [0, 1, 0, 1, 1, 0, 0, 0, 1, 0]    

假设d12表示的文档对被视为匹配,那么:

>>> class_label_d12 = [1]  

>>> d12 += class_label_d12

>>> d12
     [0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1]

第5步 :现在您的数据采用普通形式输入监督分类器。选择受监督的分类器(例如,MLP,决策树)并将其传递给您的训练数据。