首页 > 数据分析 > 在python中使用SpaCy:使自然语言处理变得简单

[悬赏]在python中使用SpaCy:使自然语言处理变得简单 (已翻译100%)

查看 (768次)
英文原文:Natural Language Processing Made Easy – using SpaCy (​in Python)
标签: Python
admin 发布于 2017-04-06 11:31:47 (共 11 段, 本文赏金: 24元)
参与翻译(6人): greenflute cyt5969858 bruce_geek 福尔摩斯·潮 NLP小学生 廿九_ 默认 | 原文

【已悬赏】 赏金: 3元

简介

自然语言处理是人工智能很重要的一个领域。在很多智能应用中,例如自动化聊天机器人,论文总结,多语言翻译以及根据数据进行观点判定中都扮演者很关键的角色。无论哪个行业,在使用自然语言处理技术整理非结构化文本数据的时候,都不仅要求准确度,同时也会要求获得结果的方便程度。

自然语言处理是一个很宏大的领域,一些耳熟能详的任务包括文本分类,实体检测,机器翻译,回答问题以及概念判定。在我的上一篇文章里讨论了实现NLP的各种工具和组件。其中大部分的组件都在著名的函数库 NLTK (Natural Language Toolkit) 中有所描述。

本片文章,我将为大家分享用来实现NLP的一个很强大先进的库 – spaCy 的使用心得。

greenflute
翻译于 2017-04-25 02:24:30
 

参与本段翻译用户:
greenflute

显示原文内容

【已悬赏】 赏金: 2元

目录

  1. spaCy 简介与安装
  2. SpaCy 流程与特性
    • 符号化
    • 后期打标签
    • 实体检测
    • 依赖解析
  3. 名词短语
  4. 词语向量
  5. 在机器学习中集成 spaCy
  6. 比较 NLTK 和 CoreNLP


1. spaCy 简介与安装

1.1 简介

Spacy 是由 cython 实现的, (Cython赋予Python程序C语言的性能). 所以速度相当快,spaCy 提供相当精确的API以访问它的方法和设置跟(深度)机器学习相关的属性。


greenflute
翻译于 2017-04-25 02:32:15
 

参与本段翻译用户:
greenflute

显示原文内容

【已悬赏】 赏金: 2元

1.2 安装

Spacy 及其数据以及模型可以很轻松的使用python package index 和 setup tools 安装。使用下列命令:


sudo pip install spacy

如果用的是 Python3, 把 “pip” 换成 “pip3” 即可。

或者从 这里 下载源代码解压后安装:


python setup.py install

安装后,使用下列命令下载数据以及模型:



python -m spacy.en.download all
现在可以开始使用Spacy了。


greenflute
翻译于 2017-04-25 02:35:45
 

参与本段翻译用户:
greenflute

显示原文内容

【已悬赏】 赏金: 4元

2. SpaCy 流程以及属性

要实现 spacy 并访问其不同属性需要建立流程 pipelines。而流程是通过加载模型创建的。Spacy提供了若干不同类型的 模型 供我们映射语言中的不同信息:词汇,训练后向量,语法以及实体。

接下来我们加载默认模型 english-core-web:


import spacy 
nlp = spacy.load(“en”)
对象 “nlp” 将被用来创建文档,访问语言学标注和其他各种 NLP属性。先给我们的流程加载一个文本文件,文件来源于 tripadvisor 网站的旅馆评价。文件可以 由此 下载。



document = unicode(open(filename).read().decode('utf8')) 
document = nlp(document)

现在这个文档对象是 spacy.english 模型类的一部分了,而且已经被关联了若干属性。这些属性(或符号)可由下列命令列出:



dir(document)
>> [ 'doc', 'ents', … 'mem']

输出中包含了文档的各种属性——例如符号,符号引用索引,部分发音标签,实体,向量,句子,词汇等等。让我们仔细研究下这些属性。


greenflute
翻译于 2017-04-25 02:46:31
 

参与本段翻译用户:
greenflute

显示原文内容

【已悬赏】 赏金: 2元

2.1 符号化

每一个spacy文件都被符号化成句子并进一步成为可通过访问文件获得的符号


# first token of the doc 
document[0] 
>> Nice

# last token of the doc  
document[len(document)-5]
>> boston 

# List of sentences of our doc 
list(document.sents)
>> [ Nice place Better than some reviews give it credit for.,
 Overall, the rooms were a bit small but nice.,
...
Everything was clean, the view was wonderful and it is very well located (the Prudential Center makes shopping and eating easy and the T is nearby for jaunts out and about the city).]

2.2 词性标注

词性标注是由语法正确的句子中单词的用法定义的词的性质。这些标签可以用于信息过滤、统计模型和基于规则的解析的文本特征。

让我们来检查文档中所有的POS标签。



# get all tags
all_tags = {w.pos: w.pos_ for w in document}
>> {97:  u'SYM', 98: u'VERB', 99: u'X', 101: u'SPACE', 82: u'ADJ', 83: u'ADP', 84: u'ADV', 87: u'CCONJ', 88: u'DET', 89: u'INTJ', 90: u'NOUN', 91: u'NUM', 92: u'PART', 93: u'PRON', 94: u'PROPN', 95: u'PUNCT'}

# all tags of first sentence of our document 
for word in list(document.sents)[0]:  
    print word, word.tag_
>> ( Nice, u'JJ') (place, u'NN') (Better, u'NNP') (than, u'IN') (some, u'DT') (reviews, u'NNS') (give, u'VBP') (it, u'PRP') (creit, u'NN') (for, u'IN') (., u'.')
Let’s explore some top unigrams of the document. I have created a basic preprocessing and text cleaning function.



#define some parameters  
noisy_pos_tags = [“PROP”]
min_token_length = 2

#Function to check if the token is a noise or not  
def isNoise(token):     
    is_noise = False
    if token.pos_ in noisy_pos_tags:
        is_noise = True 
    elif token.is_stop == True:
        is_noise = True
    elif len(token.string) <= min_token_length:
        is_noise = True
    return is_noise 
def cleanup(token, lower = True):
    if lower:
       token = token.lower()
    return token.strip()

# top unigrams used in the reviews 
from collections import Counter
cleaned_list = [cleanup(word.string) for word in document if not isNoise(word)]
Counter(cleaned_list) .most_common(5)
>> [( u'hotel', 683), (u'room', 652), (u'great', 300),  (u'sheraton', 285), (u'location', 271)]


cyt5969858
翻译于 2017-10-30 21:31:34
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 2元

2.3 实体检测

Spacy由一个快速实体识别模型构成,该模型能从文件中识别出实际的短语。实体可以是不同的类型,如–人、位置、组织方式、日期、数字等。这些实体可通过“树”的属性获取。

让我们在现有的文档中找到所有已被命名的实体的类型。


labels = set([w.label_ for w in document.ents]) 
for label in labels: 
    entities = [cleanup(e.string, lower=False) for e in document.ents if label==e.label_] 
    entities = list(set(entities)) 
    print label,entities


cyt5969858
翻译于 2017-10-30 16:48:29
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 2元

2.4 依存句法分析

spacy最强大的功能之一是非常快速和准确的依存句法分析器,这个功能可以通过轻量级的API访问。解析器也可以用于句子边界检测和短语块。关系可以通过“.children” , “.root”, “.ancestor”等属性来访问。


# extract all review sentences that contains the term - hotel
hotel = [sent for sent in document.sents if 'hotel' in sent.string.lower()]

# create dependency tree
sentence = hotel[2] for word in sentence:
print word, ': ', str(list(word.children))
>> A :  []  cab :  [A, from] 
from :  [airport, to]
the :  [] 
airport :  [the] 
to :  [hotel] 
the :  [] hotel :  
[the] can :  []
be :  [cab, can, cheaper, .] 
cheaper :  [than] than :  
[shuttles]
the :  []
shuttles :  [the, depending] 
depending :  [time] what :  [] 
time :  [what, of] of :  [day]
the :  [] day :  
[the, go] you :  
[]
go :  [you]
. :  []

让我们来解析所有包含酒店这个词句子的依赖树并且检查以下用于酒店的形容词是什么。我创建了一个自定义函数来解析依赖树并提取相关的词性标记。

# check all adjectives used with a word 
def pos_words (sentence, token, ptag):
    sentences = [sent for sent in sentence.sents if token in sent.string]     
    pwrds = []
    for sent in sentences:
        for word in sent:
            if character in word.string: 
                   pwrds.extend([child.string.strip() for child in word.children
                                                      if child.pos_ == ptag] )
    return Counter(pwrds).most_common(10)

pos_words(document, 'hotel', “ADJ”)
>> [(u'other', 20), (u'great', 10), (u'good', 7), (u'better', 6), (u'nice', 6), (u'different', 5), (u'many', 5), (u'best', 4), (u'my', 4), (u'wonderful', 3)]


cyt5969858
翻译于 2017-12-06 14:59:17
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 1元

2.5 名词短语

依赖树也可以用来解析出名词短语:


# Generate Noun Phrases 
doc = nlp(u'I love data science on analytics vidhya') 
for np in doc.noun_chunks:
    print np.text, np.root.dep_, np.root.head.text
>> I nsubj love
   data science dobj love
   analytics pobj on

3. 单词向量集成

Spacy还提供这样的内部集成: 用密集的真实向量标识那些相似的信息。 它是用GloVe向量工具来生成向量。 GloVe 是一个非监督式学习算法,用于获取单词的向量。

让我们创建一些单词向量并执行一些有趣的操作。


from numpy import dot 
from numpy.linalg import norm 
from spacy.en import English
parser = English()

#Generate word vector of the word - apple  
apple = parser.vocab[u'apple']

#Cosine similarity function 
cosine = lambda v1, v2: dot(v1, v2) / (norm(v1) * norm(v2))
others = list({w for w in parser.vocab if w.has_vector and w.orth_.islower() and w.lower_ != unicode("apple")})

# sort by similarity score
others.sort(key=lambda w: cosine(w.vector, apple.vector)) 
others.reverse()


print "top most similar words to apple:" 
for word in others[:10]:
    print word.orth_
>> apples iphone f ruit juice cherry lemon banana pie mac orange



福尔摩斯·潮
翻译于 2018-01-14 21:16:06
 

参与本段翻译用户:
福尔摩斯·潮

显示原文内容

【已悬赏】 赏金: 2元

4.使用Spacy的文本机器学习

在机器学习模型中集成spacy是非常简单和直截了当的。让我们使用skLearn构建一个自定义文本分类器。我们将创建一个由以下组件组成的skLearn管道:清洁器,记号器,向量器,分类器。对于记号器和向量器,我们将使用spacy构建自己的自定义模块。


from sklearn.feature_extraction.stop_words import ENGLISH_STOP_WORDS as stopwords 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.metrics import accuracy_score 
from sklearn.base import TransformerMixin 
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC

import string
punctuations = string.punctuation

from spacy.en import English
parser = English()

#Custom transformer using spaCy 
class predictors(TransformerMixin):
    def transform(self, X, **transform_params):
        return [clean_text(text) for text in X]
    def fit(self, X, y=None, **fit_params):
        return self
    def get_params(self, deep=True):
        return {}

# Basic utility function to clean the text 
def clean_text(text):     
    return text.strip().lower()

现在让我们使用spacy解析器和一些基本的清洁器来创建一个自定义令牌程序函数。这里要注意的一点是,可以用单词向量替换文本特征(在深度学习模型中是特别有益的)

#Create spacy tokenizer that parses a sentence and generates tokens
#these can also be replaced by word vectors 
def spacy_tokenizer(sentence):
    tokens = parser(sentence)
    tokens = [tok.lemma_.lower().strip() if tok.lemma_ != "-PRON-" else tok.lower_ for tok in tokens]
    tokens = [tok for tok in tokens if (tok not in stopwords and tok not in punctuations)]     return tokens

#create vectorizer object to generate feature vectors, we will use custom spacy’s tokenizer
vectorizer = CountVectorizer(tokenizer = spacy_tokenizer, ngram_range=(1,1)) classifier = LinearSVC()

我们现在准备好创建管道,加载数据(这里的示例),并运行分类器模型。

# Create the  pipeline to clean, tokenize, vectorize, and classify 
pipe = Pipeline([("cleaner", predictors()),
                 ('vectorizer', vectorizer),
                 ('classifier', classifier)])

# Load sample data
train = [('I love this sandwich.', 'pos'),          
         ('this is an amazing place!', 'pos'),
         ('I feel very good about these beers.', 'pos'),
         ('this is my best work.', 'pos'),
         ("what an awesome view", 'pos'),
         ('I do not like this restaurant', 'neg'),
         ('I am tired of this stuff.', 'neg'),
         ("I can't deal with this", 'neg'),
         ('he is my sworn enemy!', 'neg'),          
         ('my boss is horrible.', 'neg')] 
test =   [('the beer was good.', 'pos'),     
         ('I do not enjoy my job', 'neg'),
         ("I ain't feelin dandy today.", 'neg'),
         ("I feel amazing!", 'pos'),
         ('Gary is a good friend of mine.', 'pos'),
         ("I can't believe I'm doing this.", 'neg')]

# Create model and measure accuracy
pipe.fit([x[0] for x in train], [x[1] for x in train]) 
pred_data = pipe.predict([x[0] for x in test]) 
for (sample, pred) in zip(test, pred_data):
    print sample, pred 
print "Accuracy:", accuracy_score([x[1] for x in test], pred_data)

>>    ('the beer was good.', 'pos') pos
      ('I do not enjoy my job', 'neg') neg
      ("I ain't feelin dandy today.", 'neg') neg
      ('I feel amazing!', 'pos') pos
      ('Gary is a good friend of mine.', 'pos') pos
      ("I can't believe I'm doing this.", 'neg') neg 
      Accuracy: 1.0


廿九_
翻译于 2018-01-19 09:19:35
 

参与本段翻译用户:
NLP小学生 廿九_

显示原文内容 | 显示全部版本

【已悬赏】 赏金: 2元

5. Spacy与其他包的对比

Spacy非常强大并且是行业内很强力的一个包,几乎适用于所有自然语言处理任务。你想知道这是为什么吗?

让我们将Spacy和其他著名的在Python中实施nlp的工具–corenlp和NLTK进行比较。


Feature Availability

Feature Spacy NLTK Core NLP
Easy installation Y Y Y
Python API Y Y N
Multi Language support N Y Y
Tokenization Y Y Y
Part-of-speech tagging Y Y Y
Sentence segmentation Y Y Y
Dependency parsing Y N Y
Entity Recognition Y Y Y
Integrated word vectors Y N N
Sentiment analysis Y Y Y
Coreference resolution N N Y


Speed: Key Functionalities – Tokenizer, Tagging, Parsing

Package Tokenizer Tagging Parsing
spaCy 0.2ms 1ms 19ms
CoreNLP 2ms 10ms 49ms
NLTK 4ms 443ms


Accuracy: Entity Extraction

Package Precition Recall F-Score
spaCy 0.72 0.65 0.69
CoreNLP 0.79 0.73 0.76
NLTK 0.51 0.65 0.58


cyt5969858
翻译于 2017-10-30 16:55:43
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 2元

结语

在这篇文章中,我们介绍了spacy工具包,它用pytho来解决自然语言处理(NLP)任务。我们通过几个例子展示了spacy的有效性、处理速度和精确度。最后我们比较了spacy和其它两个著名的自然语言处理工具包corenlp和nltk进行了性能比较。


一旦掌握了本文中介绍的概念,学习者可以真正地利用文本数据和自然语言处理来解决有挑战性的问题。


我希望你能喜欢这篇文章,如果你有任何疑惑、问题或者任何其他想法,欢迎在评论区留言。

bruce_geek
翻译于 2018-01-06 18:03:30
 

参与本段翻译用户:
bruce_geek

显示原文内容

GMT+8, 2018-4-19 21:18 , Processed in 0.052214 second(s), 11 queries .