-
Notifications
You must be signed in to change notification settings - Fork 7
jiojio 使用说明文档
dongrixinyu edited this page Jul 29, 2024
·
14 revisions
- 添加正则意味着能够处理邮箱、URL、电话号码、身份证号、ip地址等方便使用正则抽取,但难以使用模型处理的情况。
-
jiojio
中,cws_rule
参数默认为False
。
>>> import jiojio
>>> jiojio.init(cws_rule=True)
>>> words = jiojio.cut('如有问题可以邮箱联系我们:[email protected],或者访问我们的 链接https://youjj.com.cn/kfes/f43/index.html')
>>> print(words)
# ['如', '有', '问题', '可以', '邮箱', '联系', '我们', ':', '[email protected]', ',', '或者', '访问', '我们', '的', ' ', '链接', 'https://youjj.com.cn/kfes/f43/index.html']
- 正则之所以方便处理上述类型,原因在于其具有较为固定的正则表达式,即规律清晰明确。
- 模型之所以难以处理上述类型,原因在于上述类型基本上字符串长度都大于10,这对于CRF模型抽取前后上下文特征是异常困难的,特征数量将向指数级爆炸增长,且过于稀疏的训练数据会对模型造成结果和特征的模糊性,导致模型预测效果下降。
- 若您的待处理文本中充斥着大量的上述类型的文字,密度较高,或者上述类型的信息对您的后续处理有用,则可以将该参数设置为
True
。否则直接默认False
即可。- 经验证,若文本中完全不存在上述类型信息,且参数默认为
False
,分词处理速度大约在5 万字/秒
上下。若文本中大量存在上述类型,且设置参数为True
,分词处理速度将达到大约12~18万字/秒
。具体数值与上述类型信息的密度有关。
- 经验证,若文本中完全不存在上述类型信息,且参数默认为
- 所谓增加静态词典就是在jiojio 加载阶段指定词典文件。
- 增加词典可以方便模型即时应对一些模型未见过的新词,模型错分的词等。
-
jiojio
中默认不加载任何词典。
>>> import jiojio
>>> jiojio.init(cws_user_dict='/path/to/dictionary.txt')
>>> words = jiojio.cut('欧盟各成员国内部也存在着种种分歧。')
>>> print(words)
# ['欧盟', '各', '成员国', '内部', '也, '存在', '着', '种种', '分歧', '。']
- 词典格式参考 用户自定义词典
-
jiojio
中的词典并非非黑即白地匹配文本,并将匹配的文本抽取,而是采用一种柔性的方式进行抽取,它利用了CRF算法迭代计算的特性。 - 词典中,包括词汇本身,以及其权重两部分,权重越大,则该词越容易被识别。其中权重可以不填写,默认为1。
- 所谓增加动态词典就是在业务程序执行中途,临时对 jiojio 增加一个词典词汇。
- 增加词典可以方便模型即时应对一些模型未见过的新词,模型错分的词等。
>>> import jiojio
>>> jiojio.init(cws_user_dict=True)
>>> words = jiojio.cut('欧盟各成员国内部也存在着种种分歧。')
>>> print(words)
# ['欧盟', '各', '成员国', '内部', '也, '存在', '着', '种种', '分歧', '。']
>>> jiojio.add_word('各成员国', weight=10)
>>> jiojio.cut('欧盟各成员国内部也存在着种种分歧。')
# ['欧盟', '各成员国', '内部', '也', '存在', '着', '种种', '分歧', '。']
- 由此可知,该功能主要通过
add_word
功能实现。 - 注意,添加前必须在
init
方法中强调cws_user_dict
参数为True
。
- 在分词任务中,采用了
BI
标签标注标准。该标准不存在标签转移概率为0的情况。因此在极大程度上,在分词推理过程中,可以不经过 Viterbi算法,不采用转移参数。得到的F1值仅有微弱下降。 -
jiojio
中默认cws_with_viterbi
参数为False
。
>>> import jiojio
>>> jiojio.init(cws_with_viterbi=True)
>>> words = jiojio.cut('我爱北京天安门!')
>>> print(words)
# ['我', '爱', '北京', '天安门', '!']
-
jiojio
中,pos
参数控制是否返回词性标注结果,默认为False
。
>>> import jiojio
>>> jiojio.init(pos=True)
>>> words_tags = jiojio.cut('致我们终将逝去的青春。')
>>> print([item[0] + '/' + item[1] for item in words_tags])
# ['致/v', '我们/r', '终将/d', '逝去/vi', '的/u', '青春/n', '。/w']
- 词性标注的类型对照表参考 jiojio/pos/pos_types.yml,其中
model_type
指的是模型训练的类型,rule_type
指的是,当pos_rule
为 True时,采用正则抽取出的词性类型。delete_type
可忽略不计。也可调用函数获取:
>>> print(jiojio.pos_types())
-
注意:
- 由于词性标注模型模型较大,故当初次加载时,代码会自动下载词性标注模型。如感到下载模型网速十分地龟,请提 issue 让我知道。
- 若无法连接公网,采用离线方式操作时,则需手动下载相应的词性标注模型 default_pos_model.zip,解压至
jiojio/models/default_pos_model
目录下,该目录下应当包含features.json
、weights.npz
、params.json
等文件。
-
jiojio
中,pos_rule
参数控制是否返回词性标注结果,默认为False
。
>>> import jiojio
>>> jiojio.init(pos=True, pos_rule=True)
>>> words_tags = jiojio.cut('致我们终将逝去的青春,小说请发送至邮箱[email protected]。')
>>> print([item[0] + '/' + item[1] for item in words_tags])
# ['致/v', '我们/r', '终将/d', '逝去/vi', '的/u', '青春/n', ',/w', '小说/n', '请/v', '发送/v', '至/p', '邮箱/n', '[email protected]/email', '。/w']
-
注意:当
cws_rule
为 True,而pos_rule
为 False 时,返回的结果仍然不带有规则类型,如url
、email
、tel
等。 - 正则之所以方便处理上述类型,原因在于其具有较为固定的正则表达式,即规律清晰明确。
- 模型之所以难以处理上述类型,原因在于上述类型基本上字符串长度都大于10,这对于CRF模型抽取前后上下文特征是异常困难的,特征数量将向指数级爆炸增长,且过于稀疏的训练数据会对模型造成结果和特征的模糊性,导致模型预测效果下降。
- 所谓增加动态词典就是在业务程序执行中途,临时对 jiojio 增加一个词典词汇。
- 增加词典可以方便模型即时应对一些模型未见过的新词,模型错分的词等。
>>> import jiojio
>>> jiojio.init(pos=True) # 必须在 pos 为 True 时才可添加
>>> words = jiojio.cut('欧盟各成员国内部也存在着种种分歧。')
>>> print(words)
# [('欧盟', 'nt'), ('各', 'r'), ('成员', 'n'), ('国', 'n'), ('内部', 'f'), ('也', 'd'), ('存在', 'v'), ('着', 'u'), ('种种', 'q'), ('分歧', 'n'), ('。', 'w')]
>>> jiojio.add_word_pos('。', 'o') # 将 `。` 的词性定义为 拟声词
>>> jiojio.cut('欧盟各成员国内部也存在着种种分歧。')
# [('欧盟', 'nt'), ('各', 'r'), ('成员', 'n'), ('国', 'n'), ('内部', 'f'), ('也', 'd'), ('存在', 'v'), ('着', 'u'), ('种种', 'q'), ('分歧', 'n'), ('。', 'o')]
- 由此可知,该功能主要通过
add_word_pos
功能实现,参数主要包括词汇,以及其对应的词性。
- 在词性标注任务中,以词级别为 token 进行计算,且不强依赖 BIEOS 等类型的标注标准。因此在极大程度上,在推理过程中,可以不经过 Viterbi算法,不采用转移参数。得到的F1值仅有极微弱下降。
-
jiojio
中默认pos_with_viterbi
参数为False
。若希望加入Viterbi算子则可参考下例。
>>> import jiojio
>>> jiojio.init(pos_with_viterbi=True, pos=True)
>>> words_tags = jiojio.cut('人生总有起起伏伏,又何必在意一时的得失!')
>>> print([item[0] + '/' + item[1] for item in words_tags])
# [("人生", "n"), ("总", "d"), ("有", 'v'), ('起起伏伏', 'n'), (',', 'w'), ('又', 'd'), ('何必', 'd'), ('在意', 'v'), ('一时', 't'), ('的', 'u'), ('得失', 'n'), ('!', 'w')]