调整单词的音标结构

问题描述

我正在努力完成以下任务:

In:国际音标中的字符串,如“ael”,允许的语音结构列表,如 ['CVCV','CVCCV','VCV','VCVCV'](而 C 表示辅音,V 表示元音)

Out:输入字符串的改编版本,基于最接近的语音结构,而只允许插入和删除,并且两次插入比一次删除便宜。对于“ael”,这将是“aCelV”(因为“ael”的音标结构是“VVC”,最接近的允许结构是“VCVCV”,因此需要在“a”和“V”之后插入“C” " 在 "l" 之后)

到目前为止,我已将任务分解为三个步骤:

  1. 将输入字符串转换为音标配置文件:“ael”->“VVC”
  2. 从语音允许的配置文件列表中找出最短的编辑距离。我用我在互联网上找到的一段代码实现了这一点。它首先根据插入和删除计算最长公共子串,然后从中计算编辑距离。我将插入与 0.4 相乘,以便两次插入比一次删除更受青睐。所以在这种情况下,它计算以下距离: 'CVCV':1.8, 'CVCCV': 2.2,'VCV':1.4, 'VCVCV':0.8,所以它选择“VCVCV”作为最短编辑距离。
    以下是上述片段:
def editdistanceWith2Ops(X,Y):
    # Find LCS
    m = len(X) 
    n = len(Y)
    L = [[0 for x in range(n + 1)] 
            for y in range(m + 1)] 
    for i in range(m + 1):
        for j in range(n + 1):
            if (i == 0 or j == 0):
                L[i][j] = 0
            elif (X[i - 1] == Y[j - 1]):
                L[i][j] = L[i - 1][j - 1] + 1
            else:
                L[i][j] = max(L[i - 1][j],L[i][j - 1])
 
    lcs = L[m][n]
 
    # Edit distance is delete operations + 
    # insert operations.
    return (m - lcs) + (n - lcs)*0.4
  1. 从初始字符串中插入和删除正确的元素。这就是我现在卡住的地方。我不知何故无法弄清楚如何提取实际的编辑步骤(在哪些位置插入“C”和“V”以及要删除哪些元素)。如果有多种方法可以编辑字符串,则应列出所有可能性。

所以我现在正在尝试找出第 3 步的解决方案,但我也不完全确定我是否使用了总体最佳方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)