如何使用mysql找到与单词后半部分匹配的部分字符串?

时间:2017-01-10 06:51:26

标签: mysql string matching

你好,我正在为完整的单词创建一个单词rhymer,但我坚持逻辑。

我将cmu词典文本导入了两列,即word和arpabet。这就是我到目前为止所做的:

Code:
Select word, arpabet from cmudict 
where word LIKE "%dove" and substring_index(arpabet, ' ', -2) in
(Select substring_index(arpabet, ' ', -2) from cmudict);

Output (1 row returned):
word    arpabet
'DOVE', 'D AH1 V'

我正在寻找其arpabet与最后2个间隔分隔符中的'AH1 V'匹配的单词,因此它会给我一个单词列表,听起来像'DOVE'而忽略了压力数(ah1,ah2) :

输出我正在寻找:

  • 'STRANGELOVE','S T R EY1 N JH L AH2 V'
  • 'LABOVE','L AH0 B AH1 V'
  • 所有其他类似的声音,如爱情,手套等......

我已经尝试更改LIKE'%ove',但是会生成一个正确和错误匹配的列表,其中包含来自word列的类似后缀,因为它忽略了相应的arpabet。

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

如果您尝试获取与声音匹配的字词,那么我认为您应该与列arpabet匹配,而不是与word匹配。

SELECT word, arpabet FROM cmudict 
WHERE REPLACE(REPLACE(REPLACE(substring_index(arpabet, ' ', -2),'0',''),'1',''),'2','') in
(SELECT REPLACE(REPLACE(REPLACE(substring_index(arpabet, ' ', -2),'0',''),'1',''),'2','') 
FROM cmudict WHERE word = "dove");

打破它:

  1. REPLACE(REPLACE(REPLACE(将消除任何声音中的0,1,2。因为你不想与数字相匹配(压力)。看起来有点难看,但它完成了。
  2. substring_index(arpabet, ' ', -2)保持不变,但现在它在REPLACE中。
  3. 子查询将获得没有数字的arpabet,即“DOVE'”。如果单独运行此子查询,则应返回' AH V'。