根据行情,只有21%的数据目前是结构化的。谈话、发推文、在 WhatsApp上发信息以及其他各种各样的活动,都在持续不断的产生数据。而大多数这种数据都是以非结构化的文本形式存在的。
最著名的例子有:社交媒体上的推文/帖子、用户到用户的聊天记录、新闻、博客、文章、产品或服务测评和医疗行业的病人记录。最近的例子有聊天机器人和其他声音驱动的机器人。
尽管我们有高维数据,但目前其中的信息并不能直接获得――除非被人工处理过或被一个自动化系统分析过。
为了从文本数据中产生具有重要意义和可实践的领悟,就需要了解自然语言处理的技巧和原理 。
所以,如果你今年打算打造一个聊天机器人,或者你想运用非结构化的文本数据的力量,那么你算看对了文章,这篇指南揭示了自然语言处理的概念以及它的技巧和实现方法。文章的主要目的是教导自然语言处理的概念以及让你了解把它运用到实际数据集上。

目录 1.自然语言处理简介 2.文本处理
移除噪声
词汇规范化
词形还原
词干提取
对象标准化
3.文本到特征(文本数据上的特征工程)句法分析
从属关系语法
词性标注
实体分析
短语检测
命名实体分析
主题建模
N-grams
统计特征
TF IDF算法
频率/密度特征
可读特征
词汇嵌入
4.自然语言处理面临的重要任务文本分类
文本匹配
莱文斯坦距离
语音匹配
柔性字符串匹配
指代消解
其他问题
5.重要的自然语言处理库 1.自然语言处理简介自然语言处理是数据科学中以智能高效的方式对文本进行系统的分析、理解和信息提取的一个分支。通过利用自然语言处理及其成分,一个人能够组织起巨大数量的文本数据来执行许多自动化任务和解决例如自动摘要、机器翻译、命名实体识别、关系提取、情感分析、语音识别和主题分割等等非常广泛的问题。
开始之前,先解释一下这篇文章中用到的术语:
标记化(tokenization):文本转换为标记的过程
标记(token):文本中出现的词汇或实体
文本对象(text object):句子/短语/词汇/文章
安装NTLK及其数据的步骤:
安装Pip:在终端运行:
sudo easy_install pip安装NTLK:在终端运行
sudopipinstall-Unltk下载NTLK数据:终端python shell下输入如下代码:
```importnltknltk.download()```遵循屏幕上的指令下载所需包或集。其他库可直接使用pip安装。
2.文本处理现有数据中,文本是最非结构化的形式,里面有各种各样的噪声;如果没有预处理,文本数据都不能分析。清理和标准化文本的整个过程叫做文本预处理(text preprocessing),其作用是使文本数据没有噪声并且可以分析。
主要包括三个步骤:
移除噪声
词汇规范化
对象标准化
下图展示了文本预处理流程的结构。

2.1移除噪声
任何与数据上下文和最终输出无关的文本都可被判作噪声。
例如,语言停止词(stopword,语言中常用的词汇:系动词is,am,定冠词the,介词of,in)、URL 或链接、社交媒体实体(提及、标签)、标点符号和特定行业词汇。这一步移除了文本中所有类型的噪声。
移除噪声通用的做法是准备一个噪声实体的词典,在文本对象上逐个 token(或逐词)迭代,消除在噪声词典中出现的标签。
以下是实现这一步的 Python 代码:
```#Samplecodetoremovenoisywordsfromatext
noise_list=["is","a","this","..."]
def_remove_noise(input_text):
words=input_text.split()
noise_free_words=[wordforwordinwordsifwordnotinnoise_list]
noise_free_text="".join(noise_free_words)
returnnoise_free_text
_remove_noise("thisisasampletext")
>>>"sampletext"
```
另外一种方法是使用正则表达式,尽管其只能解决特定模式的噪声。我们在之前的文章中详细介绍了正则表达式:https://www.analyticsvidhya.com/blog/2015/06/regular-expression-python/
以下是从输入文本中移除正则表达式的 Python 代码:
```#Samplecodetoremovearegexpattern
importre
def_remove_regex(input_text,regex_pattern):
urls=re.finditer(regex_pattern,input_text)
foriinurls:
input_text=re.sub(i.group().strip(),'',input_text)
returninput_text
regex_pattern="#[A-Za-z0-9\w]*"
_remove_regex("removethis#hashtagfromanalyticsvidhya",regex_pattern)
>>>"removethisfromanalyticsvidhya"
```
2.2词汇规范化
另外一种文本形式的噪声是由一个词汇所产生的多种表示形式。
例如,“play”,“player”,“played”,“plays”和“playing”,这些词汇都是由“play”变化而来的。虽然它们意义不一,但根据上下文都是相似的。词汇规范化这一步把一个词的不同展现形式转化为了他们规范化的形式(也叫做引理(lemma))。规范化是文本上的特征工程起中枢作用的一步,因为它把高维特征(N个不同的特征)转化为了对任何机器学习模型都很理想的低维空间(1个特征)。
最常见的词汇规范化是:
词干提取:词干提取是词汇后缀(“ing”,“ly”,“es”,“s”等)去除过程的一个基本规则。
词形还原:词形还原与词干提取相反,是有组织地逐步获取词汇根形式的步骤,它使用到了词汇(词汇字典序)和形态分析(词的结构和语法关系)。
下面是实现词形还原和词干提取的代码,使用了一个流行的 Python 库 NLTK:
```fromnltk.stem.wordnetimportWordNetLemmatizer
lem=WordNetLemmatizer()
fromnltk.stem.porterimportPorterStemmer
stem=PorterStemmer()
word="multiplying"
lem.lemmatize(word,"v")
>>"multiply"
stem.stem(word)
>>"multipli"
```
2.3对象标准化
文本数据经常包含不在任何标准词典里出现的词汇或短语。搜索引擎和模型都识别不了这些。
比如,首字母缩略词、词汇附加标签和通俗俚语。通过正则表达式和人工准备的数据词典,这种类型的噪声可以被修复。以下代码使用了词典查找方法来替代文本中的社交俚语。
```lookup_dict={'rt':'Retweet','dm':'directmessage',"awsm":"awesome","luv":"love","..."}
def_lookup_words(input_text):
words=input_text.split()
new_words=[]
forwordinwords:
ifword.lower()inlookup_dict:
word=lookup_dict[word.lower()]
new_words.append(word)new_text="".join(new_words)
returnnew_text
_lookup_words("RTthisisaretweetedtweetbyShivamBansal")
>>"RetweetthisisaretweetedtweetbyShivamBansal"
```
除了目前为止讨论过的三个步骤,其他类型的文本预处理有编码-解码噪声,语法检查器和拼写改正等。我之前的一篇文章给出了预处理及其方法的细节。
3.文本到特征(文本数据上的特征工程)为了分析已经预处理过的数据,需要将数据转化成特征(feature)。取决于用途,文本特征可通过句法分析、实体/N元模型/基于词汇的特征、统计特征和词汇嵌入等方法来构建。下面来详细理解这些技巧。
3.1句法分析句法分析涉及到对句中词的语法分析和位置与词汇的关系的分析。依存语法(Dependency Grammar)和词性标注(Part of Speech tags)是重要的文本句法属性。
依赖树(Dependency Trees)――由一些词汇共同组成的句子。句中词与词之间的联系是由基本的依存语法决定的。从属关系语法是一类解决(已标签)两个词汇项(字词)间二元不对称关系的句法文本分析。每一种关系都可用三元组(关系、支配成分、从属成分)来表示。例如:考虑下面这个句子:“Bills on ports and immigration were submitted by Senator Brownback, Republican of Kansas.”词汇间的关系可由如下所示的树的形式观察得到

观察树的形状可得:“submitted”是该句的根词(root word),由两颗子树所连接(主语和宾语子树)。每一颗子树本身又是一颗依存关系树(dependency tree ),其中的关系比如有 - (“Bills” <-> “ports” <by> “proposition” 关系),(“ports” <-> “immigration” <by> “conjugation” 关系)
这种类型的树,当从上至下迭代分析时可以得到语法关系三元组。对于很多自然语言处理问题,比如实体性情感分析,执行者(actor)与实体识别和文本分类等,语法关系三元组都可以用作特征。Python wrapper 的StanfordCoreNLP( http://stanfordnlp.github.io/CoreNLP/ 来自斯坦福自然语言处理组,只允许商业许可证)和NTLK从属关系语法可以用来生成依赖树。
词性标注(PoS/Part of speech tagging)――除了语法关系外,句中每个词都与词性(名词、动词、形容词、副词等等)联系起来。词性标注标签决定了句中该词的用法和作用。这里有宾夕法尼亚大学定义的所有可能的词性标签表。以下代码使用了NTLK包对输入文本执行词性标签注释。(NTLK提供了不同的实现方式,默认是感知器标签)
```fromnltkimportword_tokenize,pos_tag
text="IamlearningNaturalLanguageProcessingonAnalyticsVidhya"
tokens=word_tokenize(text)
printpos_tag(tokens)
>>>[('I','PRP'),('am','VBP'),('learning','VBG'),('Natural','NNP'),('Language','NNP'),
('Processing','NNP'),('on','IN'),('Analytics','NNP'),
词性标注被用在许多重要的自然语言处理目的上:
A. 词义消歧:一些词汇根据用法有很多种意思。例如,下面的两个句子:
I.“Please book my flight for Delhi”
II. “I am going to read this book in the flight”
“Book”在不同的上下文中出现,然而这两种情况的词性标签却不一样。在第一句中,“book”被用作动词,而在第二句中,它被用作名词。(L