正则表达式在NLP的基本应用

CSDN博客:皮乾东
知乎:Htrying
微博:Htring的微博
微信公众号:自然语言处理爱好者(ID:NLP_lover)

0 前言

正则表达式是一种定义了搜索模式的特征序列,主要是用于字符串的模式匹配,或是字符的匹配。随着计算机的普及以及互联网的发展,大量的信息以电子文档的方式呈现在人们的眼前。NLP通常锁需要处理的语料一部分来自于web王爷的信息抽取,一部分来自于文本格式的文档。Web网页具有很强的开发价值,具有时效强,信息量大,结构稳定,价值高等特点。正则表达式的作用之一是将这些文档内容从非结构化转为结构化,以便后续的文本挖掘。

1 匹配字符串

在python中,我们会使用re模块来实现正则表达式。用到比较多的方法:re.search(regex,string) 这个方法,我们可以检查这个string是否匹配正则表达式regex,如果匹配,则返回一个mathch对象,如果没有就返回None。
测试文本(句子与句子之间用句号隔开):
文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫爬取到网络中的信息。爬取的策略又广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。

1.1 获取包含“爬虫”这个关键字的句子

代码:

#导入正则表达式需要的包
import re
#测试文档
text_string='文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫爬取到网络中的信息。爬取的策略又广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。'
#定义一个简单的正则表达式
regex='爬虫'
#使用。把测试文档进行分割
p_string=text_string.split("。")
#对分割后的句子进行遍历,找出与正则表达式匹配的句子
for line in p_string:
    #search方法是用来查找匹配当前行是否匹配这个regex,返回一个match对象
    if re.search(regex, line) is not None:
        #如果匹配到了就打印出来
        print(line)

结果:
利用一个爬虫爬取到网络中的信息
根据用户的需求,爬虫可以有主题爬虫和通用爬虫

1.2 匹配任意一个字符

这里使用正则表达式中的保留字符“.”,其含义为:匹配任意一个单字符(换行除外)
例如:

正则表达式 可以匹配的例子 不能匹配的例子
“a.c” “abc”,”branch” “add”,”crash”
“..t” “bat” ,”oat” “it”,”table”

查找出:”爬+任意一个字”
程序:

import re
#测试文档
text_string='文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫爬取到网络中的信息。爬取的策略又广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。'
#定义一个简单的正则表达式
regex1='爬虫'
regex2='爬.'
#使用。把测试文档进行分割
p_string=text_string.split("。")
#对分割后的句子进行遍历,找出与正则表达式匹配的句子
for line in p_string:
    if re.search(regex2, line) is not None:
        print("符合regex2:"+line)

结果:
符合regex2:利用一个爬虫爬取到网络中的信息
符合regex2:爬取的策略又广度爬取和深度爬取
符合regex2:根据用户的需求,爬虫可以有主题爬虫和通用爬虫

1.3 匹配起始和结尾字符串

符号 含义
^ 匹配开始的字符串
$ 匹配结束的字符串

例如:
“^a”:匹配所有a开始的字符串
“a$”:匹配所有a结尾的字符串
案例:查找以”文本”起始的句子:

import re
#测试文档
text_string='文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫爬取到网络中的信息。爬取的策略又广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。'
#定义一个简单的正则表达式
regex1='爬虫'
regex2='爬.'
regex3="^文本"
#使用。把测试文档进行分割
p_string=text_string.split("。")
#对分割后的句子进行遍历,找出与正则表达式匹配的句子
for line in p_string:
    if re.search(regex3, line) is not None:
        print("符合regex3:"+line)

结果:
符合regex3:文本最重要的来源无疑是网络

1.4 使用中括号匹配多个字符

符号 含义
[] 匹配多个字符

如:”[brc]at”代表的是匹配“bat””cat”以及“rat”
案例:提取出以[主要的]或者[紧要的]为起始的新闻标题。文档:
[重要的]今年第七号台风23日登录广东东部沿海地区。
上海发布车库销售监管通知:违规者暂停网签资格。
[紧要的]中国对印连发强硬信息,印度急切需要结束对峙。
代码:

#导入正则表达式需要的包
import re
#测试文档
text_string2=['[重要的]今年第七号台风23日登录广东东部沿海地区','上海发布车库销售监管通知:违规者暂停网签资格','[紧要的]中国对印连发强硬信息,印度急切需要结束对峙']
#定义一个简单的正则表达式
#需要注意的是这里的\是转义字符(在正则表达式中[]式特殊符号)
regex4="^\[[重紧]..\]"
#使用。把测试文档进行分割
p_string=text_string.split("。")
#对分割后的句子进行遍历,找出与正则表达式匹配的句子
for line in text_string2:
    if re.search(regex4, line) is not None:
        print("符合regex4:"+line)

结果
符合regex4:[重要的]今年第七号台风23日登录广东东部沿海地区
符合regex4:[紧要的]中国对印连发强硬信息,印度急切需要结束对峙

2 使用转义字符

假如你要匹配“\”,那么编程语言表示的正则表达式就需要“\\”(前两个和后两个分别用于在编程语言里转义为反但斜杠,转成两个反但斜杠后再在正则表达式里转义为一个反斜杠),然而在python中使用r"\\"即可解决。
例如:

import re
if re.search(r"\\","I have one nee\dle") is not None:
print("match")

读者可自行测试。

3 抽取文字中的数字

3.1 通过正则表达式匹配年份

import re
strings=['War of 1812','There are 5280 feet to a mile','Happy New Year 2016!']
#定义一个存放结果的列表
year_strings=[]
for string in strings:
    #这里的正则表达式:年份匹配的范围为1000-2999,{3}重复[0-9]三次
    if re.search("[1-2][0-9]{3}", string):
        year_strings.append(string)
print(year_strings)

结果:

['War of 1812', 'Happy New Year 2016!']

3.2 抽取所有的年份

这是使用re模块的另一个方法findall()来返回匹配带正则表达式的那部分字符串。re.findall("[a-z]","abc")得到的结果:[‘a’,’b’,’c’]。
例如:

import re
year_strings2='2016 was a good year,but 2017 will be better!'
print(re.findall('[2][0-9]{3}', year_strings2))

结果:

['2016', '2017'

4 总结

以上是简单的正则表达式的介绍,更多可参见文件:链接:https://pan.baidu.com/s/1fC4OGokNjYG51uuaYJlLpQ 密码:ehod
正则表达式在NLP的基本应用_第1张图片

你可能感兴趣的:(python入门,自然语言处理,自然语言处理爱好者)