来自CMU发音数据库的押韵词典

时间:2013-04-04 22:27:51

标签: dictionary phoneme

我正在寻找一个免费或开源的押韵数据库。

我找到了CMU发音“数据库”及其系列应用,但我无法理解它们或弄清楚数据的来源。

我需要一个包含单词及其音素的简单文本文件。

这里有人知道我在哪里找到一个或我从哪里开始从CMU文件中获取这样的列表?

4 个答案:

答案 0 :(得分:5)

cmudict

cmudict是一个文本文件,它的格式非常简单。首先,列出这个词。然后,有两个空格。两个空格之后的一切都是发音。如果一个单词可能有两种不同的说话方式,你会看到两个条目,如

word
word(1)

在文件的开头,他们列出了符号和标点符号。符号之后是所述符号名称的英文拼写,它们之间没有空格。然后是两个空间分隔符和arpabet代码。由于你只是在寻找押韵,你不需要对符号部分做任何特殊的事情,因为你永远不会在寻找...ELLIPSIS

的押韵

ARPAbet

有关ARPAbet代码如何映射到IPA的信息列在维基百科http://en.wikipedia.org/wiki/Arpabet中,每个映射都显示示例单词。很容易看出这两者如何相互关联,如果您熟悉IPA,这可能有助于您了解如何阅读ARPAbet代码。

摘要

基本上,如果你已经找到了cmudict,那么你已经得到了你所要求的:一个单词及其发音的数据库。要查找押韵的单词,您必须将平面文件解析为表并运行查询以查找以相同ARPAbet代码结尾的单词。

做事物的一般理论

部分:东西

  1. 创建新数据库
  2. 在数据库中创建一个包含三个字段的表:index,word,arpabet
  3. 逐行阅读cmudict文件
  4. 对于每一行将其分成两部分,其中找到两个连续的空格AND
  5. 增加索引计数,然后插入索引号,单词和arpabet代码
  6. 然后嗯...

    一旦您将数据输入您选择的任何类型的数据库,您就可以使用该数据库查找arpabet代码之间的相关性。你可以找到押韵,灵犀,共鸣和其他助记设备。它会像

    部分:事情

    1. 得到一个你想找到押韵的词
    2. 在数据库中查询等同于
    3. 的arpabet
    4. 将arpabet代码拆分成碎片,到处都有空格
    5. 取最后一段代码,并在数据库中查询其arpabet代码最终匹配的单词
    6. 用韵律来做奇特的事情
    7. 快捷方式和剧透

      我感到无聊并写了一个Node.js模块,其中涵盖了上面列出的“Part:Stuff”。如果您已在计算机上安装了Node.js,则可以通过运行npm install cmudict-to-sqlite来获取该模块。有关自述文件,请参阅https://npmjs.org/package/cmudict-to-sqlite或仅查看模块中的文档。

答案 1 :(得分:2)

使用CMU Pronouncing Dictionary

的Rhyme Logic

行。假设您要使用CMU Pronouncing Dictionary数据(示例文件:cmudict-0.7b)来构建与" LOVE"押韵的所有单词的列表。

以下是如何做到的:

首先,你需要学习" LOVE"的发音。你会在字典中找到这一行,其中" LOVE"和" L AH1 V"由两个空格分隔:

LOVE  L AH1 V

这就是说LOVE这个词的发音类似于L AH1 V

然后,找到有主要压力的元音音素。换句话说,寻找数字" 1"在那个发音。直接位于1左侧的文本是具有主要压力(AH)的元音。那段文字,以及它右侧的一切都是你的韵律音符" (因缺乏更好的术语)。所以LOVE的押韵音素是AH1 V

我们已经完成了一半!现在我们只需要找到其发音以AH1 V结尾的其他单词。如果您在Notepad ++中进行游戏,请使用"正则表达式"的搜索模式尝试查找模式AH1 V$的当前所有文档。这将匹配如下行:

Line 392: ABOVE  AH0 B AH1 V
Line 10266: BELOVE  B IH0 L AH1 V
Line 30204: DENEUVE  D IH0 N AH1 V
Line 30205: DENEUVE(1)  D IY0 N AH1 V
Line 34064: DOVE  D AH1 V
Line 48177: GLOVE  G L AH1 V
Line 49053: GOV  G AH1 V
... etc
押韵喔!

有很多方法可以实现这一点,以及大量的角落案例,但这大致是许多电子押韵词典在寻找完美押韵时所采取的方法。

存储押韵数据的假设SQL方法

显然,如果你每次有人想要押韵时只是扫描字典,性能就会成为一个问题。如果这是一个问题,您可能会尝试以不同方式存储或索引数据。

虽然它不是最有效的磁盘空间,但我已经很好地将这些内容存储在带有索引列的SQL表中。

对于一个简单的概念示例,您可以计算"押韵音素"在字典中的所有单词,然后将它们插入到" Rhymes"列为{WordText,RhymePhonemes}的表。例如,您可能会看到以下记录:

{"ABOVE", "AH1 V"}
{"DOVE", "AH1 V"}
{"OUTLIVE", "IH1 V"}
{"GRADUATE", "AE1 JH AH0 W AH0 T"}
{"GRADUATE", "AE1 JH AH0 W EY2 T"}

...等

然后,要查找押韵,您可以发出如下查询:

SELECT OTHER.WordText
FROM Rhymes INPUT
     INNER JOIN Rhymes OTHER ON OTHER.RhymePhonemes = INPUT.RhymePhonemes
WHERE INPUT.WordText = 'love' AND
      OTHER.WordText <> INPUT.WordText
ORDER BY OTHER.WordText

如果您计划打印一个字典,将所有类似发音的单词组合在一起,这也会派上用场。

当然,还有很多其他方法来存储/搜索不同权衡的数据,但希望这可以让你开始。

我还有一些运气将原始发音存储在数据库中的各种各样的&#34; full&#34;格式(发音的正向和反向弦,带有应力标记和没有应力标记等)但不是&#34;切断&#34;像韵 - 音素列一样特定的部分。

陷阱

再一次,原来的解释是&#34;爱&#34;绝对会让你进入押韵的球场。但是,在此过程中,您可能会遇到其他问题需要考虑。这是一个单挑:

  1. 有些单词有多个发音。在CMU词典中,备用发音标记为(1)(2)等文字,如GRADUATE(2)中的单词一样。如果有人想要这些单词的押韵,你必须决定显示所有匹配发音的押韵,或让用户选择他们真正意义上的发音。
  2. 当发音有两个或更多&#34; 1&#34; s时,你会怎么做?选择第一个?选最后一个?如果你选择最后一个,你会发现更多的押韵,但它可能不是最自然的压力选择。
  3. 当发音没有&#34; 1&#34; s时你会怎么做?它并没有发生很多,但它发生了,如:ACCREDIT AH0 K R EH2 D AH0 TAIKIN EY0 K IH0 N。在这种情况下,我选择下一个最佳压力(例如,如果1不存在则选择2,3,4等)。如果他们都是0,那么我没有任何好的建议。
  4. 缺少一些发音。这是一个很好的开始,但它并没有你想要的所有单词或拼写单词。美国拼写比英国拼写​​更受欢迎。
  5. 有些发音不是你所期望的,你可能想要修剪。例如,有&#34;或&#34;的发音。这听起来像&#34;呃&#34;。
  6. 您可能想要比较&#34;押韵音素&#34;去除了压痕。这只对主要压力不在最后一个元音上的单词很重要(所以你不会在&#34;爱&#34;例子中看到问题)。

答案 2 :(得分:0)

我现在正在使用Plate建议的一般方法并对其进行扩展,正在积极地进行此类工作。 Here's my source code.希望对您有所帮助!

答案 3 :(得分:-1)

如果您只使用一个小的演示子集,您可以随时使用http://www.rhymezone.com/并搜索单词然后将其押韵匹配放入文本文件中。如果你想要一个完整的单词数据库。您可以将字典连接到zombieJS UI自动化,然后屏幕抓取单词并将它们放入您自己的数据库中。这将允许您创建自己的押韵数据库。虽然说实话,这对你的原始请求是一项承诺