python - 使用最大和给定跨度的最佳解析树

标签 python list algorithm dictionary tree

我想找到一种方法,通过对每棵树的跨度得分求和来对每棵树进行评分,并选择得分最高的二叉树,通过回溯来最大化总和。

假设我有以下句子:

string = "Revenue was 19.9 million"

spans 数组表示对应 (i, j) 位置处的 span 分数。这里:j=i+1

例如,

score(0, 1) = -100.0 对应于范围 "Revenue";

score(0, 4) = 100.0 对应于跨度“收入为 1990 万”

score(1, 4) = 100.0 对应于跨度“为 1990 万”

等等...

                                               #  1 2 3 4
spans = [[-100.0, -100.0, -100.0,  100.0],     # 0
         [ 0,     -100.0, -100.0,  100.0],     # 1
         [ 0,       0 ,   -100.0,  100.0],     # 2
         [ 0,       0,      0,    -100.0]]     # 3
         

预期的树是 - (Revenue (was (1990 万))) 对应于跨度 (0, 4), (1, 4) , (2, 4)

尽管如此,我得到 - (收入为 1990 万),代码如下。

我尝试这样做:

class MaxSpanCalculator:

    def __init__(self, s, spans):
        self.sentence = s.split(" ")
        self.spans = spans
        self.splits = []

    def get_max_span_sentence(self):
        n = len(self.sentence)
        # Initialize the splits array
        for i in range(n):
            s = []
            for j in range(n):
                s.append(-1)
            self.splits.append(s)

        # Here Using spans array itself as dp array
        for l in range(1, n+1):
            i = 0
            j = i + l - 1
            while j<n:
                if i!=j:
                    for p in range(i,j):
                        if self.spans[i][j] < self.spans[i][p] + self.spans[p+1][j]:
                            self.splits[i][j] = p
                            self.spans[i][j] = self.spans[i][p] + self.spans[p+1][j]
                i = i + 1
                j = j + 1

        print("Max span value: " + str(self.spans[0][n-1]))
        print("Max span sentence is : " + self.get_sentence(0, n-1))

    def get_sentence(self, start, end):
        # print(str(start) + " " + str(end))
        if start==end: return self.sentence[start]
        if self.splits[start][end] == -1:
            return " ".join(x for x in self.sentence[start:end+1])
        return "(" + self.get_sentence(start, self.splits[start][end]) + ")" + "(" + self.get_sentence(self.splits[start][end]+1, end) + ")"

最佳答案

这是一个动态规划问题。

首先,您希望将文本字符串转换为单词数组。因为这就是你的成本。

其次,您需要计算两个数据结构。

  1. aggregate_cost[(start, end)] 是从 startend 区间的最佳解析的总成本。<
  2. best_parse[(start, end)] 是从 startend 区间的最佳解析。

与所有动态规划问题一样,有自上而下和自下而上的方法来解决。无论哪种方式,关键的见解是总成本是以下各项中最大的:

cost(start, end),
cost(start, end) + aggregate_cost[(start, i)],
cost(start, end) + aggregate_cost[(i+1, end)],
cost(start, end) + aggregate_cost[(start, i)] + aggregate_cost[(i+1, end)]

其中i可以是startend之间的任意位置。而 best_parse[(start, end)] 取决于您选择的其中一个(当然,还有选择了总成本的子区间的 best_parse)。

关于python - 使用最大和给定跨度的最佳解析树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65051421/

相关文章:

Python-带有打印的递归

algorithm - 指数运行时间对计算机有什么影响?

arrays - 给定两个数组,每个数组包含 n 个已排序元素,是否有 O(log n) 时间算法来查找所有 2n 个元素的中位数?

python - 为什么将列表与整数进行比较不会出错?

python - 用另一个数组的子集切片 1d numpy 数组

python - 使用Django South从具体继承走向抽象继承

python - 如何在同一窗口中同时显示和更新两个 matplotlib 图?

Python:将员工姓名与公司、年龄、性别相匹配

java - 如何计算 map 跨度/缩放以在视口(viewport)中包含一组 GeoPoints?

python - 来自 Pandas 的 groupby 是可交换的吗?