目录
一、程序功能
二、功能实现
easygui——
levenshtein——
三、无关文本清洗
四、python封装exe
五、解决win7上运行不了的问题
六、程序包
因为得到的原始数据来自各个单位,可能存在POI重复记录或是同个POI命名不同、距离差了5、6米之类的,举个例子:
同一家肯德基,单位一交的数据命名为“肯德基(银泰店)”,经纬度数据是在这家肯德基的前门采集的;单位二交的数据命名为“肯德基(宁波镇海银泰店)”,经纬度在后门采集。这样导致两个POI数据实际上重复但人工难以筛查出来。
这个程序要做的是:
1、通过字符串模糊匹配先把“肯德基”匹配起来,不管你是在哪里的肯德基,先匹配在一起
2、距离筛选。我设置的距离阈值是150米,通过经纬度计算处出两个点之间 的距离方便后期人工筛查。那么最后输出的结果就是这样:
NAME1和NAME2分别是匹配上的两个POI,similar1和similar2是两种不同方法计算的模糊匹配度(后文会讲到),distance是两点距离(csdn可以找到经纬度计算距离的代码)
两个肯德基只差5m,能判断出来是同一家肯德基了吧!
(本数据仅作举例使用,并非真实数据)
用到的库:
非常非常小白的ui实现,我用这个来输入和输出原始excel表。通过以下代码,运行时会弹出对话框供用户选择输入的excel表和命名输出的excel表
msg = '输入'
title = '选择输入的excel文件'
filename = '*'
filetypes = ["*.xls"]
fileinpath = easygui.fileopenbox(msg, title, filename, filetypes)
msg2 = '输出路径选择'
title2 = ''
filename2 = '*.xls'
filetype2 = ["*.xls"]
fileoutpath2 = easygui.filesavebox(msg2, title2, filename2, filetype2)
计算文本匹配度,有好几种算法。我用了ratio和jaro两种一起输出
sim1 = float(Levenshtein.ratio(str1, str2))
sim2 = float(Levenshtein.jaro(str1, str2))
最终输出的匹配结果(dis是两点距离,单位是米):
if dis < 150:
if (
(sim1 > 0.6) or (sim2 > 0.7)
):
a = {'OBJECTID': O1, 'NAME': NAME[row], 'ADDRESS': AD1, 'POINT_X': lon[row], 'POINT_Y': lat[row],
'OBJECTID2': O2, 'NAME2': NAME[subRow], 'ADDRESS2': AD2, 'POINT_X2': lon[subRow],
'POINT_Y2': lat[subRow],
'similar1': sim1, 'similar2': sim2, 'distance': dis}
很多POI点后面会跟一长串后缀,这样就导致完全不相关的两个POI点会被匹配在一起,举个例子:
一点点(宁波镇海骆驼街道银泰百货店)
COCO(宁波镇海骆驼街道银泰百货店)
这两家店不是重复的,但是因为后面这一串文本太长,导致文本的匹配程度很高。
我的办法是另创建一个无关后缀库excel,先录入所在区域的这种大型商场后缀名。然后python读取,在进行文本模糊匹配前先删除这些无关后缀。
刚开始我觉得这一步很简单。搞定easygui后就pyinstaller -F-w SelectPOI.py
很快啊!啪的一下就生成了!而且exe程序能成功运行!
但是当我兴高采烈地去把程序拷给带我的老师的时候,我发现,好像只能在win10电脑上运行。也就是说我辛辛苦苦编好了程序办公室里的老师们用不了,办公室里的电脑都是win7!只有我的电脑能用!
而我只是一个来寒假实习的小朋友,马上就走了……
感谢CSDN上的各位博主,解决方法如下:
第一步:安装anaconda,在anaconda的终端把环境设置为32位,创建python3.7虚拟环境
set CONDA_FORCE_32BIT=1
可以使用 conda info 查看当前是64位还是32位
然后创建了个python3.7的虚拟环境。关于如何创建虚拟环境可以找到很多教程我就不赘述了。
第二步:更换编译器,安装外部库
我是用的pycharm,File - Settings 里更改
然后跟正常的编译一样,下载自己需要的库。
问题又来了!我下载不了easygui和levenshtein!
就是在那个 + 那里,根本搜不到这两个库。
easygui的安装也是在csdn上找到了教程,去官网下载了安装包后解压,然后在 + 号这里就能找到了。(我个人喜欢在pycharm里下载外部库不喜欢用 pip install)
这时候神奇的事情发生了,刚才没找到的levenshtein居然也出现了,我欢天喜地地下载,美美按下“Run”
报错: cannot import name '_levenshtein' from 'Levenshtein'
是leveinshtein 的_init_文件里报的错,我这种刚学python没几天的人咋知道怎么改!!!!
而且CSDN里居然也没找到这样的错误解决方法,倒是找到了几个anaconda安装levenshtein的教程。
我就先把编译器里的levenshtein卸了,哭唧唧去pip install
pip install之后报错没有VC++9.0的编译器!好办!是我见过的错误了!
又下载了VC++9.0的编译器,这个安装很傻瓜的无脑往下点就行
自此再无错误,成功运行,成功封装,成功在win7 32位的电脑山运行。
适合POI兴趣点数据处理工作,大大减少人工筛查的时间和工作难度。如有需要可私信联系我