【问题标题】:Word partitions with maximum weight最大权重的词分区
【发布时间】:2012-04-11 16:16:02
【问题描述】:

我正在开发一款游戏,我需要找到特定句子的最大权重。

假设我有句子“the quick brown fox”,并假设单词和双词都有其定义的权重:“the”-> 10、“quick”-> 5、“brown”-> 3、“fox” -> 8, "the quick" -> 5, "quick brown" -> 10, "棕狐" -> 1

我想知道单字和双字的哪个组合提供的权重最大,在这种情况下是“the”、“quick brown”、“fox”(权重 = 28)

有人告诉我这个问题可以通过线性规划来解决,但我看不到如何实现这种方法。具体来说,我不知道如何表达问题的约束,在这种情况下,一些双词不能与包含的单个词组合(即“快速”不能与任何一个组合) "the" 或 "quick")

有人可以就如何解决这个问题提供一些指导吗?我不是该领域的专家,并且对 Simplex 的工作原理有一些基本的了解(从学校回来),但我缺乏关于如何为此类问题建模的知识。

此外,任何其他方法(不涉及线性编程或蛮力)也将受到欢迎。

谢谢。

【问题讨论】:

    标签: algorithm nlp dynamic-programming linear-programming


    【解决方案1】:

    假设组合只包含单字和双字:

    int single[n];//if we choose i-th word : single[i]
    int doubles[n];//if we choose the i-th and i+1-th word as a combination : doubles[i], the last word has the same value for it's single and doubles
    
    int dp[n+2];//dynamic programming
    dp[n] = dp[n+1] = 0;//bottom up
    
    for(int i=n-1;i>=0;i--)
    {
        dp[i]=max(dp[i+1]+single[i],dp[i+2],double[i];
    }
    //the maximum value is dp[0]
    

    【讨论】:

      【解决方案2】:

      您的示例问题的蛮力方法涉及2^7 可能的组合 - 让我们看看我们是否可以减少这种情况。为方便起见,让我们映射变量:

      the quick brown fox -> (a1, a2, a3, a4)
      the quick   -> b1
      quick brown -> b2
      brown fox   -> b3
      

      a3=True 表示我们使用的是“棕色”。由此,我们可以构造出一套规则。比如b3不能和a3或者a4一起使用:

      (a1:b1)     (b1:a1,a2)
      (a2:b1,b2)  (b2:a2,a3)
      (a3:b2,b3)  (b3:a3,a4)
      (a4:b3)
      

      现在从数组S=[a1=0,a2=0,...,b3=0] 开始递归遍历变量组合,如果分支违反了我们的规则之一,则尽早修剪它。如果我们到达一个叶子节点,则输出与变量对应的权重,如果是迄今为止最大的,则保留它。这可能不是最有效的答案,但肯定可以减少组合。

      【讨论】:

        【解决方案3】:

        使用从位置in-1 的单词调用BiggestWeight(i) 子问题,其中n 是单词数。

        • 你的问题是找到BiggestWeight(0)

        • 基本情况是BiggestWeight(n),等于0,因为单词列表是空的, 和BiggestWeight(n-1),等于weight(n-1),因为一个单词的列表只有一种选择。

        • 子问题之间的关系是: BiggestWeight(i) = max(weight(i)+BiggestWeight(i+1), pairWeight(i,i+1)+BiggestWeight(i+2) ) 因为i-th 字要么是单字,要么是双字的第一个字。

        因此,如果将值存储在大小为n+1 的表中,则可以在O(n) 中找到结果。

        【讨论】:

          【解决方案4】:

          您可以在这里非常有效地使用 DP。

          令F为最大权重函数,令句子为w1 w2 w3 .. wk

          让 G( [w1 w2 ..]) 返回组合的字典权重。

          F([w1 w2 w3...wk]) = Max( G([w1])+ F([w2 w3...wk]), G([w1, w2])+ F([w3 w4...wk]) ... )

          【讨论】:

            猜你喜欢
            • 2011-04-26
            • 2020-07-27
            • 2017-06-03
            • 2016-10-29
            • 1970-01-01
            • 2018-11-27
            • 2016-07-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多