【问题标题】:Phonetic Algorithms for PostgresqlPostgresql 的语音算法
【发布时间】:2021-12-23 08:21:01
【问题描述】:

拜托,我正在开发一个用于人员实时识别的 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 变化?

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 对此进行了深入研究,感觉就像 dmetaphone 实现在 postgres 中被破坏了。我永远无法返回长度超过 4 个字符的编码字符串。可能会查看代码库并尝试提出问题

标签: postgresql plpgsql phonetics supabase


【解决方案1】:

查看postgres docs 的这些功能,您无法对 Double Metaphone 的编码字符串的长度进行参数控制。在单个 Metaphone 的情况下,只能截断输出字符串:

max_output_length设置输出变音位码的最大长度;如果更长,则将输出截断到此长度。

但是,通过在任一变音位方法的编码输出上使用 Trigram SimilarityLevenshtein Distance,您可能会获得更好的结果 - 这可能是使用变音位处理语音排列的更强大的方法。

示例

考虑艺术家Cyndi Lauper 可能的所有拼写排列,使用具有三元相似性的双变音位,我们可以在不正确的字符串cindy lorper 和正确的拼写之间实现100% 的相似性:

SELECT similarity(dmetaphone('cindy lorper'), dmetaphone('cyndi lauper'));

产量:similarity real: 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);

产生:SNTLPRSNTLRPR 仅相差一个字符

您还可以使用 Levenshtein Distance 来计算它,它为您提供了一个可过滤的参数:

SELECT levenshtein(metaphone('sinday lorper', 10), metaphone('cyndi lauper', 10));

产量:levenshtein integer: 1


它适用于较长的名称,但对于名称有点不精确 像李和约翰。

如果没有更完整的reprex,要准确了解您遇到的问题有点困难。

SELECT similarity(dmetaphone('lee'), dmetaphone('leigh'));
SELECT similarity(dmetaphone('jon'), dmetaphone('john'));

两者都产生:similarity real: 1(即:100% 相似度)

编辑:这是一个易于遵循的guide,用于与 postgres 进行模糊匹配

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2020-06-18
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多