我有一个庞大的句子数据库,还有一个问题,就是“我很好”这样的句子与“我很好”不匹配,反之亦然或“是我的?”当我希望它们被检测为匹配时,不匹配“是我的”,反之亦然。
我已经制作了复杂而混乱的功能,试图通过通配符和研究来实现这一点,但它只是一团糟。并且我确定必须有一种方法来搜索这个1字符的lee方式。如果我能够控制哪些角色得到这样的方式,就像在我的例子中主要的问题原因是问号和半引号。 (?')。
我目前正在使用php和mysql进行平面选择查询来进行匹配查询。
我希望得到一些帮助来解决这个问题,这样我就可以清理目前执行工作的大量代码。
如果有人想看到匹配的代码查询检查是这样的:
$checkqwry = "select * from `eng-jap` where (eng = '$eng' or english = '$oldeng' or english = '$oldeng2') and (jap = '$jap' or japanese = '$oldjap' or japanese = '$oldjap2');";
查询的目的是检查数据库中是否已经存在$ eng和$ jap的翻译。你看到$ oldeng $ oldeng2和$ oldeng3等等的原因就像我说的那样,即使有问号或者不是问号,我的混乱愚蠢尝试也是如此。其中一些$ oldeng变量有问号或半引号等等,而其他变量没有。上面添加了更多代码并删除了问号和内容。是的它是一个大混乱。
答案 0 :(得分:1)
在比较字符串之前,简单地删除非字母数字字符可能更好。
答案 1 :(得分:1)
如上所述,您希望使用String Metric算法,PHP在http://php.net/manual/en/function.levenshtein.php以及http://www.php.net/manual/en/function.similar-text.php中内置了此功能。
MySQL本身没有实现这个(特定的算法),但有些人已经开始编写存储过程来实现相同的目标:http://www.artfulsoftware.com/infotree/queries.php#552
在我看来,使用可以处理任意更改的字符串度量更好,然后删除标点符号,还可以捕获遗漏,转置等...
答案 2 :(得分:0)
您可以使用sql中的replace函数将“'”替换为“”和“?”用“”。
答案 3 :(得分:0)
您可能希望查看MySQL中的natural language full text searches。将一个FULLTEXT索引添加到eng列。
ALTER TABLE `eng-jap` ADD FULLTEXT INDEX `full` (`eng`) ;
然后,使用匹配功能:
select * from `eng-jap` where match(eng) against ('Im happy');
这将返回我很高兴和我很高兴
如果您选择相关性得分如下:
select id, match(eng) against ('Im happy') from `eng-jap` where match(eng) against ('Im happy');
您可以使用它来进一步处理PHP和过滤器中的匹配。
[编辑]:刚刚确认昨天和昨天的相关性得分也相同:
select *, match(eng) against ('yesterday') as mc from `eng-jap`
结果是:
6, yesterday?, 0.9058732390403748
7, yesterday, 0.9058732390403748
注意:要应用全文索引,您的mysql引擎必须是MyISAM。此外,句子必须包含3个以上的字符。索引似乎与“是”之类的单词不匹配。