Skip to content

正则抽取与解析 说明文档

冬日新雨 edited this page Oct 15, 2022 · 34 revisions

抽取 E-mail

extract_email

抽取文本中的 E-mail 信息,并返回其在文本中的位置offset,以及所属域名domain_name

>>> import jionlp as jio
>>> text = '请发简历至[email protected]。' 
>>> emails = jio.extract_email(text, detail=True))

#  [{'text': '[email protected]', 
#    'offset': [6, 18], 
#    'domain_name': '163'}, 
  • 暂不支持带中文字符的邮箱名称。

货币金额解析

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'}
  • 支持标准数字格式,如:1,034,192.07元
  • 支持纯数字格式,如:987273.3美元
  • 支持大写中文金额,如:柒仟六佰零弎萬肆仟叁佰贰拾壹元伍分
  • 支持混合格式,如:1.26万港元
  • 支持修饰词解析,如:将近6万块钱、至少1000块钱以上
  • 支持模糊金额解析,如:两万多元钱,6千多亿日元
  • 支持口语化中文格式,如:三十五块三毛;但对于“三十五块八”这样的字符串,在文本中存在歧义,如“三十五块八颗糖”等,因此,jio.ner.extract_money 对于此字符串不予抽取,但parse_money可以将“三十五块八”看作完整的口语化金额,标准化为“35.80元”
  • 支持多种常见货币类型:人民币,港元,澳门元,美元,日元,澳元,韩元,卢布,英镑,马克,法郎,欧元,加元, 泰铢等。

抽取电话号码

extract_phone_number

抽取文本中的电话号码信息,并返回其在文本中的位置offset,以及电话号码类别type,包括手机(cell_phone)和座机(landline_phone)。

>>> import jionlp as jio
>>> text = '有疑问请联系张小姐18340234920,或拨打(028)58291283。。' 
>>> phones = jio.extract_phone_number(text, detail=True))

# [{'text': '18340234920', 
#    'offset': [9, 18], 
#    'type': 'cell_phone'}, 
#   {'text': '(028)58291283', 
#    'offset': [24, 35], 
#    'type': 'landline_phone'}]
  • 支持解析手机号码归属地 和 座机区号归属地解析,须配合 jio.phone_location 使用

抽取 QQ

extract_qq

抽取文本中的 QQ 号,由于qq号特征不突出,故分为严格和非严格两种,默认 strict 为 True。

# 例 1
>>> import jionlp as jio
>>> text = '你加一下我的QQ: 123410942' 
>>> res = jio.extract_qq(text, detail=True))
>>> print(res)

# [{'text': '123410942', 'offset': [11, 18]}]

# 例 2

>>> text = '收纳金额为123410942元,进而导致...'
>>> res = jionlp.extract_qq(text, detail=True)
>>> print(res)

# []
  • QQ 号特征不突出指的是 11位的 QQ 号会和 11位的电话号码,甚至其它数据格式等混淆
  • 宽松规则指符合 QQ 号特征的号码全部抽取,可能造成一定的混淆
  • 严格规则指在满足 QQ 号本身特征基础上,文本须包含 qq、QQ、加Q 等字样

抽取 微信号

extract_wechat_id

抽取文本中的微信号,由于微信号特征不突出,很容易和一些字母、数字字符串混淆,故分为严格和非严格两种,默认 strict 为 True。

# 例 1
>>> import jionlp as jio
>>> text = '请添加我的微信号dongrixinyu89,然后回复关注' 
>>> res = jio.extract_wechat_id(text, detail=True))
>>> print(res)

# [{'text': 'dongrixinyu89', 'offset': (8, 21)}]

# 例 2

>>> text = '请添加我的号dongrixinyu89,然后回复关注'
>>> res = jionlp.extract_qq(text, detail=True, strict=True)
>>> print(res)

# []
  • 微信号特征不突出指的是其会和其它常见的字母数字字符串混淆,甚至其它数据格式等混淆。微信官方定义的微信号规则:
    1、可使用6-20个字母、数字、下划线和减号; 2、必须以字母开头(字母不区分大小写); 3、不支持设置中文。
  • 宽松规则指符合微信号特征的号码全部抽取,可能造成一定的混淆,非常不建议这样做。
  • 严格规则指在满足微信号本身特征基础上,文本须包含 微信:wx:wechat: 等字样

抽取身份证号

extract_id_card

抽取文本中的身份证号,与 jionlp.parse_id_card 函数配合使用解析身份证号中的地址、出生年月、性别、校验码等信息

>>> text = '此人身份证号是 21040319560330098x,曾经...'
>>> res = jionlp.extract_id_card(text, detail=True)
>>> print(res)

# [{'text': '21040319560330098x', 'offset': [9, 25]}]

>>> res = jionlp.parse_id_card(res[0]['text'])


抽取 URL 超链接

extract_url

抽取文本中的超链接,包括 http、https、ftp 等类型。

>>> text = '让我这个手机知乎党来终结这个问题吧!http://link.ipaiban.com/#手机文字链接生成器!'
>>> res = jionlp.extract_id_card(text, detail=False)
>>> print(res)

# ['http://link.ipaiban.com/']

抽取车牌号

extract_motor_vehicle_licence_plate

抽取文本中的车牌号,仅限于大陆车牌号,具体详情及类型参阅print(jio.extract_motor_vehicle_licence_plate.__doc__)

>>> import jionlp as jio
>>> text = '那车牌号多少来着?川A·23047B最近10分钟'
>>> res = jio.extract_motor_vehicle_licence_plate(text, detail=False)
>>> print(res)

# ['川A·23047B']
  • 该方法抽取到车牌号后,可配合jio.parse_motor_vehicle_licence_plate 方法进行车牌号解析。

抽取 IP 地址

extract_ip_address

抽取文本中的 ip 地址,仅限于 ipv4。

>>> text = '链接ip地址你知道吗?是0.0.0.0!'
>>> res = jionlp.extract_ip_address(text, detail=False)
>>> print(res)

# ['0.0.0.0']
  • 支持判断 ip 地址值介于 0~255 之间,超过则不会返回结果

抽取文本括号信息

extract_parentheses

抽取文本中的括号中的内容,括号类型主要包括 {}「」[]【】()()<>《》

>>> text = '【重磅新闻】特朗普选举失利'
>>> res = jionlp.extract_parentheses(text)
>>> print(res)

# ['【重磅新闻】']
  • 若括号仅只有半个,则不做处理,如“【重磅新闻,特朗普选举失利”
  • parentheses参数默认为{}「」[]【】()()<>《》,可根据需要进行指定,如仅抽取书报名时,可指定为《》

删除文本中的 E-mail

remove_email

删除文本中的 E-mail 信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '张晨星[email protected],现在电子邮件可以带中文了吗?'
>>> res = jionlp.remove_email(text)
>>> print(res)

# '张晨星,现在电子邮件可以带中文了吗?'
  • 从该例中可知,不支持电子邮件的中文格式。

删除文本括号信息

remove_parentheses

删除文本中的括号中的内容,括号类型主要包括 {}「」[]【】()()<>《》

>>> text = '【重磅新闻】特朗普选举失利'
>>> res = jionlp.remove_parentheses(text)
>>> print(res)

# ['特朗普选举失利']
  • 若括号仅只有半个,则不做处理

删除文本中的 URL

remove_url

删除文本中的 url 信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '让我这个手机知乎党来终结这个问题吧!http://link.ipaiban.com/#手机文字链接生成器!'
>>> res = jionlp.remove_url(text)
>>> print(res)

# '让我这个手机知乎党来终结这个问题吧!#手机文字链接生成器!'
  • 若整个字符串全部为 URL,则仅返回空字符串

删除文本中的 IP 地址

remove_ip_address

删除文本中的 IP 信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = 'https://10.28.104.169/pdf/2004.03705.pdf'
>>> res = jionlp.remove_ip_address(text)
>>> print(res)

# 'https:///pdf/2004.03705.pdf'
  • 一般首先删除 URL,然后删除 IP 地址。否则可能如上例造成 URL 格式错误。

删除文本中的身份证号

remove_id_card

删除文本中的身份证信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '此人身份证号是 21040319560330098x,曾经...'
>>> res = jionlp.remove_id_card(text)
>>> print(res)

# '此人身份证号是 ,曾经...'

删除文本中的 QQ 号

remove_qq

删除文本中的 QQ 号信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '你加一下我的QQ: 123410942'
>>> res = jionlp.remove_qq(text)
>>> print(res)

# '你加一下我的QQ: '
  • 该方法中提供了严格匹配 qq 字符的规则,采用 strict(bool) 参数实现

删除文本中的 html 标签

remove_html_tag

删除文本中的 html 信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '''<!-- '"` -->中国<!-- </textarea>美国经济风险</xmp> -->go to the airport<form class="logout-form" action="/logout" accept-charset="UTF-8" method="post">'''
>>> res = jionlp.remove_html_tag(text)
>>> print(res)

# '中国<!-- 美国经济风险 -->go to the airport'
  • 该方法中无法删除包含有中文字符的 html 标签,出于此类标签依然包含有效信息的考虑。

删除电话号码

remove_phone_number

删除文本中的电话号码信息

>>> import jionlp as jio
>>> text = '有疑问请联系张小姐18340234920,或拨打(028)58291283。。' 
>>> phones = jio.remove_phone_number(text))

# '有疑问请联系张小姐,或拨打。。' 

删除文本中的异常字符

remove_exception_char

删除文本中的异常字符,一般用于剔除无关噪声,处理分析数据。

>>> text = '''中国人民坚强伟大√~~'''
>>> res = jionlp.remove_exception_char(text)
>>> print(res)

# '中国人民坚强伟大~~'
  • 该方法默认保留常用的标点、英文字母、多种形式编码的数字(如全角12,①等)、常用数学物理单位,汉字集。
  • 该方法默认删除不常见的符号(如︻Ù等)、日文、俄文、希腊字母、不常见的数学物理单位与运算符。不常见的中文字符。unicode 编码的扩展集等。
  • 正则表达式位于 JioNLP/jionlp/rule/JioNLP/jionlp/rule 中的 EXCEPTION_PATTERN,如有特殊需求可以自行修改。

删除文本中的冗余字符

remove_redundant_char

删除文本中的冗余字符,一般用于剔除冗余噪声,处理分析数据。

>>> text = '''那个家伙巨搞笑,笑死我啦哈哈哈哈哈哈哈哈哈~~~~~~~~~'''
>>> res = jionlp.remove_redundant_char(text)
>>> print(res)

# '那个家伙巨搞笑,笑死我啦哈~'
  • 该方法默认对冗余字符仅保留一个。
  • 该方法默认redundant_chars 为关键字参数,用于指定自定义的冗余字符集。若不指定,则加载默认的冗余字符集。
  • 默认的冗余字符集位于 JioNLP/jionlp/rule/JioNLP/jionlp/rule 中的 REDUNDANT_PATTERN,如有特殊需求可以自行修改。

清洗文本

clean_text

清洗文本,步骤包括去除 html 标签、去除异常字符、去除冗余字符、去除括号补充内容、去除 URL、去除 E-mail、去除电话号码,将全角字母数字空格替换为半角,一般用于将其当做无关噪声,处理分析数据。

>>> text = '''<p><br></p>       <p><span>在17日举行的十三届全国人大一次会议记者会上,环境保护部部长李干杰就“打好污染防治攻坚战”相关问题回答记者提问。李干杰表示
,打好污染防治攻坚战,未来将聚焦“围绕三类目标,突出三大领域,强化三个基础”开展具体工作。</span></p><p><span>顶层设计聚焦“三个三”</span></p><p><span>党的十八大以来>,我国生态环境保护工作乃至整个生态文明建设工作,决心之大、力度之大、成效之大前所未有,取得了历史性成就,发生了历史性变革。(责任编辑:唐小林)联系电话:13302130583,邮箱:[email protected]~~~~'''
>>> res = jionlp.clean_text(text)
>>> print(res)
>>> print(jionlp.clean_text.__doc__)

# ' 在17日举行的十三届全国人大一次会议记者会上,环境保护部部长李干杰就“打好污染防治攻坚战”相关问题回答记者提问。李干杰表示,打好污染防治攻坚战,未来将
聚焦“围绕三类目标,突出三大领域,强化三个基础”开展具体工作。顶层设计聚焦“三个三”党的十八大以来,我国生态环境保护工作乃至整个生态文明建设工作,决心之大、力度之大、>成效之大前所未有,取得了历史性成就,发生了历史性变革。联系电话:,邮箱:~'
  • 去除异常字符主要指由于非 UTF-8 编码造成的异常字符,如“板簳浠?拷涔”等
  • 去除冗余字符主要指文本中有多个连续的空格,“~~~~”等重复冗余信息,缩减为1个字符。
  • 该方法中的所有关键字参数均为 bool 型,支持选择控制是否去除相应类型的数据

金额数字转汉字

money_nnum2char

给定一条数字金额,返回其汉字大写结果。

>>> import jionlp as jio
>>> num = 120402810.03
>>> print(jio.money_num2char(num, sim_or_tra='tra'))
>>> num = '38,009.0'
>>> print(jio.money_num2char(num, sim_or_tra='sim'))

# 壹亿贰仟零肆拾萬贰仟捌佰壹拾點零叁
# 三万八千零九
  • sim_or_tra('sim'|'tra')参数控制返回的汉字数字为“一”或“壹”。
  • 最多支持12位整数位数字,即“千亿”

归一化文本中的 E-mail

replace_email

替换文本中的 E-mail 信息为一个归一化 token,一般用于模型的预处理,保持类似于 Bert 的统一的 token 风格,去除数据噪声。

>>> text = '张晨星[email protected],现在电子邮件可以带中文了吗?'
>>> res = jionlp.replace_email(text)
>>> print(res)

# '张晨星<url>,现在电子邮件可以带中文了吗?'
  • 从该例中可知,不支持电子邮件的中文格式
  • <url>可以用于 Bert 的统一输入。

归一化电话号码

replace_phone_number

归一化文本中的电话号码信息为一个归一化 token,一般用于模型的预处理,保持类似于 Bert 的统一的 token 风格,去除数据噪声。

>>> import jionlp as jio
>>> text = '有疑问请联系张小姐18340234920,或拨打(028)58291283。。' 
>>> phones = jio.replace_phone_number(text))

# '有疑问请联系张小姐<tel>,或拨打<tel>。。' 
  • 默认 token 为<tel>

归一化文本中的 QQ 号

replace_qq

归一化文本中的 QQ 号码信息为一个归一化 token,一般用于模型的预处理,保持类似于 Bert 的统一的 token 风格,去除数据噪声。

>>> text = '你加一下我的QQ: 123410942'
>>> res = jionlp.replace_qq(text)
>>> print(res)

# '你加一下我的QQ: <qq>'
  • 该方法中提供了严格匹配 qq 字符的规则,采用 strict(bool) 参数实现;
  • 默认 token 为 <qq>

归一化文本中的身份证号

replace_id_card

归一化文本中的 身份证ID 号码信息为一个归一化 token,一般用于模型的预处理,保持类似于 Bert 的统一的 token 风格,去除数据噪声。

>>> text = '此人身份证号是 21040319560330098x,曾经...'
>>> res = jionlp.replace_id_card(text)
>>> print(res)

# '此人身份证号是 <id>,曾经...'
  • 默认 token 为 <id>

归一化文本中的 URL

replace_url

归一化文本中的 URL 号码信息为一个归一化 token,一般用于模型的预处理,保持类似于 Bert 的统一的 token 风格,去除数据噪声。

>>> text = '让我这个手机知乎党来终结这个问题吧!http://link.ipaiban.com/#手机文字链接生成器!'
>>> res = jionlp.replace_url(text)
>>> print(res)

# '让我这个手机知乎党来终结这个问题吧!<url>#手机文字链接生成器!'
  • 默认 token 为 <url>

归一化文本中的 IP 地址

replace_ip_address

归一化文本中的 IP 地址信息为一个归一化 token,一般用于模型的预处理,保持类似于 Bert 的统一的 token 风格,去除数据噪声。

>>> text = 'https://10.28.104.169/pdf/2004.03705.pdf'
>>> res = jionlp.replace_ip_address(text)
>>> print(res)

# 'https://<ip>/pdf/2004.03705.pdf'
  • 默认 token 为 <ip>
  • 一般首先删除 URL,然后删除 IP 地址。否则可能如上例造成 URL 格式错误。
Clone this wiki locally