postgresql - Postgresql 的语音算法

标签 postgresql plpgsql phonetics supabase

请问,我正在开发一个用于人员实时识别的 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);

产量:SNTLPRSNTLRPR 仅有一个字符不同

您还可以使用 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/

相关文章:

sql - array_agg() 函数的返回类型

c# - 使用 C# 程序从 praat 获取值

sql - 在 postgresql ...query... 中加入两个单独的查询(可能或不可能)

postgresql - 分析 SQL 查询的工具

postgresql - PL/pgSQL 9.3.5 中不计算简单算术表达式

java - 使用 Sphinx4 将单词转换为语音发音

matlab - 从现有音频样本中合成元音jin matlab

postgresql - 如何在 arch Linux 中安装 uuid-ossp postgresql 扩展

postgresql - 是QL/pgsql "could not determine data type of parameter $1"

sql - 如何从所有模式中删除函数