上个月由于业务需要定制化了一个中文语境下的手机号码识别库YMMNlpUtils
现在由于业务需求,又新增了一个语音对话过程中是否存在手机号交换行为意图的识别,所以更新了一个版本YMMNlpUtils==0.1.1。实际拿来用的数据比想象中的要更加混乱,主要是由于我们的用户方言很重且经过了一轮语音转文本的信息转译,所以不少信息丢失,比如:
你等会让我jj#等会儿。是名额的香车翻起来!好,你说6.2。有三,有牛有。U0150508。6050508。50568号。
我们设计的算法流程如下:
我们认为语音文本中存在手机号为正样本,
text training data:基础本文信息
text features:本wiki中整理出来的features
P-Learn(全量):正样本
N-Learn(采样):黄色背景为纳入计算的采样负样本,蓝色背景为未纳入计算的采样负样本
outliers:去异常点,采取了概率分布越界原则
OneHotEncoder:离散化
standardize:标准化
1-3_grams:朴素贝叶斯+2-grams+3-grams
Predict1_4:为concat形式[predict1,predict2,predict3,predict4]
实际线上效果如下:
使用Demo如下:
from YMMNlpUtils import YMMPhoneDistinguish
obj = YMMPhoneDistinguish(show_reason=False, user_dict=None, stop_words=None)
#:param show_reason:是否需要展示被识别出来的原因
#:param user_dict:用户自定义词典,默认调用自带词典
#:param stop_words:自定义停顿词
In [8]: obj.predict("你等会让我jj#等会儿。是名额的香车翻起来!好,你说6.2。有
...: 三,有牛有。U0150508。6050508。50568号。",0.92)
Out[8]: (0.9527009149362651, 1)
# 0.92为默认阈值,可以自行修改
Reason解析如下:
-1:"无原因", 0: "逻辑拼接", 1: "命中敏感词", 2: "疑似电话数字", 3: "数字过长", 4: "涉及微信号码敏感"
阈值调整建议如下:
阈值 | 精确率 | 召回率 |
---|---|---|
0.5 | 99.40% | 95.20% |
0.6 | 99.50% | 94.50% |
0.7 | 99.60% | 93.30% |
0.8 | 99.60% | 90.80% |
0.9 | 99.70% | 83.60% |
0.91 | 99.70% | 82.40% |
0.92 | 99.70% | 80.60% |
0.93 | 99.80% | 78.00% |
0.94 | 99.80% | 75.70% |
0.95 | 99.80% | 72.80% |
开源代码详见Github
欢迎大家关注我的个人bolg,知乎,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码、转行疑问都欢迎通过邮箱发消息给我。