项目简介
本项目基于PostgreSQL数据库开发,通过修改PostgreSQL源码,添加了两个用于计算字符串相似度的函数,为数据库层面的相似度计算提供了解决方案。这两个函数分别用于计算Levenshtein距离(编辑距离)和Jaccard相似系数。
项目的主要特性和功能
- 添加新函数:在PostgreSQL中新增
levenshtein_distance
和jaccard_index
两个函数。 - 相似度计算:
levenshtein_distance
函数:采用动态规划算法计算两个字符串的编辑距离,编辑距离越小,字符串相似度越高,时间复杂度为O(m + n)。jaccard_index
函数:利用哈希表计算两个字符串的Jaccard相似系数,系数越大,字符串相似度越高,时间复杂度为O(n)。
- 性能优化:运用动态规划和哈希表对算法进行优化,提升了相似度计算的性能。
安装使用步骤
假设用户已经下载了本项目的源码文件,可按以下步骤进行安装和使用:
1. 配置编译环境:安装依赖并配置编译环境。
2. 修改源代码:在src/backend/utils/fmgr/funcapi.c
文件中添加levenshtein_distance
和jaccard_index
函数的实现。
3. 注册函数:在src/include/catalog/pg_proc.h
文件中注册新函数,同时在src/include/utils/builtins.h
文件中声明外部函数。
4. 编译安装:每次修改函数内容后,都需要断连网络删库,然后重新编译安装PostgreSQL,可使用以下脚本:
bash
$HOME/pgsql/bin/pg_ctl -D $HOME/pgsql/data -l logfile stop
rm -r $HOME/pgsql
./configure --enable-depend --enable-cassert --enable-debug CFLAGS="-O0" --prefix=$HOME/pgsql --without-readline --without-zlib
make
make install
$HOME/pgsql/bin/initdb -D $HOME/pgsql/data --locale=C
$HOME/pgsql/bin/pg_ctl -D $HOME/pgsql/data -l logfile start
$HOME/pgsql/bin/psql -p 5432 postgres -c 'CREATE DATABASE similarity;'
$HOME/pgsql/bin/psql -p 5432 -d similarity -f $HOME/DatabasePJ/similarity_data.sql
$HOME/pgsql/bin/psql similarity
5. 使用函数:在PostgreSQL数据库中调用新添加的levenshtein_distance
和jaccard_index
函数计算字符串相似度。例如,可使用以下命令生成包含计算结果的txt文件:
bash
$ HOME/pgsql/bin/psql similarity -c "SELECT ra.address,ap.address,ra.name,ap.phone FROM restaurantaddress ra, addressphone ap WHERE (levenshtein_distance(ra.address, ap.address) < 4) AND (ap.address LIKE '%Berkeley%’ OR ap.address LIKE '%Oakland%')ORDER BY 1,2,3,4" > levenshtein.txt
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】