Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 估计两个单词之间的音位相似性_Python_Algorithm_Nlp_Linguistics_Phoneme - Fatal编程技术网

Python 估计两个单词之间的音位相似性

Python 估计两个单词之间的音位相似性,python,algorithm,nlp,linguistics,phoneme,Python,Algorithm,Nlp,Linguistics,Phoneme,我正在使用卡内基梅隆大学发音词典检测Python中的押韵,我想知道:我如何估计两个单词之间的音位相似性?换句话说,有没有一种算法能够识别“手”和“计划”比“手”和“薯条”更接近押韵的事实 一些上下文:首先,我想说的是,如果两个单词的主要重读音节和所有后续音节相同(如果您想在Python中复制),那么这两个单词是押韵的: 如果我跑了 print cmu_final_sound_dict["hands"] print cmu_final_sound_dict["plans"] 我可以看出,手和计划

我正在使用卡内基梅隆大学发音词典检测Python中的押韵,我想知道:我如何估计两个单词之间的音位相似性?换句话说,有没有一种算法能够识别“手”和“计划”比“手”和“薯条”更接近押韵的事实

一些上下文:首先,我想说的是,如果两个单词的主要重读音节和所有后续音节相同(如果您想在Python中复制),那么这两个单词是押韵的:

如果我跑了

print cmu_final_sound_dict["hands"]
print cmu_final_sound_dict["plans"]
我可以看出,手和计划听起来非常相似。我可以自己估算这种相似性,但我想我应该问:有没有复杂的算法可以将数学值与这种声音(或听觉)相似性联系起来?也就是说,人们可以使用什么算法或软件包对两个单词之间的音素相似程度进行数学化?我知道这是一个很大的问题,但如果其他人能就这个问题提供任何建议,我将不胜感激。

#!/usr/bin/env python

from Levenshtein import *

if __name__ == '__main__':
    s1 = ['HH AE1 N D Z', 'P L AE1 N Z']
    s2 = ['HH AE1 N D Z', 'F R AY1 Z']
    s1nospaces = map(lambda x: x.replace(' ', ''), s1)
    s2nospaces = map(lambda x: x.replace(' ', ''), s2)
    for seq in [s1, s2, s1nospaces, s2nospaces]:
        print seq, distance(*seq)
输出:

['HH AE1 N D Z', 'P L AE1 N Z'] 5
['HH AE1 N D Z', 'F R AY1 Z'] 8
['HHAE1NDZ', 'PLAE1NZ'] 3
['HHAE1NDZ', 'FRAY1Z'] 5
图书馆:

但是,说真的,由于您只有文本作为输入,而且基本上是基于文本的CMU dict,因此您仅限于对文本输入的某种操作;但在我看来,可用的音素数量有限,因此你可以选择最重要的音素,并为它们指定“音素权重”。你所指的CMU字典中只有74个:

 % cat cmudict.06.txt | grep -v '#' | cut -f 2- -d ' ' | tr ' ' '\n' | sort | uniq | wc -l
 75
(空行75减1)

如果您在步骤2:为特定的音素组合分配权重中完成了更高级的smth,您可能会得到更好的结果。然后,您可以修改一些Levenshtein类型的距离度量,例如,在上面的库中,对文本输入提出合理执行的“音素距离”度量

第3步:利润没有太多工作。

1)通过web API或本地获取所有单词的所有TTS音频

2) 如果可以(,)提取语音特征,或者至少获取语音数据的威力

3) 根据您拥有的功能,这里有一些方法

如果你能得到语音数据(Dim=1)的每个样本(帧)的幂,一个简单的方法无疑是计算两组特征的幂

如果您有其他类型的特征,这些特征很可能具有更多的尺寸,您可以将其视为图像并查看or

4) 如果您不了解任务1、2、3的语音处理,请查看


你是在寻找类似Soundex算法()的东西吗?我不能代表downvoter发言,但给出的投票结果是,你的问题看起来很简单。你可能想重新措辞,更清楚地问“我如何做X?”而不是“我应该使用哪种工具来做X?”我认为这些问题是同义词(做某件事意味着/需要一种做那件事的方法),但如果有帮助的话,我很乐意重新措辞…@acfrancis Soundex看起来很有趣,但它看起来更像是一种散列算法,而不是一种可以估计两个词之间音素相似程度的方法。我想你是对的。不幸的是,我不知道还有其他的语音算法。Levenshtein距离会告诉你这两个单词在书写方面有多相似,但不是基于它们的发音。这完全忽略了音位特征,使得“nd”倾向于同化为“n”,而例如“nk”则没有(或倾向于“ngk”,或者实际上是经常被理解为“ngk”)。
 % cat cmudict.06.txt | grep -v '#' | cut -f 2- -d ' ' | tr ' ' '\n' | sort | uniq | wc -l
 75
#pip install pyphonetics
>>> from pyphonetics import RefinedSoundex
>>> rs = RefinedSoundex()
>>> rs.distance('Rupert', 'Robert')
0
>>> rs.distance('assign', 'assist', metric='hamming')
2