【问题标题】:Split sentence in words with most weight用最重的词拆分句子
【发布时间】:2012-04-03 22:21:47
【问题描述】:

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

假设我有一个句子“the quick brown fox”,并假设只有单个单词具有定义的权重:“the”-> 10、“quick”-> 5、“brown”-> 3、“fox”-> 8

在这种情况下,问题是微不足道的,因为解决方案包括添加每个单词的权重。

现在假设我们还添加了双词,所以除了上面的词,我们还有 "the quick" -> 5, "quick brown" -> 10, "brown fox" -> 1

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

我的问题是,除了明显的蛮力方法之外,还有其他可能的方法来获得解决方案吗?不用说,我正在寻找一些最佳方法来实现更大的句子。

谢谢。

【问题讨论】:

  • 所以The quick.这句话的分数是10+5+5 ?
  • 首先,句子应该包含所有单词,无论是单词还是双词。在我展示的情况下,总分是 10+10+8。请注意,分数适用于单字或双字,而不是两者。

标签: nlp combinatorics


【解决方案1】:

"the" -> 10, "quick" -> 5, "brown" -> 3, "fox" -> 8 就上面的单字来说,我拿一个数组 [10,5,3,8] 表示单词 0,1,2,3 遍历列表,得到两个分数的组合是否小于组合的分数 例如 10+5>5+快>快 5+3 快速+棕色。标记这个 等等

在标记组合解决方案时,沿连续范围标记它们。 例如 如果单词分数是 单词 = [1,2,5,3,1,4,6,2,6,8] 和 [4,6,9,7,8,2,9,1,2] 标记范围(包括两端) 是 [0,1],[2,5],[6,7]

伪代码如下

从0遍历到字长-1

if number not in range :
add word[number] to overall sum.
else:
if length of range = 1 :
    add combined_word_score [ lower_end_number]
 else if length of range = 2 :
    add combined_word_score [ lower_end_number+next number]
else if length of range > 2 and is odd number :
    add max (alternate_score_starting at lower_end_number , 
              word[lower_end]+word[higher_end]+alternate_score_starting at 
                next_number)
else if length of range > 2 and is even number :
     add max (alternate_score_starting at lower_end_number +word[higher_end],
              word[lower_end]+alternate_score_starting at 
                next_number).

【讨论】:

    【解决方案2】:

    您可以查看Integer Linear Program 库,例如lp_solve。在这种情况下,您将希望最大化分数,并且您的目标函数将包含权重。然后你可以对其进行约束,就像你不能同时拥有“quick brown”和“brown”一样。

    对于字对齐,这在paper 中使用,但您的问题比这简单得多,但您可以浏览论文以了解如何使用 ILP。除了 ILP 之外,可能还有其他算法可以用来优化解决这个问题,但 ILP 可以优化并有效地解决小问题。

    【讨论】:

    • 谢谢,这似乎对我想要实现的目标非常有用。会看一下论文,希望能找到如何将我的问题映射到这种方法中。
    【解决方案3】:

    这感觉像是一个动态编程问题。

    我可以想象句子的 k 个单词并排放置,每个单词之间都有一个灯泡(即总共 k-1 个灯泡)。如果一个灯泡打开,这意味着它旁边的单词是一个短语的一部分,如果它关闭,它们不是。因此,这些灯泡的任何配置都表示可能的重量组合。当然,许多配置甚至是不可能的,因为我们没有为他们需要的短语提供任何分数。所以 k-1 个灯泡意味着我们最多有 2^(k-1) 个可能的答案可供我们通过。

    我们可以认识到每个计算的某些部分可以重用于其他计算,而不是蛮力强制它,所以对于 (The)(quick)(brown fox ... lazy dog) 和 (The quick)( brown fox ...lazy dog),我们只能计算一次(brown fox ...lazy dog)的最高分,记住它并在下次看到它时重复使用它而无需做任何额外的工作。

    在我们开始之前,我们应该首先摆脱只能有 1 个可能值的灯泡(假设我们没有短语 'brown fox' 或任何包含该短语的更大短语,然后是灯泡'brown' 和 'fox' 之间总是必须关闭).. 每个移除的灯泡都会将解决方案空间减半。

    如果 w1、w2、w3 是单词,那么灯泡就是 w1w2、w2w3、w3w4 等。所以

    Optimal(w1w2 w2w3 w3w4 ...) = max(Optimal(w2w3 w3w4 ...) given w1w2 is on, Optimal(w2w3 w3w4 ...) given w1w2 is off)
    

    (请注意,如果我们遇到无法解决的问题,我们只需返回 MIN_INT 就可以了)

    我们可以像这样解决问题,但如果我们能够巧妙地了解我们接近灯泡的顺序,我们可能会节省更多时间。也许先攻击中心灯泡可能会有所帮助..我不确定这部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      相关资源
      最近更新 更多