前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >教你用Python进行自然语言处理(附代码)

教你用Python进行自然语言处理(附代码)

作者头像
数据派THU
发布于 2018-06-12 04:17:43
发布于 2018-06-12 04:17:43
2.4K0
举报
文章被收录于专栏:数据派THU数据派THU

自然语言处理是数据科学中的一大难题。在这篇文章中,我们会介绍一个工业级的python库。

自然语言处理(NLP)是数据科学中最有趣的子领域之一,越来越多的数据科学家希望能够开发出涉及非结构化文本数据的解决方案。尽管如此,许多应用数据科学家(均具有STEM和社会科学背景)依然缺乏NLP(自然语言处理)经验。

在这篇文章中,我将探讨一些基本的NLP概念,并展示如何使用日益流行的Python spaCy包来实现这些概念。这篇文章适合NLP初学者阅读,但前提是假设读者具备Python的知识。

你是在说spaCy吗?

spaCy是一个相对较新的包,“工业级的Python自然语言工具包”,由Matt Honnibal在Explosion AI.开发。它在设计时目标用户以应用数据科学家为主,这也意味着它不需要用户来决定使用哪个算法来处理常见任务,而且它非常地快—快得难以置信(它用Cython来实现)。如果你熟悉Python数据科学栈,spaCy就是NLP的numpy,它虽然理所当然地位于底层,但是却很直观,性能也相当地高。

那么,它能做什么呢?

spaCy为任何NLP项目中常用的任务提供一站式服务.包括:

  • 符号化(Tokenizatioin)
  • 词干提取(Lemmatization)
  • 词性标注(Part-of-speech tagging)
  • 实体识别(Entity recognition)
  • 依存句法分析(Dependency parsing)
  • 句子的识别(Sentence recognition)
  • 字-向量变换(Word-to-vector transformation)
  • 许多方便的清除文本和标准化文本的方法(cleaning and normalizing text)

我会对这些功能做一个高层次的概述,并说明如何利用spaCy访问它们。

那我们就开始吧。

首先,我们加载spaCy的管线,按照约定,它存储在一个名为nlp的变量中。需要花几秒钟时间声明该变量,因为spaCy预先将模型和数据加载到前端,以节省时间。实际上,这样做可以提前完成一些繁重的工作,使得nlp解析数据时开销不至于过大。 请注意,在这里,我们使用的语言模型是英语,同时也有一个功能齐全的德语模型,在多种语言中均可实现标记化(将在下面讨论)。

我们在示例文本中调用NLP来创建Doc对象。Doc 对象是文本本身NLP任务容器,将文本切分成文字(Span 对象)和元素(Token 对象),这些对象实际上不包含数据。值得注意的是Token 和 Span对象实际上没有数据。相反,它们包含Doc对象中的数据的指针,并且被惰性求值(即根据请求)。绝大多数spaCy的核心功能是通过对Doc (n=33), Span (n=29),和 Token (n=78)对象的方法来实现的。

In[1]:import spacy ...: nlp = spacy.load("en") ...: doc = nlp("The big grey dog ate all of the chocolate, but fortunately he wasn't sick!")

分词(tokenization)

分词是许多自然语言处理任务中的一个基本步骤。分词就是将一段文本拆分为单词、符号、标点符号、空格和其他元素的过程,从而创建token。这样做的一个简单方法是在空格上拆分字符串:

In[2]:doc.text.split() ...: Out[2]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate,', 'but', 'fortunately', 'he', "wasn't", 'sick!']

从表面上,直接以空格进行分词效果还不错。但是请注意, 它忽略了标点符号,且没有将动词和副词分开("was", "n't")。换句话说,它太天真了,它无法识别出帮助我们(和机器)理解其结构和含义的文本元素。让我们来看看spaCy如何处理这个问题:

In[3]:[token.orth_ for token in doc] ...: Out[3]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate', ',', 'but', 'fortunately', 'he', 'was', "n't", ' ', 'sick', '!']

这里,我们访问的每个token的.orth_方法,它返回一个代表token的字符串,而不是一个SpaCytoken对象。这可能并不总是可取的,但值得注意。SpaCy能够识别标点符号,并能够将这些标点符号与单词的token分开。许多SpaCy的token方法为待处理的文字同时提供了字符串和整数的返回值:带有下划线后缀的方法返回字符串而没有下划线后缀的方法返回的是整数。例如:

In[4]:[(token, token.orth_, token.orth) for token in doc] ...:

Out[4]:[(The, 'The', 517), (big, 'big', 742), (grey, 'grey', 4623), (dog, 'dog', 1175), (ate, 'ate', 3469), (all, 'all', 516), (of, 'of', 471), (the, 'the', 466), (chocolate, 'chocolate', 3593), (,, ',', 416), (but, 'but', 494), (fortunately, 'fortunately', 15520), (he, 'he', 514), (was, 'was', 491), (n't, "n't", 479), ( , ' ', 483), (sick, 'sick', 1698), (!, '!', 495)] In[5]: [token.orth_ for token in doc if not token.is_punct | token.is_space] ...: Out[5]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate', 'but', 'fortunately', 'he', 'was', "n't", 'sick']

很酷,对吧?

词干提取

和分词相关的任务是词干提取。词干提取是将一个单词还原成它的基本形式--母词的过程。不同用法的单词往往具有相同意义的词根。例如,practice(练习), practiced(熟练的),和 practising(实习)这三个单词实质上指的是同一件事情。通常需要将相似意义的单词进行标准化,标准化到其基本的形式。使用SpaCy,我们利用标记的.lemma_ 方法访问到每个单词的基本形式。

In[6]:practice = "practice practiced practicing" ...: nlp_practice = nlp(practice) ...: [word.lemma_ for word in nlp_practice] ...: Out[6]: ['practice', 'practice', 'practice']

为什么这个会有用?一个即时用例便是机器学习,特别是文本分类。例如:在创建“单词袋”之前需对文本进行词干提取,避免了单词的重复,因此,该模型可以更清晰地描述跨多个文档的单词使用模式。

词性标注(POS Tagging)

词性标注是将语法属性(如名词、动词、副词、形容词等)赋值给词的过程。共享相同词性标记的单词往往遵循类似的句法结构,在基于规则的处理过程中非常有用。

例如,在给定的事件描述中,我们可能希望确定谁拥有什么。通过利用所有格,我们可以做到这一点(提供文本的语法)。SpaCy采用流行的Penn Treebank POS标记(参见这里)。利用SpaCy,可以分别使用.pos_ 和 .tag_方法访问粗粒度POS标记和细粒度POS标记。在这里,我访问细粒度的POS标记:

In[7]:doc2 = nlp("Conor's dog's toy was hidden under the man's sofa in the woman's house") ...: pos_tags = [(i, i.tag_) fori indoc2] ...: pos_tags ...: Out[7]: [(Conor,'NNP'), ('s, 'POS'), (dog,'NN'), ('s, 'POS'), (toy,'NN'), (was,'VBD'), (hidden,'VBN'), (under,'IN'), (the,'DT'), (man,'NN'), ('s, 'POS'), (sofa,'NN'), (in,'IN'), (the,'DT'), (woman,'NN'), ('s, 'POS'), (house,'NN')]

我们可以看到,'s 的标签被标记为 POS.我们可以利用这个标记提取所有者和他们拥有的东西:

In[8]:owners_possessions = [] ...: for i in pos_tags: ...: if i[1] == "POS": ...: owner = i[0].nbor(-1) ...: possession = i[0].nbor(1) ...: owners_possessions.append((owner, possession)) ...: ...: owners_possessions ...: Out[8]: [(Conor, dog), (dog, toy), (man, sofa), (woman, house)]

这将返回所有者拥有元组的列表。如果你想在这件事上表现成为超级Python能手的话,你可以把它写成一个完整的列表(我认为这是最好的!):

In[9]: [(i[0].nbor(-1), i[0].nbor(+1)) for i in pos_tags if i[1] == "POS"] ...: Out[9]: [(Conor, dog), (dog, toy), (man, sofa), (woman, house)]

在这里,我们使用的是每个标记的.nbor 方法,它返回一个和这个标记相邻的标记。

实体识别

实体识别是将文本中的指定实体分类为预先定义的类别的过程,如个人、地点、组织、日期等。spaCy使用统计模型对各种模型进行分类,包括个人、事件、艺术作品和国籍/宗教(参见完整列表文件))

例如,让我们从贝拉克·奥巴马的维基百科条目中选出前两句话。我们将解析此文本,然后使用Doc 对象的 .ents方法访问标识的实体。通过调用Doc 的这个方法,我们可以访问其他的标记方法 ,特别是 .label_ 和 .label两个方法:

In[10]:wiki_obama = """Barack Obama is an American politician who served as ...: the 44th President of the United States from 2009 to 2017.He is the first ...: African American to have served as president, ...: as well as the first born outside the contiguous United States.""" …: …:nlp_obama = NLP(wiki_obama) …:[(i, i.label_, i.label) for i in nlp_obama.ents] ...: Out[10]: [(Barack Obama, 'PERSON', 346), (American, 'NORP', 347), (the United States, 'GPE', 350), (2009 to 2017, 'DATE', 356), (first, 'ORDINAL', 361), (African, 'NORP', 347), (American, 'NORP', 347), (first, 'ORDINAL', 361), (United States, 'GPE', 350)]

您可以看到在本例中,模型所识别的实体以及它们的精确程度。PERSON 是不言自明的;NORP是国籍或宗教团体;GGPE标识位置(城市、国家等等);DATE 标识特定的日期或日期范围, ORDINAL标识一个表示某种类型的顺序的单词或数字。

在我们讨论Doc方法的主题时,值得一提的是spaCy的句子标识符。NLP任务希望将文档拆分成句子的情况并不少见。利用SpaCy访问Doc's.sents 方法并不难做到:

In[11]:for ix, sent in enumerate(nlp_obama.sents, 1): ...: print("Sentence number {}: {}".format(ix, sent)) ...: Sentence number 1: Barack Obama is an American politician who served as the 44th President of the United States from 2009 to 2017.Sentence number 2: He is the first African American to have served as president, as well as the first born outside the contiguous United States.

目前就是这样。在以后的文章中,我将展示如何在复杂的数据挖掘和ML的任务中使用spaCy。

TrueSight是一个AIOps平台,由机器学习和分析提供动力支持,它解决了多个云的复杂性,并且提高了数字转化的速度,从而提升了IT运­作的效率。

原文链接:https://dzone.com/articles/nlp-in-python

译者简介

陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城计算机软件与系统公司工程师,大唐微电子公司工程师,现任北京吾译超群科技有限公司技术支持。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习和自然语言处理(NLP)方面积累有一定的经验。业余时间喜爱翻译创作,翻译作品主要有:IEC-ISO 7816、伊拉克石油工程项目、新财税主义宣言等等,其中中译英作品“新财税主义宣言”在GLOBAL TIMES正式发表。能够利用业余时间加入到THU 数据派平台的翻译志愿者小组,希望能和大家一起交流分享,共同进步。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python中的NLP
自然语言处理(NLP)是数据科学中最有趣的子领域之一,数据科学家越来越期望能够制定涉及利用非结构化文本数据的解决方案。尽管如此,许多应用数据科学家(来自STEM和社会科学背景)都缺乏NLP经验。
February
2018/11/30
4K1
如何用Python处理自然语言?(Spacy与Word Embedding)
本文教你用简单易学的工业级Python自然语言处理软件包Spacy,对自然语言文本做词性分析、命名实体识别、依赖关系刻画,以及词嵌入向量的计算和可视化。
王树义
2018/08/22
2.6K0
如何用Python处理自然语言?(Spacy与Word Embedding)
NLP入门+实战必读:一文教会你最常见的10种自然语言处理技术(附代码)
大数据文摘作品 编译:糖竹子、吴双、钱天培 自然语言处理(NLP)是一种艺术与科学的结合,旨在从文本数据中提取信息。在它的帮助下,我们从文本中提炼出适用于计算机算法的信息。从自动翻译、文本分类到情绪分析,自然语言处理成为所有数据科学家的必备技能之一。 在这篇文章中,你将学习到最常见的10个NLP任务,以及相关资源和代码。 为什么要写这篇文章? 对于处理NLP问题,我也研究了一段时日。这期间我需要翻阅大量资料,通过研究报告,博客和同类NLP问题的赛事内容学习该领域的最新发展成果,并应对NLP处理时遇到的各类状
大数据文摘
2018/05/24
1.6K0
从“London”出发,8步搞定自然语言处理(Python代码)
【新智元导读】自然语言处理是AI的一个子领域,从人们日常沟通所用的非结构化文本信息中提取结构化数据,以便计算机理解。本文用通俗易懂的语言深入浅出的介绍了自然语言处理,并用Python实现了几个非常有趣的实例。
新智元
2018/08/16
9470
从“London”出发,8步搞定自然语言处理(Python代码)
独家 | 快速掌握spacy在python中进行自然语言处理(附代码&链接)
本文简要介绍了如何使用spaCy和Python中的相关库进行自然语言处理(有时称为“文本分析”)。以及一些目前最新的相关应用。
数据派THU
2019/10/29
3.4K0
独家 | 快速掌握spacy在python中进行自然语言处理(附代码&链接)
NLP揭秘:从自然语言处理的角度出发,女儿也是灭霸的真爱
《复仇者联盟4:终局之战》仍在热映中。在看到大结局的同时,本文将带你通过数据科普的眼光来回顾《复仇者联盟3:无限战争》:看看这群世界上最强的超级英雄们最爱说的词汇是哪些?
商业新知
2019/05/16
1.1K0
NLP揭秘:从自然语言处理的角度出发,女儿也是灭霸的真爱
NeuralCoref: 用指代消解来做一个“能多轮对话的问答对话机器人”
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
blmoistawinde
2019/10/30
1.7K0
Python自然语言处理面试:NLTK、SpaCy与Hugging Face库详解
NLTK、SpaCy与Hugging Face库作为Python自然语言处理(NLP)领域的三大主流工具,其理解和应用能力是面试官评价候选者NLP技术实力的重要标准。本篇博客将深入浅出地探讨Python NLP面试中与NLTK、SpaCy、Hugging Face库相关的常见问题、易错点,以及如何避免这些问题,同时附上代码示例以供参考。
Jimaks
2024/04/19
3680
用spaCy自然语言处理复盘复联无限战争(上)
《复仇者联盟4:终极游戏》已经上映不短的时间,我,和世界上大多数人一样,在第一时间冲到电影院去看,体验《复仇4》是如何拯救世界并且结束第一个十年的故事的。为了平息我的紧张情绪,缓解等待,我想重温上一部电影《复联3:无限战争》,当然,由于我是一个搞技术的,我的回顾旅行将用到的是自然语言处理,简称NLP。
AiTechYun
2019/05/29
6620
用spaCy自然语言处理复盘复联无限战争(上)
Python文本预处理:步骤、使用工具及示例
本文将讨论文本预处理的基本步骤,旨在将文本信息从人类语言转换为机器可读格式以便用于后续处理。此外,本文还将进一步讨论文本预处理过程所需要的工具。
AI科技大本营
2019/05/06
1.7K0
Python文本预处理:步骤、使用工具及示例
一文带你读懂自然语言处理 - 事件提取
每天产生的文本信息令人叹为观止。数百万数据源以新闻稿、博客、消息、手稿和无数其他形式发布,因而自动组织和处理就必不可少。
AI研习社
2019/05/15
1.5K0
一文带你读懂自然语言处理 - 事件提取
5个Python库可以帮你轻松的进行自然语言预处理
自然语言是指人类相互交流的语言,而自然语言处理是将数据以可理解的形式进行预处理,使计算机能够理解的一种方法。简单地说,自然语言处理(NLP)是帮助计算机用自己的语言与人类交流的过程。
deephub
2021/05/18
9480
【独家】自然语言处理(NLP)入门指南
致谢 钟崇光博士参与了数据派THU于6月5日、THU数据派于6月8日发布的《循序渐进提升Kaggle竞赛模型精确度,以美国好事达保险公司理赔为例》一文的校对工作,并且给出了许多有建设性的意见,在此数据派翻译组对钟博士表达诚挚的感谢! 作者:Melanie Tosik 翻译:闵黎 校对:丁楠雅 本文长度为1100字,建议阅读3分钟 Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过自然语言请求来生产个性化旅游推荐路线。回顾她的学习历程,她为期望入门自然语言处理的初学者
数据派THU
2018/01/29
2K0
【独家】自然语言处理(NLP)入门指南
【AI】探索自然语言处理(NLP):从基础到前沿技术及代码实践
自然语言处理(NLP)是人工智能领域的一个重要分支,它使计算机能够理解、生成、分析和与人类语言进行交互。随着科技的不断发展,NLP技术得到了显著提升,尤其是在深度学习的帮助下,NLP正在越来越广泛地应用于各种领域,如搜索引擎、智能助手、机器翻译、语音识别和情感分析等。
云边有个稻草人
2025/02/03
2070
自然语言处理(NLP)——简介
自然语言处理(NLP Natural Language Processing)是一种专业分析人类语言的人工智能。就是在机器语⾔和⼈类语言之间沟通的桥梁,以实现人机交流的目的。 在人工智能出现之前,机器智能处理结构化的数据(例如Excel里的数据)。但是网络中 大部分的数据都是非结构化的,例如:文章、图片、音频、视频... 在非结构数据中,文本的数量是最多的,他虽然没有图片和视频占用的空间大,但是他的 信息量是最大的。 为了能够分析和利用这些文本信息,我们就需要利用NLP技术,让机器理解这些文本信息,并加以利用。
SpringSun
2021/07/14
2.8K0
自然语言处理(NLP)——简介
关于NLP你还不会却必须要学会的事儿—NLP实践教程指南第一编
作者 | Dipanjan (DJ) Sarkar 编译 | 姗姗 出品 | 人工智能头条(公众号ID:AI_Thinker) 【人工智能头条导读】在研究和处理自然语言处理的很多问题时,除了关注各种各样基础的数据,高级的深度学习模型、算法外,其实中间还涉及了很多处理技术,比如:词干提取、词形还原、句法分析、语义分析等,虽然不同的语言特征不同,但是这其中大部分步骤都是存在于大多数NLP领域任务中的。今天特别为大家准备了一篇包含NLP重要技术概念学习和实践的文章,希望无论是基础数据、技术理论还是代码实践大家都可
用户1737318
2018/07/20
1.9K0
使用Python中的NLTK和spaCy删除停用词与文本标准化
【磐创AI 导读】:本文介绍了如何使用Python中的NLTK和spaCy删除停用词与文本标准化,欢迎大家转发、留言。想要更多电子杂志的机器学习,深度学习资源,大家欢迎点击上方蓝字关注我们的公众号:磐创AI。
磐创AI
2019/09/09
4.3K0
使用Python中的NLTK和spaCy删除停用词与文本标准化
入门 | 自然语言处理是如何工作的?一步步教你构建 NLP 流水线
计算机非常擅长使用结构化数据,例如电子表格和数据库表。但是我们人类通常用文字交流,而不是使用电子表格来交流。这对计算机来说不是一件好事。
机器之心
2018/08/21
1.7K0
入门 | 自然语言处理是如何工作的?一步步教你构建 NLP 流水线
Python 自然语言处理实用指南:第一、二部分
在本节中,您将在自然语言处理(NLP)的背景下了解 PyTorch 1.x 的基本概念。 您还将学习如何在计算机上安装 PyTorch 1.x,以及如何使用 CUDA 加快处理速度。
ApacheCN_飞龙
2023/04/27
1.4K0
深度 | 你知道《圣经》中的主要角色有哪些吗?三种NLP工具将告诉你答案!
在思考数据科学的时候,我们常常想起数字的统计分析。但是,各种组织机构越来越频繁地生成大量可以被量化分析的非结构文本。一些例子如社交网络评论、产品评价、电子邮件以及面试记录。
机器之心
2018/07/26
1.7K0
深度 | 你知道《圣经》中的主要角色有哪些吗?三种NLP工具将告诉你答案!
推荐阅读
相关推荐
Python中的NLP
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档