中文语境下的手机号识别
2019-05-13 本文已影响2人
slade_sal
最近在做一个关于中文大段文本中的手机号码识别,由于属于对抗性的一个文本,发现传统的手机号码识别方法,比如正则匹配并不是很适用。
理论情况下文本中的手机号码出现方式应该如下:
9*6箱车转让,连线路一起打包,带线路转让,固定货源联系13802131234,手机号,非诚勿扰2+1合同
对于这种情况,只要需要进行一下正则就行了:
text = '9*6箱车转让,连线路一起打包,带线路转让,固定货源联系13802131234,手机号,非诚勿扰2+1合同'
mobilephone_pattern = "1\d{10}"
phoneNumbers = re.findall(mobilephone_pattern, text, flags=0)
得到了如下结果:
In [36]: phoneNumbers
Out[36]: ['13802131234']
但是实际情况下,第三方会进行逃避规则的操作,出现了比如:
9*6箱车转让,连线路一起打包,带线路转让,固定货源联系138-02##131234,手机号,非诚勿扰2+1合同
9*6箱车转让,连线路一起打包,带线路转让,固定货源联系138-洞2##幺3幺234,手机号,非诚勿扰2+1合同
甚至还会有:
9*6箱车转让,连线路一起打包,带线路转让,固定货源联系1衫8-洞2##幺散幺2删4,手机号,非诚勿扰2+1合同
这样的情况下,继续通过规则就难以实现了:
In [38]: re.findall(mobilephone_pattern, text, flags=0)
Out[38]: []
所以,我们做了一个拼音转译+循环判断的逻辑进行了优化,会先把文本处理一边:
In [37]: text = '9*6箱车转让,连线路一起打包,带线路转让,固定货源联系1衫8-洞2##幺散幺2删4,手机号,非诚勿扰2+1合同'
In [38]: re.findall(mobilephone_pattern, text, flags=0)
Out[38]: []
In [39]: from YMMNlpUtils import YMMNlpUtils
In [40]: obj = YMMNlpUtils(strict=True)
In [41]: obj.get_all_phone_number(text)
Out[41]: '96箱车转让连线路17打包带线路转让固定货源联系13802131234手机号非诚5扰21合同'
In [42]: re.findall(mobilephone_pattern,obj.get_all_phone_number(text), flags=0)
Out[42]: ['13802131234']
这样处理完就可以得到手机号码了。
由于是定制化的功能,后期可能还会维护出微信号,身份证号这些,更多的可以去git看一下,放上地址链接手机号码小工具,安装方法在README里面有解释。
欢迎大家关注我的个人bolg,知乎,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码、转行疑问都欢迎通过邮箱发消息给我。