最大权重的字分区

时间:2012-04-11 16:16:02

标签: algorithm nlp dynamic-programming linear-programming

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

假设我有一个句子“快速的棕色狐狸”,并假设单词和双词都有定义的重量:“the” - > 10,“快速” - > 5,“棕色” - > 3,“狐狸” - > 8,“快速” - > 5,“快速褐色” - > 10,“棕色狐狸” - > 1

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

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

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

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

感谢。

4 个答案:

答案 0 :(得分:0)

假设组合仅由单个和双字组成:

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]

答案 1 :(得分:0)

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

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

a3=True表示我们使用的是“棕色”。由此,我们可以构建一组规则。例如,b3不能与a3a4一起使用:

(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]开始递归地逐步执行变量组合,如果违反了我们的某个规则,请尽早修剪分支。如果我们到达叶节点,输出对应于变量的权重,并保留它,如果到目前为止是最大的。这可能不是最有效的答案,但它肯定可以削减组合。

答案 2 :(得分:0)

使用位置BiggestWeight(i)i的字词来调用n-1子问题,其中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个单词要么是单个单词,要么是双字中的第一个单词。

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

答案 3 :(得分:0)

您可以非常有效地使用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])...)