字符串分组

时间:2017-08-08 08:16:15

标签: algorithm grouping

我有一个字符串列表的可能组列表。每个字符串由几个单词组成,这些单词是字符串元素。我想根据这些元素对字符串进行分组。

每个组都基于一个常用词:组中的所有字符串都必须包含该词 - 尽管我不要求包含该词的所有字符串都在同一个组中。带有 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

是否存在针对此类问题的算法?关于采取的方法的任何指示都会有所帮助。

1 个答案:

答案 0 :(得分:2)

看起来@ m69有很好的领先优势。您的问题有一些修改:

  • 删除所有尺寸为1的套装;
  • 当一组(暂时)添加到解决方案中时,所有元素 必须从所有剩余集合中删除该集合
    • ...并删除少于两个元素的任何集合。

不幸的是,这是NP-hard, best 。如果应用程序的输入不是非常大,我会使用蛮力启发式和自由回溯。

初​​始化:

  • 可行的集合是至少包含2个元素的集合。
  • 处理您的清单。
    • 将所有可行的集合放入 S 列表中。
    • 将所有元素放入Universe, U

过程:

  1. S 中选择一组 P ;将其添加到解决方案列表中。
  2. S 中的每个剩余设置中删除 P 的所有元素。
  3. S 中删除所有不可行的集。
  4. 如果 S 为空
    • 然后如果 U 的所有元素都存在于 S 中,
      • 然后停止并报告解决方案。
      • 否则返回上一个通话级别
    • 其他[ S 不为空] 使用新的 S
    • 重复此过程
  5. 如果递归报告成功,
    • 然后返回上一个通话级别。
    • 否则请返回第1步,然后从 S
    • 中选择下一组
  6. 通过明智地订购 S 中的集合,您可以获得一些优势。我推荐一种贪心算法,其值根据 S 集合中元素的合意性进行测量。例如,出现在中只有一个集合的元素会将该集合推到列表的顶部。

    这会让你开始吗?