《Python自然语言实战》——总结(一)

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

正则表达式的作用:

(1)将文档内容从非结构化转为结构化以便后续的文本挖掘

(2)去除“噪声”,在处理大量文本片段的时候,有非常多的文字信息与最终输出的文本无关。这些无关的片段称之为“噪声”。

1. 匹配字符串

在Python中会使用re模块来实现正则表达式。

re.search(regres,string)

该方法可也检查这个string字符串是否匹配正则表达式regex。如果表达式匹配则会返回一个match对象,如果没有匹配,则返回None。

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

查找哪些语句包含“爬虫”这个关键字,python的代码实现如下:

import re
text_string = "文本最重要的涞源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。" \
              "利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。" \
              "根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。"
regrex = "爬虫"
p_string = text_string.split("。")  # 以句号为分隔符,通过split切分
for line in p_string:
    if re.search(regrex,line) is not None:  # search方法是用来查找匹配当前行是否匹配这个regrex,返回的是一个match对象
        print(line)  # 如果匹配到,打印这行信息

上述代码的运行结果:

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

同理,查找哪些语句包含“文本”这个关键字,python的代码实现如下:

import re
text_string = "文本最重要的涞源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。" \
              "利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。" \
              "根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。"
regrex = "文本"
p_string = text_string.split("。")  # 以句号为分隔符,通过split切分
for line in p_string:
    if re.search(regrex,line) is not None:  # search方法是用来查找匹配当前行是否匹配这个regrex,返回的是一个match对象
        print(line)  # 如果匹配到,打印这行信息

代码运行结果如下:

文本最重要的涞源无疑是网络
我们要把网络中的文本获取形成一个文本数据库

例2: 匹配任意一个字符

正则表达式中,有一些保留的特殊符号可以帮助我们处理一些常用逻辑。

符号含义
.匹配任意一个字符

举例:

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

提示:"."代替任何单个字符(换行符除外)

现在演示,如何查找包含“爬”+任意一个字的句子,代码如下:

import re
text_string = "文本最重要的涞源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。" \
              "利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。" \
              "根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。"
regrex = "爬."
p_string = text_string.split("。")  # 以句号为分隔符,通过split切分
for line in p_string:
    if re.search(regrex,line) is not None:  # search方法是用来查找匹配当前行是否匹配这个regrex,返回的是一个match对象
        print(line)  # 如果匹配到,打印这行信息

运行结果如下:

利用一个爬虫抓取到网络中的信息
爬取的策略有广度爬取和深度爬取
根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分

同理,查找包含“用户”+任意一个字的句子,代码如下:

import re
text_string = "文本最重要的涞源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。" \
              "利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。" \
              "根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。"
regrex = "用户."
p_string = text_string.split("。")  # 以句号为分隔符,通过split切分
for line in p_string:
    if re.search(regrex,line) is not None:  # search方法是用来查找匹配当前行是否匹配这个regrex,返回的是一个match对象
        print(line)  # 如果匹配到,打印这行信息

代码运行结果如下:

根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分

例3:匹配起始和结尾字符串

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

举例:

“[bcr]at” 代表的是匹配"bat" "cat"以及 “rat”

以下文字,句子和句子之间以逗号分隔

​ [重要的]今年第七号台风23日登陆广东东部沿海地区。

​ 上海发布车库销售监管通知:违规者暂停网签资格。

​ [紧要的]中国对连发强硬信息,印度急切需要结束对峙。

希望提取以[重要的]或者[紧要的]为起始的新闻标题。代码如下:

import re
text_string = ["[重要的]今年第七号台风23日登陆广东东部沿海地区。","上海发布车库销售监管通知:违规者暂停网签资格。","[紧要的]中国对连发强硬信息,印度急切需要结束对峙。"]
regrex = "^\[[重紧]..\]"
for line in text_string:
    if re.search(regrex,line) is not None:
        print(line)
    else:
        print('not match')

运行结果如下:

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

观察数据,我们发现一些新闻标题是以"[重要的]" “[紧急的]“为起始,所以需要添加”^“特殊符号代表起始,之后因为存在"重"或"紧”,所以我们使用”[ ]“匹配多个字符,然后以”." “.” 代表之后的任意两个字符。

2.使用转义符

上述代码中,使用"\"为转义符,因为"[ ]"在正则表达式中是特殊符号。

如果需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。在Python中可使用r"\\"表示。匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,表达式更为直观。

举例:匹配字符串中的反斜杠"nee\dle"。

import re
if re.search("\\\\","I have one nee\dle"):
    print("match it")
else:
    print("not match")

运行结果:match it

另一种写法:

if re.search(r"\\", "I have one nee\dle"):
    print("match it")
else:
    print("not match")

3. 抽取文本中的数字

(1)通过正则表达式匹配年份

"[0-9]“代表的是从0到9的所有数字,相对的”[a-z]"代表的是从a到z的所有小写字母。

例:首先定义一个list分配一个变量strings,匹配年份是1000年~2999年之间。代码如下:

import re
year_strings = []
strings = ['war of 1812','There are 5280 feet to a mile','Happy New Year 2016!']
for string in strings:
    # print(string)
    if re.search("[1-2][0-9]{3}",string):
        year_strings.append(string)
print(year_strings)

上述代码中"[1-2][0-9]{3}"表示的是:字符串有英文有数字,匹配其中的数字部分,并且是在1000~2999之间,{3}代表的是重复之前的[0-9]三次,是[0-9][0-9][0-9]的简化写法。

(2)抽取所有的年份

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

例:定义一个字符串years_string,其中的内容是"2015 was a good year, but 2016 will be better!"。现在抽取一下所有的年份。代码如下:

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

运行结果:[‘2016’, ‘2017’]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值