公司1有这个载体:
['books','video','photography','food','toothpaste','burgers'] ... ...
公司2有这个载体:
['video','processor','photography','LCD','power supply', 'books'] ... ...
假设这是一个频率分布(我可以把它变成一个元组但输入太多) 正如你所看到的......这些向量有重叠的东西。 “视频”和“摄影”似乎在两个向量之间“相似”,因为它们处于相似的位置。并且......“书籍”显然是公司1的强项。 订购和定位很重要,因为这是一个频率分布。
你可以用什么算法来解决这个问题?您可以使用哪些算法为这些公司提供有价值的数据,使用这些向量?
我是文本挖掘和信息检索的新手。有人可以指导我关于这个问题的主题吗?
答案 0 :(得分:3)
我建议你出版一本名为Programming Collective Intelligence的书。
这本书是关于如何从像这样的简单数据中检索信息的一本非常好的书。包含代码示例(在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'])
答案 1 :(得分:3)
正如您所强调的那样,位置是非常重要的,那么关键指标将基于不同向量中相同项目之间的位置差异(例如,您可以将差异的绝对值相加,或者它们的方块)。需要解决的一个大问题是 - 在一个向量中对一个项目(比如它是第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。
答案 2 :(得分:2)
答案 3 :(得分:0)
正如mbg所提到的,汉明距离是一个良好的开端。它基本上为每个可能的项目分配一个位掩码,无论它是否包含在公司值中。
EG。对于公司A,牙膏是1,对于公司B,牙膏是0,然后计算公司之间不同的位数。 Jaccard系数与此相关。
汉明距离实际上无法捕捉“视频”和“摄影”之类的东西之间的相似性。显然,销售一种产品的公司销售另一种产品的可能性高于销售牙膏的公司。为此,你可以使用像LSI这样的东西(它也用于减少维数)或阶乘代码(例如神经网络的东西,如限制玻尔兹曼机器,自动编码器或可预测性最小化)来获得更紧凑的表示,然后你可以使用欧几里德距离。
答案 4 :(得分:0)
选择每个条目的等级(更高等级更好)并在匹配之间做出几何平均值的总和
两个载体
sum(sqrt(vector_multiply(x,y))) //multiply matches
每个矢量的每个值的等级总和对于每个矢量应该相同(优选1) 这样你可以在2个以上的向量之间进行比较。
如果您使用ikkebr的metod,您可以找到与b
相似的方式在这种情况下只需使用
sum( b( b.intersection(a) ))
答案 5 :(得分:-1)
您可以使用set_intersection算法。必须首先对2个向量进行排序(使用排序调用),然后传入4个迭代器,然后返回一个集合,并在其中插入公共元素。还有一些其他类似的操作。