请问,我正在开发一个用于人员实时识别的 PoC,其关键方面之一是支持名字、中间名和姓氏的轻微拼写错误和语音变化。就像 HarinGton == HarrinBton 或 RaphEAl == RafAEl。它适用于较长的名字,但对于像 Lee 和 John 这样的名字来说有点不精确。
我在 PostgreSQL 13.3 (Supabase.io) 中通过 dmetaphone() 和 dmetaphone_alt() 使用 Double Metaphone。尽管我很欣赏 Double Metaphone,但它的结果却是(太?)短弦。 metaphone() 具有使生成的语音表示更长的参数。我调查了 dmetaphone(),除了默认函数之外找不到任何其他东西。
有没有办法让 dmetaphone() 和 dmetaphone_alt() 返回类似于 metaphone() 的更长的语音表示,但具有 ALT 变体?
任何帮助将不胜感激。
谢谢
最佳答案
查看postgres docs对于这些功能,您无法对 Double Metaphone 的编码字符串长度进行参数控制。对于单个 Metaphone 的情况,只能截断输出字符串:
max_output_length
sets the maximum length of the output metaphone code; if longer, the output is truncated to this length.
但是,使用 Trigram Similarity
可能会获得更好的结果或Levenshtein Distance
在任一变音位方法的编码输出上 - 这可能是使用变音位处理语音排列的更强大方法。
示例
考虑艺术家 Cyndi Lauper
可能的所有拼写排列,使用具有三元组相似性的双变音位,我们可以在不正确的字符串 cindy lorper
和正确的字符串之间实现 100% 的相似度拼写:
SELECT similarity(dmetaphone('cindy lorper'), dmetaphone('cyndi lauper'));
产量:真实相似度:1
(即:100% 相似度)
这意味着使用 Double Metaphone 的两个输入字符串的编码是相同的。使用 Metaphone 时,它们略有不同。以下所有内容都会产生 SNTLRPR
SELECT metaphone('cyndy lorper',10);
SELECT metaphone('sinday lorper', 10);
SELECT metaphone('cinday laurper', 10);
SELECT metaphone('cyndi lauper',10);
产量:SNTLPR
与 SNTLRPR
仅有一个字符不同
您还可以使用 Levenshtein Distance 来计算它,这为您提供了一个可过滤的参数:
SELECT levenshtein(metaphone('sinday lorper', 10), metaphone('cyndi lauper', 10));
产量:levenshtein 整数:1
It's working for longer names, but it's a bit more imprecise for names like Lee and John.
在没有更完整的 reprex 的情况下,要准确地了解您遇到的问题有点困难。 .
SELECT similarity(dmetaphone('lee'), dmetaphone('leigh'));
SELECT similarity(dmetaphone('jon'), dmetaphone('john'));
两者均产生:真实相似度:1
(即:100% 相似度)
编辑:这是一个易于理解的guide用于与 postgres 进行模糊匹配
关于postgresql - Postgresql 的语音算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69918285/