公司1有这个载体:

['books','video','photography','food','toothpaste','burgers'] ... ...

公司2有这个载体:

['video','processor','photography','LCD','power supply', 'books'] ... ...

假设这是一个频率分布(我可以使它成为一个元组但是输入太多) 正如你所看到的......这些向量有重叠的东西。 "视频"和“摄影”似乎是“相似的”在两个向量之间由于它们处于相似的位置。而且..."图书"显然是公司1的一个优势。 订购和定位很重要,因为这是一个频率分布。

你可以用什么算法来解决这个问题?您可以使用哪些算法为这些公司提供有价值的数据,使用这些向量?

我是文本挖掘和信息检索的新手。有人可以指导我关于这个问题的主题吗?

有帮助吗?

解决方案

正如您所强调的那样,位置是非常重要的,那么关键指标将基于不同向量中相同项之间的位置差异(例如,您可以将差异的绝对值相加,或者它们的方块)。需要解决的一个大问题是 - 在一个向量中对一个项目(比如它是第N个)进行权衡多少,而在另一个向量中完全不存在。这是一个相对较小的问题 - 好像缺少的项目实际上是在实际的项目之后 - 例如 - 或者真的,非常重要的?没有更多地了解实际应用领域,这是不可能的。您可以尝试各种方法来处理这个问题,看看他们在您关心的示例案例中给出了什么结果!

例如,假设“缺失的项目与其存在的大致相同,就在实际的项目之后”。然后,您可以将每个输入向量预处理为dict映射项到位置(如果必须比较多对输入向量,则需要进行关键优化!):

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

然后,比较两个这样的词:

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

(或者,abs(d)而不是最后一个语句中的平方)。为了使丢失的物品更重(制作dicts,即矢量,可以考虑更远),你可以使用两倍的长度而不是长度,或者一个大的常数,如100,在一个结构相似的程序中。

其他提示

我建议你一本名为编程集体智慧的书。这是一本非常好的书如何从像这样的简单数据中检索信息。包含代码示例(在Python中:)

修改 回复gbjbaanb:这是Python!

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

查看汉明距离

正如mbg所提到的,汉明距离是一个良好的开端。它基本上为每个可能的项目分配一个位掩码,无论它是否包含在公司值中。

EG。对于公司A,牙膏是1,对于公司B,牙膏是0,然后计算公司之间不同的位数。 Jaccard系数与此相关。

汉明距离实际上无法捕捉诸如“视频”之类的内容之间的相似性。和“摄影”。显然,销售一种产品的公司销售另一种产品的可能性高于销售牙膏的公司。

为此,你可以使用像LSI这样的东西(它也用于减少维数)或阶乘代码(例如神经网络的东西,如限制玻尔兹曼机器,自动编码器或可预测性最小化)来获得更紧凑的表示,然后你可以使用欧几里德距离。

选择每个条目的等级(更高等级更好)并在匹配之间做出几何平均值的总和

两个载体

sum(sqrt(vector_multiply(x,y)))  //multiply matches

每个矢量的每个值的等级总和对于每个矢量应该相同(优选1) 这样你可以在2个以上的向量之间进行比较。

如果您使用ikkebr的metod,您可以找到与b

相似的方式

在这种情况下只需使用

sum( b( b.intersection(a) ))

您可以使用 set_intersection 算法。必须首先对2个向量进行排序(使用排序调用),然后传入4个迭代器,然后返回一个集合,并在其中插入公共元素。还有一些其他类似的操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top