问题描述
我正在努力完成以下任务:
In:国际音标中的字符串,如“ael”,允许的语音结构列表,如 ['CVCV','CVCCV','VCV','VCVCV'](而 C 表示辅音,V 表示元音)
Out:输入字符串的改编版本,基于最接近的语音结构,而只允许插入和删除,并且两次插入比一次删除便宜。对于“ael”,这将是“aCelV”(因为“ael”的音标结构是“VVC”,最接近的允许结构是“VCVCV”,因此需要在“a”和“V”之后插入“C” " 在 "l" 之后)
到目前为止,我已将任务分解为三个步骤:
- 将输入字符串转换为音标配置文件:“ael”->“VVC”
- 从语音允许的配置文件列表中找出最短的编辑距离。我用我在互联网上找到的一段代码实现了这一点。它首先根据插入和删除计算最长公共子串,然后从中计算编辑距离。我将插入与 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
- 从初始字符串中插入和删除正确的元素。这就是我现在卡住的地方。我不知何故无法弄清楚如何提取实际的编辑步骤(在哪些位置插入“C”和“V”以及要删除哪些元素)。如果有多种方法可以编辑字符串,则应列出所有可能性。
所以我现在正在尝试找出第 3 步的解决方案,但我也不完全确定我是否使用了总体最佳方法
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)