我有一个字符串列表的可能组列表。每个字符串由几个单词组成,这些单词是字符串元素。我想根据这些元素对字符串进行分组。
每个组都基于一个常用词:组中的所有字符串都必须包含该词 - 尽管我不要求包含该词的所有字符串都在同一个组中。带有 N 字词的字符串可以位于任何 N 个不同的组中。每个字符串可能只在一个组中。每个组必须至少有两个字符串。
目标:形成组以最大化组中字符串的数量(最小化“孤立”字符串)。
例如,如果我有以下字符串列表:
In [1011]: len(labels)
Out[1011]: 12000
In [1012]: %timeit pd.get_dummies(y).astype(bool)
1000 loops, best of 3: 875 µs per loop
In [1013]: %timeit pd.DataFrame({x: [x==l for l in labels] for x in set(labels)})
100 loops, best of 3: 4.97 ms per loop
In [1014]: %timeit pd.DataFrame({x : (y == x) for x in y.unique()})
1000 loops, best of 3: 1.32 ms per loop
我会将每个字符串的所有可能单词作为潜在的组。我现在想要对这些字符串进行分组,以便全部或尽可能多地进入一个组。
我尝试过天真的方法,首先使用包含最多字符串的组,在此示例中为cycle cost
pump cost
cycle analysis
cost example
,但这会使cost
没有组。
我在这个例子中寻找的结果是:
cycle analysis
是否存在针对此类问题的算法?关于采取的方法的任何指示都会有所帮助。
答案 0 :(得分:2)
看起来@ m69有很好的领先优势。您的问题有一些修改:
不幸的是,这是NP-hard, best 。如果应用程序的输入不是非常大,我会使用蛮力启发式和自由回溯。
初始化:
过程:
通过明智地订购 S 中的集合,您可以获得一些优势。我推荐一种贪心算法,其值根据 S 集合中元素的合意性进行测量。例如,出现在中只有一个集合的元素会将该集合推到列表的顶部。
这会让你开始吗?