公司 1 有这个向量:
['books','video','photography','food','toothpaste','burgers'] ... ...
公司 2 有这个向量:
['video','processor','photography','LCD','power supply', 'books'] ... ...
假设这是一个频率分布(我可以把它做成一个元组,但输入太多)。
如您所见...这些向量有重叠的部分。 “视频”和“摄影”在两个向量之间似乎是“相似的”,因为它们处于相似的位置。而且...“书籍”显然是公司 1 的强项。 排序和定位确实很重要,因为这是一种频率分布。
您可以使用什么算法来解决这个问题?使用这些向量,您可以使用哪些算法为这些公司提供有值(value)的数据?
我不熟悉文本挖掘和信息检索。有人可以指导我了解与这个问题相关的主题吗?
请您参考如下方法:
如果位置非常重要,正如您所强调的,那么关键指标将基于不同向量中相同项目之间的位置差异(例如,您可以对差异的绝对值求和,或者它们的正方形)。需要解决的大问题是——在一个向量中存在(比如第 N 个)而在另一个向量中完全不存在的项目的权重是多少。这是一个相对较小的问题——例如,就好像丢失的元素实际上是在实际元素之后出现的——还是一个非常、非常大的问题?如果不进一步了解实际应用领域,就不可能这么说。你可以尝试各种方法来处理这个问题,看看他们在你关心的示例案例中给出了什么结果!
例如,假设“丢失的元素与存在的元素大致相同,就在实际元素之后”。然后,您可以将每个输入向量预处理为字典映射项以定位(如果您必须比较多对输入向量,则至关重要的优化!):
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。
