基于TF-IDF和KNN的模糊字符串匹配优化的实际应用
作者:互联网
基于TF-IDF和KNN的模糊字符串匹配优化的实际应用
使用背景
由于最近公司数据清理的需求,需要对两组中文名称数据进行匹配,在使用Excel的基本匹配功能之后,在待匹配组大概还有900多条数据没有得到匹配,于是便想用其他方法来匹配,以期望在获得不错准确率的前提下提高效率。
基于TF-IDF和KNN的模糊字符串匹配
基于TF-IDF和KNN的模糊字符串匹配优化具体原理介绍请看这篇文档:
具体效果
在网上寻找方法的过程中,找到了这篇文章《【NLP】基于TF-IDF和KNN的模糊字符串匹配优化》文章中对“乔治·华盛顿和G·华盛顿”的匹配对比,这不就正是我需要的吗,于是便按照教程写了程序方法,实际使用下来,哟嚯,果真不错。
感觉满意的地方有两点:
-
速度太快了
我的待匹配数组有900多条,但匹配组中有四万九千条,也就是从50000条中找出900条匹配上,总用时为:7.16秒,这速度比FuzzyWuzzy快了可能上万倍。 -
准确度还可以
因为是数据匹配,所以对准确度要求很高,匹配错了就会影响后边的工作。所以在匹配完成后还需要手工核验,在抛去ratio50以下的数据,对ratio50以上的匹配进行区间为10的准确度统计,结果如下:
50-60 | 60-70 | 70-80 | 80-90 | 90-100 |
---|---|---|---|---|
0.20 | 0.18 | 0.23 | 0.60 | 0.79 |
同时,又对ratio在[90,100]区间内以步长为2进行准确度统计,如下:
90-92 | 92-94 | 94-96 | 96-98 | 98-100 |
---|---|---|---|---|
0.71 | 0.76 | 0.78 | 0.79 | 0.96 |
可以看出,当ratio在98以上时,准确度是相当高的。
关于FuzzyWuzzy的使用
其实,在找到上述方法之前就知道该库了,具体使用方法可以参考这篇文章:《GitHub 标星 7.4k!Python 魔法库之 FuzzyWuzzy》但最后没有使用该方法的主要原因是:太慢了。
在使用待匹配组100条,匹配组5000条的测试集中,耗15分钟(918秒),那如果放到真实数据上,这是不现实的。
总结
其实,即便基于TF-IDF和KNN的模糊字符匹配方法在实际应用中也有不足的地方(这就好像实验室环境与真实环境)。
-
首先,真实的匹配组不一定都有匹配
就是说,虽然有50000条匹配数据,但900条里的待匹配组也不一定能从中找到匹配的,这跟文章中举的实例是不一样的。 -
其次,现实中对语义准确度要求更高
看到这点你懵了,什么叫语义准确度?其实我也懵,我的理解是: 李姐跟理解,字义不一样,但语义是一样的,都是指向“理解”,但这种匹配算法是不考虑的。所以,在实际工作中,哪怕两个词汇之间ratio值高达98,但你一看还是会发现不是一回事儿。比如长沙市宾馆和长沙县宾馆,机器认为匹配度很高啊,但我们就觉得这哪跟哪啊。
所以,即便在ratio98以上时有96%的准确率,但还是需要人手工比对,因为数据清洗这部分就是这样,不能出错。
但即便如此,我还是使用该方法缩短了大量匹配的时间,虽然不能完全信赖,但确实可以帮助我们提高速度,这或许就是机器学习最大的实际意义吧。
标签:KNN,匹配,准确度,模糊,TF,IDF 来源: https://blog.csdn.net/tcguoxing/article/details/122122148