Skip to content

jiojio 使用说明文档

冬日新雨 edited this page Nov 7, 2022 · 13 revisions

jiojio 使用说明文档


分词-添加正则

  • 添加正则意味着能够处理邮箱、URL、电话号码、身份证号、ip地址等方便使用正则抽取,但难以使用模型处理的情况。
  • jiojio中,cws_rule参数默认为False
>>> import jiojio
>>> jiojio.init(cws_rule=True)
>>> words = jiojio.cut('如有问题可以邮箱联系我们:doudou@163.com,或者访问我们的 链接https://youjj.com.cn/kfes/f43/index.html')
>>> print(words)
# ['如', '有', '问题', '可以', '邮箱', '联系', '我们', ':', 'doudou@163.com', ',', '或者', '访问', '我们', '的', ' ', '链接', '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

分词-调整 Viterbi 算子(该功能已在 1.2.0 版本删除)

  • 在分词任务中,采用了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.jsonweights.npzparams.json等文件。

词性标注-添加正则

  • jiojio中,pos_rule参数控制是否返回词性标注结果,默认为False
>>> import jiojio
>>> jiojio.init(pos=True, pos_rule=True)
>>> words_tags = jiojio.cut('致我们终将逝去的青春,小说请发送至邮箱womendeqingchun@gamil.com。')
>>> print([item[0] + '/' + item[1] for item in words_tags])

# ['致/v', '我们/r', '终将/d', '逝去/vi', '的/u', '青春/n', ',/w', '小说/n', '请/v', '发送/v', '至/p', '邮箱/n', 'womendeqingchun@gamil.com/email', '。/w']
  • 注意:当cws_rule为 True,而pos_rule为 False 时,返回的结果仍然不带有规则类型,如urlemailtel等。
  • 正则之所以方便处理上述类型,原因在于其具有较为固定的正则表达式,即规律清晰明确。
  • 模型之所以难以处理上述类型,原因在于上述类型基本上字符串长度都大于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 功能实现,参数主要包括词汇,以及其对应的词性。

词性标注-调整 Viterbi 算子(该功能已在 1.2.0 版本删除)

  • 在词性标注任务中,以词级别为 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')]