Algorithm 具有最大权重的字分区

Algorithm 具有最大权重的字分区,algorithm,nlp,dynamic-programming,linear-programming,Algorithm,Nlp,Dynamic Programming,Linear Programming,我正在做一个游戏,我需要找到一个特定句子的最大权重 假设我有一个句子“快速棕色狐狸”,并假设单字和双字都有其定义的权重:“the”->10,“quick”->5,“brown”->3,“fox”->8,“quick”->5,“quick brown”->10,“brown fox”->1 我想知道哪个单字和双字组合的权重最大,在这种情况下是“the”,“quick brown”,“fox”(权重=28) 我被告知这个问题可以通过线性规划来解决,但我不知道如何实现这种方法。具体来说,我不知道如何表

我正在做一个游戏,我需要找到一个特定句子的最大权重

假设我有一个句子“快速棕色狐狸”,并假设单字和双字都有其定义的权重:“the”->10,“quick”->5,“brown”->3,“fox”->8,“quick”->5,“quick brown”->10,“brown fox”->1

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

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

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

此外,任何其他方法(不涉及线性规划或暴力)也将受到欢迎


谢谢。

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

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]

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

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^7
可能的组合-让我们看看是否可以减少这种组合。为了方便起见,让我们映射变量:

the quick brown fox -> (a1, a2, a3, a4)
the quick   -> b1
quick brown -> b2
brown fox   -> b3
其中
a3=True
表示我们使用的是“brown”。由此,我们可以构造一组规则。例如,
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]
开始,递归地逐步遍历变量组合,如果分支违反了我们的规则之一,则尽早修剪分支。如果我们到达一个叶节点,输出与变量相对应的权重,如果它是迄今为止最大的,则保持它。这可能不是最有效的答案,但它肯定可以减少组合。

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

the quick brown fox -> (a1, a2, a3, a4)
the quick   -> b1
quick brown -> b2
brown fox   -> b3
其中
a3=True
表示我们使用的是“brown”。由此,我们可以构造一组规则。例如,
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]
开始,递归地逐步遍历变量组合,如果分支违反了我们的规则之一,则尽早修剪分支。如果我们到达一个叶节点,输出与变量相对应的权重,如果它是迄今为止最大的,则保持它。这可能不是最有效的答案,但它肯定可以减少组合。

调用
最大权重(i)
从位置
i
n-1
的子问题,其中
n
是字数

  • 您的问题是找到
    最大权重(0)

  • 基本大小写为
    BiggestWeight(n)
    ,等于
    0
    ,因为单词列表为空, 和
    BiggestWeight(n-1)
    ,等于
    weight(n-1)
    ,因为只有一个单词的列表只有一个选项

  • 子问题之间的关系是:
    BiggestWeight(i)=max(权重(i)+BiggestWeight(i+1),成对(i,i+1)+BiggestWeight(i+2))
    因为
    i
    -第四个单词要么是单个单词,要么是双单词中的第一个

因此,如果这些值存储在一个大小为
n+1
的表中,结果可以在
O(n)
中找到,调用
BiggestWeight(i)
从位置
i
n-1
的单词子问题,其中
n
是单词数

  • 您的问题是找到
    最大权重(0)

  • 基本大小写为
    BiggestWeight(n)
    ,等于
    0
    ,因为单词列表为空, 和
    BiggestWeight(n-1)
    ,等于
    weight(n-1)
    ,因为只有一个单词的列表只有一个选项

  • 子问题之间的关系是:
    BiggestWeight(i)=max(权重(i)+BiggestWeight(i+1),成对(i,i+1)+BiggestWeight(i+2))
    因为
    i
    -第四个单词要么是单个单词,要么是双单词中的第一个


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

中找到结果。您可以在此处非常有效地使用DP

设F为最大权函数,句子为w1 w2 w3。。工作

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


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

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

设F为最大权函数,句子为w1 w2 w3。。工作

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

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