Joh*_*ied 5 postgresql utf-8 levenshtein-distance
当我使用fuzzystrmatch levenshtein函数与变音符号一起使用时,它返回错误/多字节无知的结果:
\n\nselect levenshtein(\'a\xcc\xa8\', \'x\');\nlevenshtein \n-------------\n 2\n
Run Code Online (Sandbox Code Playgroud)\n\n(注意:第一个字符是一个“a”,下面有一个变音符号,我复制到这里后它没有正确呈现)
\n\nfuzzystrmatch文档(https://www.postgresql.org/docs/9.1/fuzzystrmatch.html)警告:
\n\n\n\n\n目前,soundex、metaphone、dmetaphone 和 dmetaphone_alt 函数不能很好地处理多字节编码(例如 UTF-8)。
\n
但由于它没有命名levenshtein函数,我想知道是否有 levenshtein的多字节感知版本的多字节感知版本。
\n\n我知道我可以使用非重音函数作为解决方法,但我需要保留变音符号。
\n\n \n\n\n
带有变音符号的 \'a\' 是一个字符序列,即a和组合字符的组合,变音符号 \xcc\xa8 :E\'a\\u0328\'
有一个等效的预组合字符\xc4\x85:E\'\\u0105\'
解决方案是标准化Unicode 字符串,即在比较它们之前将组合字符序列转换为预组合字符。
\n\n不幸的是,Postgres 似乎没有内置的 Unicode 规范化功能,但您可以通过PL/Perl或PL/Python语言扩展轻松访问该功能。
\n\n例如:
\n\ncreate extension plpythonu;\n\ncreate or replace function unicode_normalize(str text) returns text as $$\n import unicodedata\n return unicodedata.normalize(\'NFC\', str.decode(\'UTF-8\'))\n$$ language plpythonu;\n
Run Code Online (Sandbox Code Playgroud)\n\n现在,当使用 将字符序列E\'a\\u0328\'
映射到等效的预组合字符时,编辑距离是正确的:E\'\\u0105\'
unicode_normalize
select levenshtein(unicode_normalize(E\'a\\u0328\'), \'x\');\nlevenshtein\n-------------\n 1\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
402 次 |
最近记录: |