过去几天我一直在研究soundex,metaphone和其他字符串搜索技术,据我所知,这两种算法在处理音译到英语的非英语单词时效果很好.
然而,我的要求是这样的搜索工作在原始的,非音译语言,容纳字母表,如德语,挪威语,甚至Cyrilic字母表.
有没有能够完全处理这些字母的搜索算法?或者我最好使用第三方全文搜索库,如Lucene?因此,问题就变成了"Lucene处理非英文字母吗?"
我正在尝试创建一个可以建议Mad Gab风格短语的算法.
输入是一组短语.我也有一组关键字,我想尽可能使用.目前,我的解决方案只是蛮力:
但是,我遇到的问题是:
我最熟悉PHP和MySQL.但是,如果能提供更好的解决方案,我对另一项技术持开放态度.
我也对任何其他建议感兴趣.特别是使用第二个参数metaphone()提出更难建议的方法.
我试图想出一个隐式拼写检查器,它将使用输入单词的映射到某种更一般的语音表示来解释可能发生的拼写错误,基本上对于一个会自动纠正你的拼写到一定程度的搜索栏.我一直在研究的两件事是metaphone,nysiis和soundex,但我真的不知道哪个更适合这个应用程序.
我希望优先选择更多的匹配而不是更少的匹配,我希望匹配更加通用,因此我想与soundex一起使用,这似乎是比原始的metaphone更接近的映射,但我真的不知道模糊性的差异有多大.我知道nysiis与soundex非常相似,但我不太清楚它们有多相似,或者nysiis与metaphone相比如何.
我也在寻找最快的解决方案.我知道这些语音映射器通常很快,但我不确定哪个是最快的,考虑到我希望能够在不增加搜索时间的情况下检查拼写,速度是一个考虑因素.思考?
我正在测试C#的metaphone实现,并将其结果与PHP内置的metaphone()函数进行比较.但是,我遇到了一个错误(以前在PHP的问题跟踪器中记录并在邮件列表中讨论过),但我正在尝试根据自己的个人兴趣了解其bug背后的C代码.
基本上,根据metaphone算法,-gh-的大多数实例应该是静默的.在"wright"的具体测试用例中,我期望(并使用我自己的算法生成)一个"RT"的metaphone密钥
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
Run Code Online (Sandbox Code Playgroud)
但是,PHP的metaphone功能会返回RFT.很明显,它正在将-gh-转换为F,好像它在一个单词的末尾(例如"粗略"),但在"wright"这个词的情况下,这是不正确的,因为-gh-不是在这个词的最后.查看PHP源代码发行版中的metaphone.c文件,我看到了一些关键的东西:
/* These prevent GH from becoming F */
#define NOGHTOF(c) (ENCODE(c) & 16) /* BDH */
...
/* Go N letters back. */
#define Look_Back_Letter(n) (w_idx >= n ? toupper(word[w_idx-n]) : '\0')
Run Code Online (Sandbox Code Playgroud)
然后在342行:
case 'G':
if (Next_Letter == 'H') {
if (!(NOGHTOF(Look_Back_Letter(3)) || Look_Back_Letter(4) == 'H')) {
Phonize('F');
skip_letter++;
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解NOGHTOF函数到底是做什么的,以及为什么这段代码错误地为"wright"中的-gh-呈现F?我不是一个真正的C家伙,所以代码对我来说根本不清楚.
我想自己编写Metaphone 3算法代码.有描述吗?我知道源代码可以出售,但这不是我想要的.
我想使用MetaPhone,Double Metaphone,Caverphone,MetaPhone3,SoundEx,如果有人在'R'中完成了NameX功能,那么我可以对数值进行分类和汇总,以便在分析之前最大限度地减少数据清理操作.
我充分意识到每种算法都有自己的优点和缺点,并且非常希望不使用SoundEx,但如果我找不到替代品,它仍然可以工作; 正如在这篇文章中提到的那样, Harper将与SoundEx下的任何不相关名称列表匹配,但不应该在Metaphone中以获得更好的结果匹配.
虽然我不确定哪个会最好地服务于我的目的,同时仍然保留一些灵活性,所以这就是我想要对它们中的几个进行刺穿以及在查看值之前生成如下表格的原因.

姓氏不是我初步分析的主题,但认为这是一个很好的例子,因为我想有效地考虑所有像'听起来'的单词被视为相同的值真的是我试图用简单地调用的东西作为值被评估.
我已经看过的一些事情:
所以我特意寻找答案是如何在R中运行MetaPhone/Caverphone并知道"值",以便我可以按它们对数据值进行分组?
另外需要注意的是,我仍然认为自己是R的新手,因为我不是每天的用户.
我希望能够使用Android的Speech-To-Text引擎识别句子中的各种不寻常的单词.
举一个例子,"脑电图"这个词来自STT,称为"电子供应图".当我使用Soundex或Metaphone将所说的内容与硬编码值进行比较时,该值似乎永远不会匹配或随机匹配.如果我使用阈值(Math.abs(str1.compareTo(str2))<= 1,那么匹配变得非常松散,几乎任何东西都匹配.
从本质上讲,我想做的是类似于通过背诵报价从报价数据库中查找报价.谷歌的语音转文本引擎使用的有限字集似乎更多的问题.
有任何想法吗?
我在 Elasticsearch 中使用了Metaphone和soundex编码器以及“Phonetic Token Filter”。
变音位对于英语单词很有用。
Soundex适用于英语、印地语以及许多其他语言。
我想知道哪些编码器最适合印地语以及其他印度语言(如果可能的话)?
由于Elasticsearch 网站上没有列出我们应该选择哪种语言的编码器。
还请告诉我您已经使用过哪些编码器以及用于哪种语言。
我正在使用劳伦斯飞利浦Double-Metaphone算法取得了巨大的成功,但我发现了某些组合的奇怪"意外结果".
是否有其他人对算法的其他部分添加或更改,他们不介意共享,或只是他们发现不能按预期工作的组合.
例如.我之间有问题: