我正在尝试创建一个算法来建议 Mad Gab风格短语。
输入是一组短语。我还有一组关键字,我想尽可能使用它们。目前,我的解决方案只是蛮力:
- 循环遍历短语(逐个字符)
- 如果找到关键字
- 存储关键字和分支(递归)
- 增加字符数
- 如果找到关键字
但是,我遇到的问题是:
- 考虑复合关键字,例如"catchs"可以是 "catches"、"cat"+ "cheeses"
- 允许使用字面术语 - “the”、“and”、“one”、“two”、“three”。
- 如何建议不是关键字的字词。即当找不到关键字或文字时,求助于系统字典之类的东西。
- 跳过词组。现在它只是通过一次。但请考虑以下情况:短语以不匹配的内容开头,但后面的几个字符包含匹配项。
我最熟悉 PHP 和 MySQL。但是,如果它提供更好的解决方案,我对另一种技术持开放态度。
我也对任何其他建议感兴趣。特别是使用 metaphone()
的第二个参数来提出 更难 建议的方法。
最佳答案
也许从短语库的音节划分算法开始。您甚至可以使用教 children 划分音节的简单资源来创建粗略的分隔方法:
http://www.ewsdonline.org/education/components/scrapbook/default.php?sectiondetailid=7584
如果你想要一种更技术性、更准确的方法,有一个博士学位。关于如何做的论文:
http://www.tug.org/docs/liang/
然后使用您自己滚动的东西或变音位 () 将每个音节转换为语音表示。您可以使用解释元音发音规则的类似网站。这些只是概括。如果你自己滚动,你将把元音和辅音分开处理。 Metaphone 只使用辅音,这很好,但不如你还考虑元音那么酷。
元音: http://www.eslgold.com/pronunciation/english_vowel_sounds.html 辅音: http://usefulenglish.ru/phonetics/english-consonant-sounds
然后,您就有了一本英语单词词典作为您的词库。有许多可用的开源词典,您可以将它们粘贴到 MySQL 表中。
从第一个音节开始,在字典中随机查找与 soundex 测试匹配的单词。如果找不到(这通常只能找到一个音节词),请添加其他音节并再次搜索。
例子:
“逻辑结果”
一个。音节分割
“逻辑后果”
B.元音应用
“lah gee cahl con see quince”
C.应用辅音
“lah jee kahl kon see quinse”
D. Soundtext 测试(一个音节 soundex - 显然太容易猜了,但它证明了这个概念)
“Law Gee Call Con Sea Quints”
Soundex strcmp 返回一个数字。所以如果你愿意,你可以提前得到你词库中所有东西的发音值。然后就可以快速运行strcmp了。
Soundex MySQL 比较的一个例子是:
选择 strcmp(soundex('lah'), soundex('law'));
如果您想要从大型数据库中获得随机结果并且您已经在字典表的字段中捕获了 soundex 值,那么我认为使用 MySQL soundex 比 PHP soundex 测试更容易。
我的建议可能效率低下,但优化是另一个问题。
更新:
我并不是要暗示我的解决方案只会产生一个音节词。我用一个音节作为例子,但如果你把两个音节放在一起,你会得到多音节匹配。事实上,您可能只是将所有音节拼在一起并在 mysql 中运行 soundex 开始。如果你找到答案,那太好了。但是你可以滚动音节,直到你得到最长的匹配。然后你剩下的是短语的结尾,可以将它们放在一起并进行匹配。我认为这是来自其他贡献者的以下解决方案的本质,但我认为您需要避免将所有字母无空格地塞在一起。在英语中,那样你会丢失信息。想一想以“th”音开头的短语。如果你把短语拼在一起,你就失去了需要的“th”音。 “Theremin”(乐器)的“th”发音不同于“There, a man”。
关于php - 使用 soundex() 或 metaphone() 创建 Mad Gab 风格短语的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777094/