欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

中文语境下的手机号识别

程序员文章站 2024-01-14 21:12:52
...

最近在做一个关于中文大段文本中的手机号码识别,由于属于对抗性的一个文本,发现传统的手机号码识别方法,比如正则匹配并不是很适用。

理论情况下文本中的手机号码出现方式应该如下:

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,如果有任何算法、代码、转行疑问都欢迎通过邮箱发消息给我。

相关标签: 开源项目