Python Postgresql:子字符串匹配的Levenshtein编号

Python Postgresql:子字符串匹配的Levenshtein编号,python,postgresql,levenshtein-distance,fuzzy-search,Python,Postgresql,Levenshtein Distance,Fuzzy Search,问题:我正在提取在长描述字段中具有术语“posthole”的行。这些经常拼错。我使用Levenshtein函数创建了一个字段来计算描述和术语“posthole”之间的差异,但它匹配整个字符串。我需要找到一种方法来修改它,以计算到最接近术语“posthole”的字符串的子字符串的距离 解决方案:我唯一能想到的是将字符串拆分为空格上的子字符串,并将每个子字符串与搜索词匹配。我只是想看看有没有人知道更好的方法 目前这是纯PostgreSQL,但如果有模块处理此问题,我可以将一些Python代码插入数据

问题:我正在提取在长描述字段中具有术语“posthole”的行。这些经常拼错。我使用Levenshtein函数创建了一个字段来计算描述和术语“posthole”之间的差异,但它匹配整个字符串。我需要找到一种方法来修改它,以计算到最接近术语“posthole”的字符串的子字符串的距离

解决方案:我唯一能想到的是将字符串拆分为空格上的子字符串,并将每个子字符串与搜索词匹配。我只是想看看有没有人知道更好的方法


目前这是纯PostgreSQL,但如果有模块处理此问题,我可以将一些Python代码插入数据库。

您可以将字符串拆分为行:

with inputs (id, textcol) as (
  values (1, 'this is a test of postole and some other posthole expressions'),
         (2, 'just another posthole entry')
)
select id, word, levenshtein(upper(word), 'POSTHOLE') 
  from inputs
       cross join lateral regexp_split_to_table(textcol, '\y') r(word) 
 where length(word) > 5
   and levenshtein(upper(word), 'POSTHOLE') < 4
;

┌────┬──────────┬─────────────┐
│ id │   word   │ levenshtein │
├────┼──────────┼─────────────┤
│  1 │ postole  │           1 │
│  1 │ posthole │           0 │
│  2 │ posthole │           0 │
└────┴──────────┴─────────────┘
(3 rows)

输入(id,textcol)为(
值(1,'这是对postole和其他一些posthole表达式的测试'),
(2,‘只是另一个桩孔入口’)
)
选择id、word、levenshtein(上(word)、POSTHOLE)
从输入
交叉连接横向regexp\u split\u到表(textcol,'\y')r(word)
其中长度(字)>5
和levenshtein(上(字),“POSTHOLE”)<4
;
┌────┬──────────┬─────────────┐
│ 身份证件│   单词│ 列文施坦│
├────┼──────────┼─────────────┤
│  1.│ 后极│           1.│
│  1.│ 桩孔│           0│
│  2.│ 桩孔│           0│
└────┴──────────┴─────────────┘
(3排)