JioNLP上的那些好用的冷门工具

JioNLP上的那些好用的冷门工具_第1张图片

大家好,JioNLP(https://github.com/dongrixinyu/JioNLP)目前已经在Github上有了1600星的点赞,下载安装量大概有几万了。

被使用最多的功能,也是被问得最多的,主要是关键短语抽取、时间语义解析、地址按省市县三级解析等等。其它功能较少使用到。然而,作为开发者,我自己在工作中经常用到的一些功能函数,甚少被关注或者提问,因此,本文主要是向大家介绍几个我平时常用,但是大家少有关注到的功能函数。

一、判断一个字符串是否包含中文

NLP 里有一类任务是文本抽取和解析类任务,经常需要使用一些工具从 PDF、word 等 文档中抽取出相关信息,并基于逻辑对这些文本数据信息进行清洗和提取。

如果你做过上述的规则编写,那么肯定少不了经常判断文本中是否有数字、是否有中文汉字等等。

JioNLP 提供了若干函数用于判断:

jio.check_any_chinese_char 判断文本中是否包含中文汉字
>>> import jionlp as jio
>>> print(jio.check_any_chinese_char('【新华社消息】(北京时间)从昨天...'))

# True
  • 检查文本中是否包含中文字符,若 至少包含一个,则返回 True,否则返回 False。若为空字符串,返回 False。
jio.check_all_chinese_char 判断文本中是否全部都是汉字
>>> import jionlp as jio
>>> print(jio.check_all_chinese_char('【新华社消息】(北京时间)从昨天...'))

# False
  • 检查文本中是否全部都是中文字符,若全部都是,则返回 True;若至少有一个不是中文字符,否则返回 False。若为空字符串,返回 False

  • 除了判断汉字之外,还有判断阿拉伯数字的方法 check_any_arabic_numcheck_all_arabic_num 两个。使用方法也和上面一样。

二、分句

分句实在是太基础了,面对长文本,都需要做分句处理。

这听起来是个简单的问题,但是,在中文中,还是有一些引号、冒号等标点符号情况较为特殊,此时,jio.split_sentence 函数就派上了用场。

>>> import jionlp as jio
>>> text = '他说:“中华古汉语,泱泱大国,历史传承的瑰宝。。。”'
>>> res = jio.split_sentence(text, criterion='fine')
>>> print(res)

# ['他说:', '“中华古汉语,', '泱泱大国,', '历史传承的瑰宝。。。”']
  • 注意这个例子中,包含了引号,冒号,这些都是 jionlp 工具可以完美解决的。
  • criterion 指的是分类标准,可以选择 fine 或者 coarse 两种,分别表示了精细的和粗糙的分句方式,适用于不同的任务场景。

三、加载停用词典

停用词典,人人都用,你是怎么使用的?是不是每次都得找一下词典,再写个读写文件的代码?而且网上流行的百度北大讯飞停用词典,也不知道该选择哪个好。

为了方便加载停用词典,我将综合上述多个词典的停用词典,整理在了 jionlp 中,只需要执行

import jionlp as jio
stopwords_list = jio.stopwords_loader()
  • 是不是很方便,再也不用自己留存了。

四、货币金额抽取

有小伙伴是做一些裁判文书招股说明书解析的,这也属于NLP 的范畴,里面免不了涉及一些货币金额的解析,例如上市公司的毛利、净利润、支出等等。判决文书中的赔偿金额等等。此时,货币金额解析就显得非常重要了。

>>> import time
>>> import json
>>> import jionlp as jio
>>> text = '张三赔偿李大花人民币车费601,293.11元,工厂费大约一万二千三百四十五元,利息9佰日元,打印费十块钱。'
>>> res = jio.ner.extract_money(text, with_parsing=False)
>>> print(json.dumps(res, ensure_ascii=False, indent=4, separators=(','':')))

# [{'text': '601,293.11元', 'offset': [12, 23], 'type': 'money'},
#  {'text': '大约一万二千三百四十五元', 'offset': [27, 39], 'type': 'money'},
#  {'text': '9佰日元', 'offset': [42, 46], 'type': 'money'},
#  {'text': '人民币十块钱', 'offset': [50, 56], 'type': 'money'}]
  • 该方法抽取出货币实体,再结合 jio.parse_money 将每一个货币金额实体归一化,形成可计算的数字类型
>>> import jionlp as jio
>>> text_list = ['约4.287亿美元''两个亿卢布''六十四万零一百四十三元一角七分''3000多欧元'
>>> moneys = [jio.parse_money(text) for text in text_list]

# 约4.287亿美元: {'num': '428700000.00', 'case': '美元', 'definition': 'blur'}
# 两个亿卢布: {'num': '200000000.00', 'case': '卢布', 'definition': 'accurate'}
# 六十四万零一百四十三元一角七分: {'num': '640143.17', 'case': '元', 'definition': 'accurate'}
# 3000多欧元: {'num': ['3000.00', '4000.00'], 'case': '欧元', 'definition': 'blur'}

这样一来,就可以成功得到可计算的货币金额了。

当然,功能都是可能存在缺陷的,随着越来越多的码农使用,功能也日趋完善,如果有疑问,直接到 JioNLP提交bug单里提单即可。

本文由 mdnice 多平台发布

你可能感兴趣的:(自然语言处理)