专栏首页华章科技NLP将迎来黄金十年,7个案例带你入门(附Python代码)

NLP将迎来黄金十年,7个案例带你入门(附Python代码)

导读:近日,微软研究院发文称,NLP即将迎来“黄金十年”。他们认为,各领域对NLP的需求会大幅度上升,对NLP质量也提出更高要求。如果你想赶上这“黄金十年”,现在好好学习还来得及!

很多的数据科学库、框架、模块以及工具箱可以有效地实现NLP大部分常见的算法与技术,掌握与运用正则表达式、Numpy是开始NLP工作的好方式。

作者:涂铭,刘祥,刘树春,如需转载请联系大数据(ID:hzdashuju)

对于自然语言处理的学习,很多人会争论用什么样的编程语言实现最好?有些人认为是Java或者时下流行的Scala,我认为Python才是最佳的选择!

对于学习和从事自然语言处理工作来说,Python具有几大优势:

  • 提供丰富的自然语言处理库
  • 编程语法相对简单(尤其易于理解)
  • 具有很多数据科学相关的库

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

正则表达式是一种定义了搜索模式的特征序列,主要是用于字符串的模式匹配,或是字符的匹配。随着计算机的普及以及互联网的发展,大量的信息以电子文档方式呈现在人们的面前。

NLP通常所需要处理的语料一部分来自于web网页的信息抽取,一部分来自于文本格式的文档。Web网页具有很强的开发价值,具有时效性强,信息量大,结构稳定,价值高等特点,文本格式的文档多来源于人为编写或系统生成,其中包含了非结构化文本、半结构化文本以及结构化文本。

正则表达式的作用之一是将这些文档内容从非结构化转为结构化以便后续的文本挖掘。

正则表达式的另一个作用就是去除“噪声”。在处理大量文本片段的时候,有非常多的文字信息与最终输出的文本无关,这些无关的片段称之为“噪声”(比如url或链接、语气助词、标点符号等)。

正则表达式是处理NLP的最基本的手段之一,学习与掌握正则表达式在Python中的应用,可以帮助我们在格式复杂的文本中抽取所需要的文本信息。

比如说抽取以下文本中的年份,每一行的格式不同,因此没有办法通过Python提供的字符串方法来抽取,这个时候我们往往考虑使用正则表达式。

-“July 16, 2017” -“16/07/2009” -“Summer 2008”

02 匹配字符串

在Python中,我们会使用re模块来实现正则表达式。为了让大家更好地理解正则表达式在Python中的应用,我们会通过一系列的例子来阐述。

案例中,我们会提到re的一个方法: re.search。

通过使用re.search(regex,string)这个方法,我们可以检查这个string字符串是否匹配正则表达式regex。如果匹配到,这个表达式会返回一个match对象,如果没有匹配到则返回None。

我们先看下准备的有关爬虫介绍的文字信息。句子和句子之间是以句号分隔。具体的文本如下所示:

文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。

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

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

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

运行上面的程序,我们可以看到输出结果为:

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

例2 匹配任意一个字符

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

符号

含义

.

匹配任意一个字符

▲匹配任意一个字符

我们来举几个例子:

正则表达式

可以匹配的例子

不能匹配的例子

“a.c”

“abc”, “branch”

“add”,“crash”

“..t”

“bat”,“oat”

“it”,“table”

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

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

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

上述代码基本不变,只需要将regex中的“爬”之后加一个“.”,即可以满足需求。我们来看下输出会多一行。因为不仅是匹配到了“爬取”也匹配到了“爬虫”。

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

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

现在介绍另一个特殊符号,具体功能如下表所示。

符号

含义

^

匹配开始的字符串

$

匹配结尾的字符串

▲匹配开始与结尾的字符串

举个例子:

  • “^a”代表的是匹配所有以字母a开头的字符串
  • “a$”代表的是所有以字母a结尾的字符串

我们现在来演示下如何查找以“文本”这两个字起始的句子。代码如下:

import re
text_string = '文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。'
regex = '^文本'
p_string = text_string.split('。') 
for line in p_string:
if re.search(regex,line) is not None:        
print(line) 

我们可以看到输出为:

文本最重要的来源无疑是网络

例4 使用中括号匹配多个字符

现在介绍另一个特殊符号,具体功能如下表所示:

符号

含义

[ ]

匹配多个字符

▲匹配多个字符串

举个例子:

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

我们先看下文字信息。句子和句子之间是以句号分隔。

  • [重要的] 今年第七号台风23日登陆广东东部沿海地区
  • 上海发布车库销售监管通知:违规者暂停网签资格
  • [紧要的] 中国对印连发强硬信息,印度急切需要结束对峙

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

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

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

运行以上代码,我们看到结果正确提取了所需的新闻标题。

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

03 使用转义符

上述代码中,我们看到使用了“\”为转义符,因为“[ ]”在正则表达式中是特殊符号。

与大多数编程语言相同,正则表达式里使用“\”作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符“\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠“\\\\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r“\\”表示。同样,匹配一个数字的“\\d”可以写成r“\d”。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

为了方便理解我们来举个例子:

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

通过上述例子,我们就可以匹配到字符串中匹配到的那个反斜杠“nee\dle”。为了简洁一点我们可以换一个写法:

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

通过加一个r,我们就不用担心是不是漏写反斜杠了。

04 抽取文本中的数字

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

“[0-9]”代表的是从0到9的所有数字,那相对的“[a-z]”代表的是所有a-z小写字母。我们通过一个小例子来讲解下如何使用。首先我们定义一个list分配于一个变量strings,匹配包含的年份是在1000年~2999年之间的。代码如下:

import re
strings = ['War of 1812', 'There are 5280 feet to a mile', 'Happy New Year 2016!']
for string in strings:
    if re.search('[1-2][0-9]{3}', string):#字符串有英文有数字,匹配其中的数字部分,并且是在1000~2999之间,{3}代表的是重复之前的[0-9]三次,是[0-9] [0-9] [0-9]的简化写法。
        year_strings.append(string)
print(year_strings)

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)

在Anaconda中执行这段语句,我们能看到输出['2016', '2017']。

延伸学习:关于Python的教程比比皆是,官方教程是不错的入门选择: https://docs.python.org/3/tutorial/

本文分享自微信公众号 - 大数据(hzdashuju)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 高能酷炫!你绝没用过的一款空间可视化工具

    kepler.gl由大名鼎鼎的独角兽公司 Uber 团队开发,现已开源。库直接集成到了 Jupyter Notebook 中,非常方便使用。

    华章科技
  • 关于反爬虫,看这一篇就够了

    本文来自携程酒店研发部研发经理崔广宇在第三期【携程技术微分享】上的分享,以下为整理的内容概要。墙裂建议点击下方视频,“现场”围观段子手攻城狮大崔,如何高智商&高...

    华章科技
  • 什么是网络爬虫?有什么用?怎么爬?终于有人讲明白了

    导读:网络爬虫也叫做网络机器人,可以代替人们自动地在互联网中进行数据信息的采集与整理。在大数据时代,信息的采集是一项重要的工作,如果单纯靠人力进行信息采集,不仅...

    华章科技
  • Idea 突然打不开了

    1、下载压缩包解压后得到jetbrains-agent.jar 2、启动IDEA,试用(Evaluate for free)进入IDE 3、

    OPice
  • 运行时序列化 2

    使用这些特性是基于反射技术完成的,性能有一点损伤。还有在极少数的情况下,这些特性不能提供你想要的全部控制。你的类型通过实现ISerializable接口,也能支...

    小蜜蜂
  • 专栏 | 云脑科技-实习僧文本匹配模型及基于百度PaddlePaddle的应用

    机器之心
  • 优秀博客文章 | 微信跳转研究

    微信客户端提供了部分Schemes供外部应用跳转进微信客户并执行相关操作,网上有网友总结了一批scheme,但是我试了一下,基本全部都失效了,不过weixin:...

    用户1467662
  • 爬虫究竟是合法还是违法的?

    此前推送的文章《只因写了一段爬虫,公司200多人被抓!》讲述程序员因写爬虫而被刑侦的事件。文章传播很广,大家讨论最热的是:爬虫究竟是合法还是违法的?

    华章科技
  • 爬虫究竟是合法还是违法的?

    之前朋友圈和各大公号传播了一篇文章《 只因写了一段爬虫,公司 200 多人被抓!》,讲述程序员因写爬虫而被刑侦的事件。很多爬虫工程师看了之后感觉人心惶惶的,当时...

    崔庆才
  • 产品更新——智慧零售V1.3商品+V1.4订单优化上线!

    选择出库类型,添加商品信息并保存即可。( 出库是减库存操作,出库记录保存后,系统将按照出库单中的商品信息和数量对应更新商品库中的库存信息。)

    场景录小程序

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动