多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] **12****k字****:**理解和使用自然语言处理之终极指南(Python编码)7k字;附数据简化DataSimp筹收技术简历414字。欢迎加入共建“数据简化DataSimp”学会及社区,关注、收藏、转发新媒体“**数据简化DataSimp**、科学Sciences”微信号、头条号,转载请写出处:**秦陇纪10“数据简化DataSimp/科学Sciences”公众号、头条号****译编**,投稿QinDragon2010@qq.com。 **目录** **理解和使用自然语言处理之终极指南(Python编码)(****7.4****k字)** **附****A. ****数据简化DataSimp****筹备收简历(****414****字)**   **理解和使用自然语言处理之终极指南(Python编码)** 秦陇纪10译编;来源:仕瓦姆·邦萨尔(Shivam Bansal),2017年1月12日,威提亚分析学 ![](http://mmbiz.qpic.cn/mmbiz_png/UEhXjOtUwhRKuu4r8J5asJ698ugPgwyV2YmZ3cDgXhic1pIcOgt4q6Y9rz2Tl0JBLOX7ny8H1En3hHYd9Q9rib0Q/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1) ## **目录表Table of Contents** 1. **Introduction to NLP**** 自然语言处理介绍** 2. **Text Preprocessing ****文本预处理** o Noise Removal 噪声去除 o Lexicon Normalization 词汇规范化 § Lemmatization 词变体归类 § Stemming 词干提取 o Object Standardization 对象规范化 3. **Text to Features (Feature Engineering on text data) ****文本到特征(文本数据之特征工程)** o Syntactical Parsing 句法解析 § Dependency Grammar 依存语法 § Part of Speech Tagging 词性标注 o Entity Parsing 实体解析 § Phrase Detection 短语检测 § Named Entity Recognition 命名实体识别 § Topic Modelling 主题造型 § N-Grams  N元连续模型 o Statistical features 统计特征 § TF – IDF 词频-逆文档词频 § Frequency / Density Features 频率/密度特征 § Readability Features 可读性特征 o Word Embeddings 字嵌入 4. **Important tasks of NLP ****自然语言处理NLP的重要任务** o Text Classification 文本分类 o Text Matching 文本匹配 § Levenshtein Distance 莱文斯坦距离 § Phonetic Matching 语音匹配 § Flexible String Matching 柔性字符串匹配 o Coreference Resolution 共指消解 o Other Problems 其他问题 5. **Important NLP libraries**** 重要NLP库** ** ** ** ** 据业内人士估计,只有**21%可用数据以结构化形式**存在。数据产生,正如我们所说的,来自于我们的推特、WhatsApp和其他各种交流活动中发送的信息。大多数这些数据存在于文本的形式,是高度非结构化的性质。一些臭名昭著的例子包括——在社交媒体上的推特/帖子、用户到用户的聊天对话、新闻、博客和文章、产品或服务审查和医疗部门里的病人记录。最近的一些例子包括聊天机器人和其他声音驱动的机器人程序。 尽管具有高维数据,但其呈现的信息是不可以直接访问的,除非它被手动处理(读取和理解)或由自动化系统分析。为了从文本数据中产生明显的和可操作的洞察/见解,熟悉**自然语言处理(NLP)的技术和原则**显得非常重要。那么,如果你打算今年创建聊天机器人,或者你想使用非结构化文本的力量,本指南是正确的起点。本指南挖掘自然语言处理的概念、技术与实现。文章的目的是教会自然语言处理的概念,并将其应用于实际数据集。   ## **1\. Introduction to Natural Language Processing 自然语言处理介绍** **NLP是数据科学**的一个分支,包括智能和高效地从文本数据中分析、理解和导出信息的系统流程。通过NLP及其组成部分,企业可以组织海量文本数据块、执行许多自动化任务、并解决广泛问题,如自动摘要、机器翻译、命名实体识别、关系抽取、情感分析、语音识别、主题分割等。 在进一步研究之前,我想解释一下文章中使用的一些术语: · **标记化——**转换文本到标记体的过程; · **标记体**——文本中存在的单词或实体; · **文本对象**——一个句子或一个短语或一个词或一篇文章 安装NLTK及其数据的步骤(使用Python语言及环境): 安装Pip:在终端中运行:     sudo easy_install pip 安装NLTK:在终端中运行:     sudo pip install -U nltk 下载NLTK数据:运行Python shell(在终端)和写下面的代码: ``` import nltk nltk.download()```  按照屏幕上的指令下载所需的包或集合。其他库可以直接使用Pip安装。   ## **2\. Text Preprocessing文本预处理** 因此,文本是所有可用数据的最具非结构化的形式,存在于其中的各种类型的噪声,并且没有预处理的数据是不容易分析的。文本清理和标准化的全过程,是一个去除其噪声和称为文本预处理的分析准备工作。 它主要由三个步骤组成: · Noise Removal 噪声去除 · Lexicon Normalization 词汇规范化 · Object Standardization 对象标准化 下图显示了文本预处理(清洁)流水线的体系结构。 ![](http://mmbiz.qpic.cn/mmbiz_png/UEhXjOtUwhRKuu4r8J5asJ698ugPgwyVbXLd2qKMdkm6jH5F94d4lOd4lh9vbcgJ2NEJpicM0O2O8KicCibIiay40Q/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1) ### **2.1 Noise Removal 噪声去除** 任何与数据上下文和最终输出无关的文本片段,都可以指定为噪声。例如——语言停用词(语言常用词is/am/the/of/in等),URL或链接,社会媒体实体(提示、哈希标签),标点符号和特定行业用词。此步骤处理移除文本中存在的所有类型噪声实体。 去除噪声的一般方法是准备一个**噪声实体字典**,并通过标记符号(或文字)来迭代文本对象,消除这些噪声字典呈现出的标记符号。 以下是实现相同目的Python代码。 ``` # Sample code to remove noisy words from a text noise_list = ["is", "a", "this", "..."] def _remove_noise(input_text): words = input_text.split() noise_free_words = [word for word in words if word not in noise_list] noise_free_text = " ".join(noise_free_words) return noise_free_text _remove_noise("this is a sample text") >>> "sample text" ``` 另一种方法是在处理特殊噪声模式时使用**正则表达式**。之前的一篇文章中,我们详细解释了正则表达式。以下的Python代码从输入文本中移除了一个正则表达式模式: ``` # Sample code to remove a regex pattern import re def _remove_regex(input_text, regex_pattern): urls = re.finditer(regex_pattern, input_text) for i in urls: input_text = re.sub(i.group().strip(), '', input_text) return input_text regex_pattern = "#[A-Za-z0-9\w]*" _remove_regex("remove this #hashtag from analytics vidhya", regex_pattern) >>> "remove this  from analytics vidhya" ```   ### **2.2 Lexicon Normalization**** 词汇规范化** 另一种文本式噪声是关于单个词所表现的**多重表征**。 例如:“玩”、“玩家”,“玩过”,第三人称的“玩”和“正在玩”(play, player, played, plays and playing)这些词是单词“玩”的不同变化,尽管他们的意思是不同的,但内容都是相似的。这个步骤是把一个词的所有差异转换成它们的标准化形式(也称为lemma引理)。规范化是文本特征工程的关键步骤,因为它转换的高维特征(N维度不同特征)到低维空间(1个特征),是任何ML模型的一种理想解。 最常见的词汇规范化做法是: · 词干提取(Stemming):词干提取是一种基本的基于规则的从一个词剥离后缀的过程(后缀ing, ly, es, s等)。 · 词变体归类(Lemmatization):词变体归类,从另一方面,是一个有组织且有步骤获得这个词的词根形式的过程,即词汇用法(单词的词典重要性)和形态逻辑分析(词汇结构和语法关系)。 下面的示例代码是用Python主流库NLTK执行的词变体归类(Lemmatization)和词干提取(Stemming)。 ``` from nltk.stem.wordnet import WordNetLemmatizer lem = WordNetLemmatizer() from nltk.stem.porter import PorterStemmer stem = PorterStemmer() word = "multiplying" lem.lemmatize(word, "v") >> "multiply" stem.stem(word) >> "multipli" ```   ### **2.3 Object Standardization**** 对象标准化** 文本数据通常包含一些任何标准语义字典中不存在的单词或短语。这些**碎片**是搜索引擎和模型不能识别的。 这方面的一些例子是——首字母缩略词语、单词附属哈希标签和口语俚语。借助正则表达式和手工编写的数据字典,可以找到这种类型的噪声,下面的代码使用一个字典查找法从文本中代替社交媒体的俚语。 ``` lookup_dict = {'rt':'Retweet', 'dm':'direct message', "awsm" : "awesome", "luv" :"love", "..."} def _lookup_words(input_text): words = input_text.split() new_words = [] for word in words: if word.lower() in lookup_dict: word = lookup_dict[word.lower()] new_words.append(word) new_text = " ".join(new_words) return new_text _lookup_words("RT this is a retweeted tweet by Shivam Bansal") >> "Retweet this is a retweeted tweet by Shivam Bansal" ``` 除了讨论到目前为止的三个步骤,其他类型的**文本预处理**包括编码解码噪声、语法检查器、拼写校正等。详细的文本预处理及其方法在秦陇纪专著文章有。   ## **3.Text to Features (Feature Engineering on text data)**** 文本到特征(文本数据之特征工程)** 对**预处理数据**做分析,需要将其转换成**特征**。根据使用情况,文本特征可用配套技术来构建——语义分析、实体/克/基于词的特征、统计特征、字的嵌入。实体/N元连续模型/基于词的特征、统计特征,和单词嵌入。下面来继续阅读,以详细了解这些技术。 ### **3.1 Syntactic Parsing**** 句法解析** **句法解析**涉及句中单词的**语法**和显示这些单词间关系的**排列方式**的分析。依存语法和部分语音标签是文本句法的重要属性。 **依存树**–句子是由一些单词缝和在一起组成的。句子中词语间的关系由基本依存语法决定。**依存语法**是处理两个语义项之间的(标记的)非对称二元关系(单词)的一类语义文本分析法。每一种关系都可以用三元组(关系、监督、依存)来表示。例如:考虑句子“Bills on ports and immigration were submitted by Senator Brownback, Republican of Kansas.”这些单词间的关系,可以用下图所示的**树形表示**形式观察到: ![](http://mmbiz.qpic.cn/mmbiz_png/UEhXjOtUwhRKuu4r8J5asJ698ugPgwyVMxjAm4IDKautVvYQhSfYd2M1tqfKIWvkxy87EJjZT4zn5LAR3wTeGA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1) 这个树显示“submitted”是这个句子的根词,是由两个子树(主体与客体的子树)相连。每个**子树**本身一个诸如(“Bills” “ports” “proposition” relation)、(“ports” “immigration” “conjugation” relation)关系的**依存关系树**。 这种类型的树,采用自上而下的方法递归解析时,给出了的语法关系三元组作为输出——可用于许多NLP问题的特征,像实体情感分析、演员和实体识别和文本分类。Python包组**斯坦福****CoreNLP**(来自Stanford NLP项目组,只有商业许可证版)和**NLTK****依存****语法**可以用来产生**依存关系树**. **词性标注****(**Part of Speech tagging**)**–除了语法关系,在一个句子里每个词也和**词性标签(POS)**(名词、动词、形容词、副词等)相关联。**POS标签**定义一个词在句子中的用法和功能。这是宾夕法尼亚大学定义的一个所有可能POS标签列表。下面的代码使用NLTK对输入文本进行词性标注注释。(它提供了多种实现方案,默认是感知标记器) ``` from nltk import word_tokenize, pos_tag text = "I am learning Natural Language Processing on Analytics Vidhya" tokens = word_tokenize(text) print pos_tag(tokens) >>> [('I', 'PRP'), ('am', 'VBP'), ('learning', 'VBG'), ('Natural', 'NNP'),('Language', 'NNP'), ('Processing', 'NNP'), ('on', 'IN'), ('Analytics', 'NNP'),('Vidhya', 'NNP')] ``` 词性标注用于NLP自然语言处理中的许多重要用途: **A.****词义消歧:**一些语言词汇根据其用法有多种含义。例如,在以下两个句子中: *I. “Please book my flight for Delhi”* *II. “I am going to read this book in the flight”* “Book”在不同语境使用,这两种情况下的词性标注词不同。句I中,“Book”作为动词,而II句中它被用作名词。(Lesk算法也用于类似目的) **B.提高基于词的****特征值****:**学习模型在以一个词为特征时,学习词的不同情境,如果词性标注词与他们有联系,则上下文被保存,从而做出强壮的特征值。例如: *句子**Sentence** -“book my flight, I will read this book”* *标记词**Tokens** – (“book”, 2), (“my”, 1), (“flight”, 1), (“I”, 1), (“will”, 1), (“read”, 1), (“this”, 1)* *词性标注**标记**词**Tokens with POS **– (“book_VB”, 1), (“my_PRP$”, 1), (“flight_NN”, 1), (“I_PRP”, 1), (“will_MD”, 1), (“read_VB”, 1), (“this_DT”, 1), (“book_NN”, 1)* **C.****标准****化和词变体归类:**POS标签是词变体归类过程的基础,用于将一个词转换成它的基形式(lemma引理)。 **D.有效的停用词去除:**POS标签在高效去除停用词也有用。 例如,有一些标签总是定义一个语言的低频/不重要的单词。例如: (**IN** – “within”, “upon”,“except”), (**CD** – “one”,”two”, “hundred”), (**MD** – “may”, “mu st” etc)。   ### **3.2 Entity Extraction (Entities as features)**** 实体提取(实体为特征值)** **实体**被定义为句子中最重要的句块--名词短语、动词短语或两者。**实体检测算法**通常是基于规则解析、字典查找、POS标签、依存句法分析的集成模型。**实体检测的适用性**可以在自动聊天机器人、内容分析器和消费者洞察中看见。 ![](http://mmbiz.qpic.cn/mmbiz_png/UEhXjOtUwhRKuu4r8J5asJ698ugPgwyVY0G1Vg496TUsFiaic4jMhW79B9FY59kESib4QQREoiaxVoyOTFvKJCNR0w/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1) **主题****模型**和**命名实体识别**是NLP自然语言处理里两个主要的实体检测方法。 #### **A. Named Entity Recognition ****命名实体识别(NER)** 检测如人名、地名、公司名等命名实体的过程称为NER。例如: *句子**Sentence** – Sergey Brin, the manager of Google Inc. is walking in the streets of New York.* *命名实体**Named Entities** – ( “person” : “Sergey Brin” ), (“org” : “Google Inc.”), (“location” : “New York”)* 一个典型NER模型由三块组成: **名词短语识别:**这一步涉及使用依存解析和词性标注从文本中提取所有名词短语。 **短语分类:**这是将所有被提取名词短语划分为所属相应类别(位置、名称等)的分类步骤。谷歌地图API提供了消除歧义位置的一个好路径,然后,从DBpedia, wikipedia开放数据库可以用来识别个人姓名或公司名称。除此之外,结合来自不同信息源的查找表和词典可以精确查找。 **实体消歧:**有时这是可能的,实体的误判分类的,因此随之创建分类结果之上的验证层是有用的。出于此目的可以运用知识图。流行的知识图有–谷歌知识图,IBM沃森和维基百科。   #### **B. Topic Modeling**** ****主题****模型** **主题建模**是一个存在于文本语料库中主题的自动识别过程,它以无监督方式推导出语料库中的隐含模式。主题被定义为“a repeating pattern of co-occurring terms in a corpus”。医疗保健为主题的一个好的主题模型结果有–“health”, “doctor”, “patient”, “hospital”(“健康”、“医生”、“病人”、“医院”),农事为主体则有–“farm”, “crops”, “wheat”(“农场”、“庄稼”、“小麦”为话题“农业”)。 **隐含狄利克雷分配(LDA)**是最受欢迎的主题建模技术,以下是使用LDA实现主题建模的Python代码。有关其工作和执行的详细说明,请检查这里的完整文章。 ``` doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father." doc2 = "My father spends a lot of time driving my sister around to dance practice." doc3 = "Doctors suggest that driving may cause increased stress and blood pressure." doc_complete = [doc1, doc2, doc3] doc_clean = [doc.split() for doc in doc_complete] import gensim from gensim import corpora # Creating the term dictionary of our corpus, where every unique term is assigned an index.  dictionary = corpora.Dictionary(doc_clean) # Converting list of documents (corpus) into Document Term Matrix using dictionary prepared above. doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean] # Creating the object for LDA model using gensim library Lda = gensim.models.ldamodel.LdaModel # Running and Training LDA model on the document term matrix ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50) # Results print(ldamodel.print_topics()) ```   #### **C.  N-Grams as Features**** **** ****N元连续模型N grams作为特征值** N个单词在一起的组合被称为N元连续模型(N grams)。作为特征值,相比单词(一元1gram),N元连续模型(n>1)通常包含更多信息。另外,双单词元组(n=2)被认为是所有其他元模型更重要的特征。下面的代码生成一个文本二元模型实例。 ``` def generate_ngrams(text, n): words = text.split() output = []  for i in range(len(words)-n+1): output.append(words[i:i+n]) return output >>> generate_ngrams('this is a sample text', 2) # [['this', 'is'], ['is', 'a'], ['a', 'sample'], , ['sample', 'text']] ```   ### **3.3 Statistical Features**** 统计特征** 文本数据也可以使用本节中描述的几种技术直接量化成数字: #### **A.  Term Frequency – Inverse Document Frequency  ****词频****–****逆文档频率****(TF****-****IDF)** **TF-IDF**是一种常用的信息检索问题**加权模型**。它的目的是不考虑精确排序,在文档中出现词汇的基础上,将文本文件转化为向量模型。例如 – 如果说有一个N个文本文档的数据集,在任何文档“D”,TF和IDF将被定义为 –  **Term Frequency (****词频****TF)** – TF中“T”的定义是在文档“D”中词项“T”的计数 **Inverse Document Frequency (****逆文档频率****IDF**) – IDF定义为在语料库中可用总文档数的对数和包含词项T的文档数。 **TF **–** IDF (**词频–**逆文档频率**)**– **TF-IDF公式给出的语料库(文档列表)中词项的一个相对重要性,通过如下公式给出。以下是使用Python语言scikit学习包的代码,将一个文本转换为TF-IDF向量: ![](http://mmbiz.qpic.cn/mmbiz_png/UEhXjOtUwhRKuu4r8J5asJ698ugPgwyVODBmj71zf0lVyFVKJsYaRHPz33sBqjAhWJZSR4uV52jCC6tsqTvong/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1) ``` from sklearn.feature_extraction.text import TfidfVectorizer obj = TfidfVectorizer() corpus = ['This is sample document.', 'another random document.', 'third sample document text'] X = obj.fit_transform(corpus) print X >>> (0, 1) 0.345205016865 (0, 4) ... 0.444514311537 (2, 1) 0.345205016865 (2, 4) 0.444514311537 ``` 该模型创建一个词汇字典,并给每个单词分配一个索引。输出的每一行包含一个元组(i,j)和一组文档i中索引词j的TF-IDF值   #### **B. Count / Density / Readability Features**** 计数/密度/可读性特征** 基于特征值的计数或密度也可以用于模型和分析。这些功能似乎微不足道,但在学习模型显示了很大影响。一些特征值有:单词数、句子计数、标点符号数和特定行业用词数。其他测量类型包括如音节数、烟雾指数和易读性指数等可读性措施。参考Textstat库创建这些功能。   ### **3.4 Word Embedding (text vectors)**** 字嵌入(文本向量)** **字嵌入**是表示词为向量的现代方式。**字嵌入的目的**是通过保留语料库中的上下文相似度,来重新对高维字特征定义到低维特征向量。它们被广泛应用于深度学习DL模型,如卷积神经网络CNN和递归神经网络RNN。 Word2vec和GloVe是创建文本其字嵌入的两个流行模型。这些模型把文本语料库作为输入,并产生**字向量**作为输出。 Word2vec模型是由预处理模块、称为Continuous Bag of Words的浅层神经网络模型和另一个称为skip-gram的浅层神经网络模型组成。这些模型被广泛用于其他NLP问题。它首先构建一个词汇训练语料库,然后学习字嵌入表征值。下面的代码使用Gensim包来准备把字嵌入作为向量。 ``` from gensim.models import Word2Vec sentences = [['data', 'science'], ['vidhya', 'science', 'data', 'analytics'],['machine', 'learning'], ['deep', 'learning']] # train the model on your corpus  model = Word2Vec(sentences, min_count = 1) print model.similarity('data', 'science') >>> 0.11222489293 print model['learning']  >>> array([ 0.00459356  0.00303564 -0.00467622  0.00209638, ...]) ``` 它们可以用来作为ML模型的特征向量,使用余弦相似性技术、词聚类和文本分类技术来测量**文本相似性**。   ## **4\. Important tasks of NLP**** NLP重要任务** 本节讨论**自然语言处理**领域中不同的**用例和问题**。 ### **4.1 Text Classification**** 文本分类** **文本分类**是NLP经典问题。臭名昭著的例子包括 – 电子邮件垃圾邮件识别、新闻主题分类、情绪分类和搜索引擎驱动的网页组织。 **文本分类**通常说是指在一个固定类别中对文本对象(文档或句子)进行系统分类的一种技术。当数据量太大,尤其是组织化、信息过滤和存储目的下,它真的很有帮助。 典型的自然语言分类器由两部分组成:(a)**训练**(b)如下图所示的**预测**。首先,文本输入过程和功能创建。然后是机器学习模型,再就是学习这些特征值和用于对新文本做预测。 ![](http://mmbiz.qpic.cn/mmbiz_png/UEhXjOtUwhRKuu4r8J5asJ698ugPgwyVB5sWph2jb0V2E0WV0sNFITZT2PY9oic0orv2ba04xfOsVyvW9f0Vaqg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1) 这里是一段使用文本块库(建立在NLTK环境之上)的朴素贝叶斯分类器的代码。 ``` from textblob.classifiers import NaiveBayesClassifier as NBC from textblob import TextBlob training_corpus = [ ('I am exhausted of this work.', 'Class_B'), ("I can't cooperate with this", 'Class_B'), ('He is my badest enemy!', 'Class_B'), ('My management is poor.', 'Class_B'), ('I love this burger.', 'Class_A'), ('This is an brilliant place!', 'Class_A'), ('I feel very good about these dates.', 'Class_A'), ('This is my best work.', 'Class_A'), ("What an awesome view", 'Class_A'), ('I do not like this dish', 'Class_B')] test_corpus = [ ("I am not feeling well today.", 'Class_B'), ("I feel brilliant!", 'Class_A'), ('Gary is a friend of mine.', 'Class_A'), ("I can't believe I'm doing this.", 'Class_B'), ('The date was good.', 'Class_A'), ('I do not enjoy my job', 'Class_B')] model = NBC(training_corpus) print(model.classify("Their codes are amazing.")) >>> "Class_A" print(model.classify("I don't like their computer.")) >>> "Class_B" print(model.accuracy(test_corpus)) >>> 0.83 ``` Scikit.Learn也提供了一个**文本分类****器的****管道框架**: ``` from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics import classification_report from sklearn import svm # preparing data for SVM model (using the same training_corpus, test_corpus from naive bayes example) train_data = [] train_labels = [] for row in training_corpus: train_data.append(row[0]) train_labels.append(row[1]) test_data = [] test_labels = [] for row in test_corpus: test_data.append(row[0]) test_labels.append(row[1]) # Create feature vectors vectorizer = TfidfVectorizer(min_df=4, max_df=0.9) # Train the feature vectors train_vectors = vectorizer.fit_transform(train_data) # Apply model on test data test_vectors = vectorizer.transform(test_data) # Perform classification with SVM, kernel=linear model = svm.SVC(kernel='linear') model.fit(train_vectors, train_labels) prediction = model.predict(test_vectors) >>> ['Class_A' 'Class_A' 'Class_B' 'Class_B' 'Class_A' 'Class_A'] print (classification_report(test_labels, prediction)) ``` 文本分类模型在严重依赖于特征的质量和数量,而应用任何机器学习模型,包含越来越多的训练数据总是一个很好的做法。一些提示,秦陇纪将在其他篇文章写关于如何提高文本分类的准确性。   ### **4.2 Text Matching / Similarity**** 文本匹配/相似度** NLP的一个重要领域是让文本对象找相似度的匹配处理。文本匹配的重要应用包括自动拼写校正、数据去复制(data de-duplication)和基因组分析等。若干文本匹配技术可按需提供。本节详细介绍了此类重要技术。 **A. Levenshtein Distance**** ****莱文斯坦****距离**– 两个字符串之间的Levenshtein距离被定义为将一个字符串转换为另一个字符串所需的最小编辑次数,允许的编辑操作有插入、删除或替换单个字符。以下是高效内存计算的实现。 ``` def levenshtein(s1,s2): if len(s1) > len(s2): s1,s2 = s2,s1 distances = range(len(s1) + 1) for index2,char2 in enumerate(s2): newDistances = [index2+1] for index1,char1 in enumerate(s1): if char1 == char2: newDistances.append(distances[index1]) else: newDistances.append(1 + min((distances[index1], distances[index1+1], newDistances[-1]))) distances = newDistances return distances[-1] print(levenshtein("analyze","analyse")) ``` **B. Phonetic Matching** **语音匹配**– 一个语音匹配算法使用关键字(人名、位置名等)作为输入,并产生一个字符串来识别一组(大致)发音类似的词。它在搜索大文本语料库方面是非常有用的,纠正拼写错误和匹配相关名字。探测法(Soundex)和语音(Metaphone)是用于此目的的两种主要语音算法。Python的Fuzzy模块是用来计算不同词的模糊字符串(soundex strings),例如– ``` import fuzzy soundex = fuzzy.Soundex(4) print soundex('ankit') >>> “A523” print soundex('aunkit') >>> “A523” ``` **C. Flexible String Matching**** ****灵活的字符串匹配**** **– 一个完整的文本匹配系统包括不同算法,共同流水线地计算各种文本的变化。正则表达式真的有助于完成这个目的。另一些常见技术包括 – 字符串精确匹配、词变体归类(lemmatized)匹配和紧凑匹配(注意空格、标点符号、俚语等)。 **D. Cosine Similarity** 余弦相似度 – 当文本被表示为**矢量符号**时,广义余弦相似度也可以被应用为测量向量相似度。下列代码将文本转换为向量(使用词频)并应用余弦相似度提供两个文本间的贴近度。 ``` import math from collections import Counter def get_cosine(vec1, vec2): common = set(vec1.keys()) & set(vec2.keys()) numerator = sum([vec1[x] * vec2[x] for x in common]) sum1 = sum([vec1[x]**2 for x in vec1.keys()]) sum2 = sum([vec2[x]**2 for x in vec2.keys()]) denominator = math.sqrt(sum1) * math.sqrt(sum2) if not denominator: return 0.0 else: return float(numerator) / denominator def text_to_vector(text): words = text.split() return Counter(words) text1 = 'This is an article on analytics vidhya' text2 = 'article on analytics vidhya is about natural language processing' vector1 = text_to_vector(text1) vector2 = text_to_vector(text2) cosine = get_cosine(vector1, vector2) >>> 0.62 ``` ### **4.3 Coreference Resolution**** 指代消解** **共指消解**是一个在众多句子里发现有关系链接的单词(或短语)的过程。考虑一个例句:“Donald went to John’s office to see the new table. He looked at it for an hour.”(“唐纳德去约翰的办公室看新桌子。他看了一个小时。”) 人类可以很快发现“he他”指的是Donald唐纳德(而不是John约翰),“it它”指的是桌子(而不是John’s office约翰的办公室)。共指消解是自动完成这项工作的NLP组成部分。它用于文献综述、问答和信息抽取。斯坦福CoreNLP提供了一种用于商业用途的Python包。   ### **4.4 Other NLP problems / tasks**** 其他NLP问题/任务** · **Text Summarization**** ****自动摘要** – 给出一篇文章或段落,自动总结产生有顺序的最重要的和相关的句子。 · **Machine Translation**** ****机器翻译** – 通过对现实世界的语法、语义和信息等的处理,自动将文本从一种人类语言翻译到另一种语言。 · **Natural Language Generation and Understanding**** ****自然语言生成与理解** – 将信息从计算机数据库或语义意图转换为人类可读的语言,称为**语言生成**。将文本块转换成更易于计算机程序操纵的逻辑结构,被称为**语言理解**。 · **Optical Character Recognition**** ****光学字符识别** – 给定打印文本呈现出的图像,确定其对应的文本。 · **Document to Information**** ****文档转****信息**– 这涉及到呈现在文件(网站、文件、PDF文件和图像)中的文本数据的解析,来分析和清洁格式。   ## **5\. Important Libraries for NLP (python) 自然语言处理NLP重要Python库** · **Scikit-learn**: Python中的机器学习; · **Natural Language Toolkit (NLTK)**: 所有的自然语言处理技术的完整工具包; · **Pattern** – 为自然语言处理技术和机器学习提供的一款Web挖掘模块的工具; · **TextBlob** – 顶部构建的易于使用的nlp工具API; · **spaCy** – Python和Cython工业级NLP; · **Gensim** – 人类主题建模; · **Stanford Core NLP **– 斯坦福NLP项目组的NLP服务和包。 ** ** **End Notes****结尾笔记** 我希望本教程将帮助您在Python自然语言处理中最大限度地提高效率。我相信这不仅给你基本技术思路,而且也告诉你如何实现一些今天可用的、更复杂的技术。如果你在Python实践中遇到任何困难,或者你有什么想法/建议/反馈,请毫无拘束地在下面张贴评论。 本文由blogathon 2获胜者——仕瓦姆·邦萨尔(Shivam Bansal)贡献。我们将很快发布blogathon 2竞赛的其他两篇置顶博客。所以,敬请期待!*So, Stay Tuned!** *Learn, compete, hack and get hired!学习、竞争、黑客和得到雇用! 注:阅读原文,可跳转到**威提亚分析学**Machine Learning栏目的英文文章Ultimate Guide to Understand & Implement Natural Language Processing (with codes in Python)。 (欢迎转发声明:秦陇纪10公众号、头条号“数据简化DataSimp”科普文章。)     **附****A. ****数据简化DataSimp****筹备收简历(****414****字)** 北京数据简化有限责任公司(筹)愿景:①行业大数据采集处理分析管理系统,②企事业单位行政人事财物联网智能OA系统,③数据简化DataSimp学术组及开源社区(中英双语),④物联网大数据底层操作系统(整合Linux开源软件和通信模块)。 现重点收集数据分析程序算法模型研发简历,成立前/每季度实习生在中关村集中面试。有意实习半年、工作一年以上的开发人员,请注明学历和工作简历、职务和职业规划、吃住薪酬预期、个人爱好等事项,投递邮箱QinDragon2010@qq.com主题注明:应聘数据简化DataSimp合伙人或XX岗位(研发岗参考本蚊及文本分析一文的二级标题)。 1)技术研发部(重点收简历):核心的数据分析DA、NLP、DL编程技能,Windows/Linux/Android/iOS平台、OA、App软件开发基础; 2)市场客服部(研发部兼职):搜集客户资料、面见客户、形成客户需求分析文档,跟踪反馈,面谈、电邮、电话、邮寄沟通服务; 3)行政后勤部(合伙人兼职):高级的全系列文档搜集编辑整理技能,OA软件界面和操作体验实验,公司法律财会物业文书基础。 详情落地前发文宣传。 QinDragon2010@DataSimplification and Sciences, Wechat and Toutiao Public Account, 2017.02.16Thu: **LIFE** Life begins at the end of your comfort zone. -- Neale Donald Walsch **THE DAY** The strength of purpose and the clarity of your vision, along with the tenacity to pursue it, is your underlying driver of success. -- Ragy Tomas   **附****B. ****2017年2月1****7****日周****五****(农历丁酉鸡年正月****廿一****)新闻四则****汇编****** **附i. 早报,2月17日,星期五:** 1、清华取消国际学生笔试引争议,学者:中国大学需提高实力; 2、圆通回应倒闭说:快件揽派正常 不存在快件延误等问题; 3、城管统一服装亮相:藏青色、天空蓝色制服,搭配金色标志; 4、诺基亚拟再产17年前畅销机3310,网友:旧版还没用坏; 5、国家林业局:今后“吃野味”将被法律追责; 6、香港连续23年获评全球最自由经济体; 7、马云办了家15年学制的私立学校 称要为中国教育改革做尝试; 8、全球最佳留学城市 蒙特利尔名列榜首 巴黎、伦敦分别位列第二、第三; 9、大英博物馆100件文物陆续抵京 将在国博展出; 10、丽江古城制定准入清单:拟禁止歌舞厅、桑拿按摩; 11、乐百氏桶装水抽检不合格 致癌物质比规定超标40%; 12、媒体:国内20亿级别富豪2000多位 半数无"高学历"; 【微语】1.不要等到需要,才积累人脉。2.不要等到有时间,才去读书。3.不要等到身无分文,才想起储蓄。 **秦陇纪10数据简化DataSimp,祝**QQ空间微信公众号、新浪博客微博、今日头条头条号、人人知乎贴吧“数据简化DataSimp、科学Sciences”**读者****2017酉鸡年**新的一年,一帆風順、二龍騰飛、三羊開泰、四季平安、五福臨門、六六大順、七星高照、八方來財、九九同心、十全十美、百事亨通、千事吉祥、萬事如意、**安康吉祥**。新年新气象,每天心情美美哒,身体棒棒哒! (西安秦陇纪10数据简化DataSimp综合汇编,欢迎有志于数据简化之传媒、技术的实力伙伴加入全球“数据简化DataSimp”团队!)