美文网首页机器学习之旅
中文语境下的手机号识别

中文语境下的手机号识别

作者: slade_sal | 来源:发表于2019-05-13 13:44 被阅读2次

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

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

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

    相关文章

      网友评论

        本文标题:中文语境下的手机号识别

        本文链接:https://www.haomeiwen.com/subject/mrwooqtx.html