【问题标题】:Python implementation for the CYK AlgorithmCYK 算法的 Python 实现
【发布时间】:2020-11-30 05:05:36
【问题描述】:

编辑:错误是这一行if len(rhs) == 2 and rhs[0] in T[i][k] and rhs[1] in T[k + 1][j]:

我能够使用一小组规则、终端和非终端来实现基于 cky 解析器 wiki 的 cky 算法。但我对其进行了缩放以拥有更多的规则、单词、语法,现在它给了我 IndexError: list index out of range 有谁知道我在使用更大的语法集时做错了什么?

如果有帮助,这里是以前的较小规模的语法。

non_terminals = ["NP", "Nom", "Det", "AP",  
                  "Adv", "A"] 
terminals = ["book", "orange", "man",  
             "tall", "heavy",  
             "very", "muscular"] 
  
# Rules of the grammar 
R = { 
     "NP": [["Det", "Nom"]], 
     "Nom": [["AP", "Nom"], ["book"],  
             ["orange"], ["man"]], 
     "AP": [["Adv", "A"], ["heavy"],  
            ["orange"], ["tall"]], 
     "Det": [["a"]], 
     "Adv": [["very"], ["extremely"]], 
     "A": [["heavy"], ["orange"], ["tall"],  
           ["muscular"]] 
    } 

这是我的功能

def cykParse(w): n = 长度(w)

# Initialize the table 
T = [[set([]) for j in range(n)] for i in range(n)] 

# Filling in the table 
for j in range(0, n): 

    # Iterate over the rules 
    for lhs, rule in R.items(): 
        for rhs in rule: 
              
            # If a terminal is found 
            if len(rhs) == 1 and rhs[0] == w[j]: 
                T[j][j].add(lhs) 

    for i in range(j, -1, -1):    
           
        # Iterate over the range i to j + 1    
        for k in range(i, j + 1):      

            # Iterate over the rules 
            for lhs, rule in R.items(): 
                for rhs in rule: 
                      
                    # If a terminal is found 
                    if len(rhs) == 2 and rhs[0] in T[i][k] and rhs[1] in T[k + 1][j]: 
                        T[i][j].add(lhs) 

# If word can be formed by rules  
# of given grammar 
if len(T[0][n-1]) != 0: 
    print("True") 
else: 
    print("False") 

【问题讨论】:

    标签: python algorithm parsing nlp automata-theory


    【解决方案1】:

    我猜(因为你没有显示实际的错误来指示错误发生的位置)它在这一行:

    if len(rhs) == 2 and rhs[0] in T[i][k] and rhs[1] in T[k + 1][j]:
    

    kn-1。如果前两个条件为真,则第三个条件将执行并崩溃。

    我怀疑k 的迭代限制中有一个错误。一些代码 cmets 会很有用,或者至少是对您实现所基于的伪代码的引用。

    【讨论】:

    • 对不起,这是错误所在,我将其添加到问题中。我将继续尝试找出如何更改它以使该行正常工作
    • @john:你从哪里得到算法的? (即“cky parser wiki”的实际链接。您可能在谈论维基百科吗?)
    • 是的,我从en.wikipedia.org/wiki/CYK_algorithm 实现了它,有些事情我不知道该怎么做,所以我改变了它
    • @john:好的。检查您的计算以了解 k 的迭代限制。我觉得差了一个。
    • 我解决了问题,问题是 k 限制,我在检查之前添加了另一个条件以确保它没有超出范围
    猜你喜欢
    • 2023-04-11
    • 2014-06-17
    • 2013-04-07
    • 1970-01-01
    • 2018-05-10
    • 2013-03-28
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多