使用Python的自然语言处理

Tavish Aggarwal.

在这篇文章中 自然语言处理 我们将理解该过程中使用的NLP和各种技术。提供了在Python中执行NLP或北京快3app相关操作的软件包:

  1. nltk.
  2. 隐星
  3. TextBlob.
  4. 图案
  5. Gensim
  6. 微米
  7. 猜测
  8. Python包装斯坦福科伦加尔普
  9. Berkeley Parser的Python包装器
  10. 可读性-LXML
  11. 美丽群组

在这篇文章中,我们将重点关注NLTK和SPACY包。让我们开始吧。

常用表达

正则表达式是定义搜索模式的字符序列。图片以下代表我们可以使用的表达式来生成模式。

正则表达备忘带

我们中的一些人可能想知道为什么我们需要了解NLP中的正则表达式?

为了处理北京快3app,我们需要选择正确的北京快3app集以执行操作。在这种情况下,正则表达式方便。正则表达式是语言独立的,可以与任何语言一起使用。

Here we will be focusing on re package, which is defined for python. If you are new to regular expressions and want to get started, I would recommend going through Regex 101..

让我们看起来和RE包提供的一些方法来执行正则表达式搜索。

分裂并找到所有

We use split method to split the string based on the regular expression. And findall method is used to find all the matching pattern in the string based on regular expression defined.

考虑下面显示的示例:

import re

my_string = "Hello All, I am Tavish Aggarwal. Today I will be talking about NLP."

# Regex
sentence_endings = r"[(.?!)]"

print(re.split(sentence_endings, my_string))

# Regex to find capital letters in string
capitalized_words = r"[A-Z]\w+"

print(re.findall(capitalized_words, my_string))

搜索和匹配

Similar to findall we can use search and match as well to find the text matching the pattern in the string. Difference between search and match is:

  • 搜索将在字符串中的任何位置找到一些东西并返回匹配对象。
  • 匹配将在字符串开头找到某些内容并返回匹配对象。

让我们来看看下面显示的一个例子:

# Syntax
# re.search(pattern, string, flags=0)
# re.match(pattern, string, flags=0)
import re

my_string = "hello All, I am Tavish Aggarwal. Today I will be talking about NLP."
capitalized_words = r"[A-Z]\w+"

print(re.search(capitalized_words, my_string))

print(re.match(capitalized_words, my_string))

In the example shown above, the search will found All as it is the first string matching to the regex defined. But the match will return None since it is not able to find any capital letter at the beginning of the string.

编译

我们还可以编译我们的正则表达式并使用它们来查找匹配的北京快3app。考虑下面显示的示例:

h = re.compile('hello')
h.match('hello world')

编译是另一个语法,我们使用编译方法定义我们的Regex。然后匹配我们的字符串。

此方法替换具有RECK的字符串中的正则表达式模式的所有出现,替换所有事件,除非MAX提供。考虑下面显示的示例:

# Syntax
# re.sub(pattern, repl, string, max=0)

import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num

既然我们对常规表达有关的概念有很好的理解。现在是时候进入NLP概念了。在入门前,让我们首先了解NLP的应用程序。以及如何帮助行业解决业务问题。

NLP应用程序

有很多公司,如谷歌,在NLP中投入了很多。 NLP在行业中使用的应用程序如下所述:

  1. Cortana和Siri - 各种智能助手使用NLP处理北京快3app。
  2. POS(词性的一部分)标记 - 句子中的单词分类,名词,副词等句子
  3. ner(名称实体识别) - 对人,组织,州,时间等句子中的单词分类
  4. 情感分析 - 分析句子的积极性/消极性

这不是很有趣吗?有许多应用程序使用NLP进行智能决策。

在潜入NLP管道之前,请允许我们提取我们将执行操作的数据。请参阅下面显示的代码:

import requests
from bs4 import BeautifulSoup
import time
import numpy as np


html = requests.get('//en.wikipedia.org/wiki/Sundar_Pichai')
soup = BeautifulSoup(html.text, 'lxml')

text = [''.join(t.findAll(text = True)) for t in soup.findAll('p')]
text = ''.join(text)

惊人的!我们正在使用Wikipedia页面作为文章。现在我们与我们准备好了文字。

NLP管道

处理北京快3app(包括数据清洁)和执行NLP操作有各种技术,并执行NLP操作:

  1. 句子分割
  2. 单词标记化
  3. 预测每个令牌的言论部分
  4. 识别停止单词
  5. 北京快3applemmatization. 
  6. 依赖解析
  7. 命名实体识别(ner)
  8. COSEREREDED解决方案

典型的NLP管道遵循上述步骤。虽然,步骤的执行可能有所不同,并且可以是个人选择。

句子分割

句子分割 is the process of breaking up text into the sentences. NTLK library provides the sent_tokenize function to convert text into sentences.

以下是在Python中展示实现的示例:

from nltk.tokenize import sent_tokenize

sentences = sent_tokenize(text)

print(sentences)

单词标记化

单词标记化 is the process of chopping up a character sequence into pieces called tokens. NTLK library provides the word_tokenize function to convert text into sentences.

from nltk.tokenize import word_tokenize

tokenized_sent = word_tokenize(sentences[3])
unique_tokens = set(word_tokenize(text))

print(unique_tokens)

我们还可以使用Regexp_Tokenzize根据正则表达式来授权句子。考虑下面显示的示例:

from nltk.tokenize import regexp_tokenize

capital_words = r"[A-Z]\w+"
print(regexp_tokenize(text, capital_words))

如果我们希望在北京快3app中看到北京快3app中使用的最常用单词,何时曾对北京快3app致敬?有趣的要求不是它!

我们可以使用收集包中的计数器方法来实现这一目标。考虑下面显示的示例:

from collections import Counter

tokens = word_tokenize(text)

lower_tokens = [t.lower() for t in tokens]

bow_simple = Counter(lower_tokens)

print(bow_simple.most_common(20))

输出看起来不一致,因为文章中有停止单词。让我们删除他们接下来。

预测每个令牌的言论部分

在授权句子中以单词。下一步是预测每个令牌的语音。在此步骤中,我们将把每个单词归类为名词,形容词,动词等。

We use the pos_tag function to add POS (Part Of Speech) to each word as cc (conjunction), RB (adverbs), IN (preposition), NN (noun) and JJ (adjective). 考虑下面显示的示例:

text = nltk.word_tokenize("And now for something completely different")
nltk.pos_tag(text)

识别停止单词

NLP管道中的下一步是识别停止单词。我们可以考虑根据我们试图解决的问题从北京快3app中删除停止单词。

如果我们试图建立一个搜索引擎,我们需要问自己我们需要删除秒表吗? (书面书写名为 在该)。

考虑下面显示的示例以从句子中删除句子(如果需要):

from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 
  
stop_words = stopwords.words('english') 
stop_words.extend([')', ',', '.', '[', ']', '(', '``', 'on', 'he', '\'s'])
word_tokens = word_tokenize(text) 
  
filtered_sentence = [w for w in word_tokens if not w in stop_words] 
  
filtered_sentence = [] 
  
for w in word_tokens: 
    if w not in stop_words: 
        filtered_sentence.append(w) 
        
print(filtered_sentence) 

北京快3applemmatization.

用英语(和大多数语言),单词以不同的形式出现。我们需要弄清楚句子中每个单词的最基本形式或引理,以便不遵守相同形式的单词。

考虑一下我们有一个北京快3app的一个例子:“昨天我扮演了卡罗姆。今天我将在玩乒乓球。”

我们可以看到戏剧和播放在句子中使用。这两个词是平等的,不应该以不同的方式对待。因此,它应该以算法中的播放(到基本形式)被释放。

Python NLTK package provides WordNetLemmatizer function to Lemmatize the sentence. 考虑下面显示的示例:

from nltk.stem import WordNetLemmatizer

tokens = word_tokenize(text)
lower_tokens = [t.lower() for t in tokens]

stop_words = stopwords.words('english') 
stop_words.extend([')', ',', '.', '[', ']', '(', '``', 'on', 'he', '\'s'])

alpha_only = [t for t in lower_tokens if t.isalpha()]

no_stops = [t for t in alpha_only if t not in stop_words]

wordnet_lemmatizer = WordNetLemmatizer()

lemmatized = [wordnet_lemmatizer.lemmatize(t) for t in no_stops]

bow = Counter(lemmatized)

print(bow.most_common(10))

依赖解析

下一步是弄清楚我们句子中的所有单词如何彼此相关。解析字依赖项是一个特别复杂的任务。

笔记: NLTK包在构建中没有依赖解析模型。还有其他包具有它并超出了这篇文章的范围。

命名实体认可

NLP任务标识北京快3app中的重要命名实体:

  • 人,地方,组织
  • 日期,州,艺术品和其他类别

nltk. package provides ne_chunk_sents function which is used to find 命名实体识别(ner) in the data.

sentences = nltk.sent_tokenize(text)
token_sentences = [word_tokenize(sent) for sent in sentences]

pos_sentences = [nltk.pos_tag(sent) for sent in token_sentences]
chunked_sentences = nltk.ne_chunk_sents(pos_sentences, binary=True)

for sent in chunked_sentences:
    for chunk in sent:
        if hasattr(chunk, "label") and chunk.label() == "NE":
            print(chunk)

COSEREREDED解决方案

考虑一句句子`拉维喜欢玩车道。他也喜欢玩乒乓球。

作为一种阅读这句话的人,你可以轻松弄清楚“他”是指的  "Ravi". Coreference解决方案的目标是通过横跨句子跟踪代词来计算同一映射。我们想弄清楚引用同一实体的所有单词。

笔记: NLTK包在构建中没有Coreference解析模型。还有其他包具有它并超出了这篇文章的范围。

参考: NLP包比较

我们介绍了一个完整的流水线,可以使用NLTK包执行NLP操作。你准备好编写完整的管道吗?我希望它将是一个忙碌的任务。

幸运的是,我们不必编写NLP管道来处理北京快3app。谢谢那些照顾它的隐星库。让我们熟悉Spacy库:

隐藏介绍

SPACY是Python中的高级自然语言处理(NLP)的自由开源库。它专为生产使用而设计,并帮助您构建过程和“了解”大量北京快3app的应用程序。

隐星 provides load function which takes care of the complete pipeline involved in NLP which we have seen. Let's see an example:

# Import spacy
import spacy
# Instantiate the English model: nlp
nlp = spacy.load('en',tagger=False, parser=False, matcher=False)
# This runs the entire pipeline.
doc = nlp(article)
# Print all of the found entities and their labels
for ent in doc.ents:
    print(ent.label_, ent.text)

Spacy可以做依赖解析,这是NLTK包不可能的。考虑下面的一个例子,显示代码以查看依赖关系解析:

from spacy import displacy

doc = nlp("This is a sentence")
displacy.render(doc, style="dep")

笔记: Spacy模型不能进行Coreference分辨率。

我们将在未来的帖子中详细讨论Spacy。

概括

在这篇文章中,我们理解:

  • RE包用于在北京快3app上执行正则表达式。
  • 在行业中使用NLP并经历了NLP过程的典型管道。
  • Spacy包如何简化NLP过程。我们已经看到了NLTK和SPACY包的局限性。

希望你喜欢这篇文章。保持学习!

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal.是一个数据科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。