Python Web Scraping 简明教程

Python Web Scraping - Dealing with Text

在上一章中,我们了解了如何处理作为网络爬取内容一部分获得的视频和图片。在本章中,我们将使用 Python 库来处理文本分析,并详细了解其相关内容。

Introduction

您可以使用名为自然语言工具包 (NLTK) 的 Python 库来执行文本分析。在深入了解 NLTK 概念之前,我们先了解文本分析和网络爬取之间的关系。

分析文本中的单词可以帮助我们了解哪些单词很重要,哪些单词不常见,单词如何分组。此项分析简化了网络爬取任务。

Getting started with NLTK

自然语言工具包 (NLTK) 是 Python 库的集合,专门为识别和标记自然语言(如英语)文本中发现的词性而设计。

Installing NLTK

您可以使用以下命令在 Python 中安装 NLTK −

pip install nltk

如果您使用的是 Anaconda,则可以通过使用以下命令来构建 NLTK 的 conda 包 −

conda install -c anaconda nltk

Downloading NLTK’s Data

在安装 NLTK 后,我们必须下载预设文本库。但在下载文本预设库之前,我们需要通过 import 命令导入 NLTK,如下所示 −

mport nltk

现在,可以通过以下命令下载 NLTK 数据 −

nltk.download()

安装所有可用的 NLTK 软件包需要一些时间,但始终建议安装所有软件包。

Installing Other Necessary packages

我们还需要其他一些 Python 软件包,如 gensimpattern ,才能使用 NLTK 执行文本分析以及构建自然语言处理应用程序。

gensim − 一个强大的语义建模库,适用于许多应用。可以通过以下命令进行安装 −

pip install gensim

pattern − 用于使 gensim 软件包正常工作。可以通过以下命令进行安装 −

pip install pattern

Tokenization

将给定文本分解为称为标记的较小单位的过程称为标记化。这些标记可以是单词、数字或标点符号。它也称为 word segmentation

Example

tokenization

NLTK 模块为标记化提供了不同的软件包。我们可以根据需要使用这些软件包。此处描述了其中一些软件包 −

sent_tokenize package − 此软件包将输入文本划分为句子。可以使用以下命令导入此软件包 −

from nltk.tokenize import sent_tokenize

word_tokenize package − 此软件包将输入文本划分为单词。可以使用以下命令导入此软件包 −

from nltk.tokenize import word_tokenize

WordPunctTokenizer package − 此软件包将输入文本以及标点符号划分为单词。可以使用以下命令导入此软件包 −

from nltk.tokenize import WordPuncttokenizer

Stemming

在任何语言中,单词都有不同的形式。由于语法原因,语言包含许多变体。例如,考虑以下单词 democracydemocraticdemocratization 。对于机器学习以及网络爬取项目,机器可以理解这些不同的单词具有相同的词干很重要。因此,我们可以说在分析文本时,提取单词的词干可能很有用。

这可以通过词干提取来实现,词干提取可以定义为通过切掉单词结尾来提取单词基本形式的启发式过程。

NLTK 模块提供了不同的词干提取包。我们可以根据需要使用这些包。其中一些包此处进行了说明 -

PorterStemmer package - 此 Python 词干提取包使用波特算法来提取基本形式。您可以使用以下命令导入此包 -

from nltk.stem.porter import PorterStemmer

例如,在此词干提取器中输入单词 ‘writing’ 后,词干提取后的输出将是单词 ‘write’

LancasterStemmer package - 此 Python 词干提取包使用兰开斯特算法来提取基本形式。您可以使用以下命令导入此包 -

from nltk.stem.lancaster import LancasterStemmer

例如,在此词干提取器中输入单词 ‘writing’ 后,词干提取后的输出将是单词 ‘writ’

SnowballStemmer package - 此 Python 词干提取包使用 Snowball 算法来提取基本形式。您可以使用以下命令导入此包 -

from nltk.stem.snowball import SnowballStemmer

例如,在此词干提取器中输入单词“writing”后,词干提取后的输出将是单词“write”。

Lemmatization

提取单词基本形式的另一种方法是词形还原,通常通过使用词汇表和形态分析去除屈折词尾。任何单词在词形还原之后的单词基本形式被称为词形。

NLTK 模块提供了以下词形还原包 -

WordNetLemmatizer package - 它会根据单词用作名词还是动词来提取基本形式。您可以使用以下命令导入此包 -

from nltk.stem import WordNetLemmatizer

Chunking

分块是指将数据分成小块,这是自然语言处理中用于识别词性和小短语(如名词短语)的重要过程。分块是标记令牌。我们可以借助分块过程来获取句子的结构。

Example

在本例中,我们将使用 NLTK Python 模块来实现名词短语分块。名词短语分块是分块的一种类型,它将在句子中找到名词短语块。

Steps for implementing noun phrase chunking

我们需要按照以下步骤实现名词短语分块 -

Step 1 − Chunk grammar definition

第一步中,我们将为分块定义语法。它包括我们需要遵循的规则。

Step 2 − Chunk parser creation

现在,我们将创建一个分块解析器。它将解析语法并给出输出。

Step 3 − The Output

在最后一步中,输出将以树格式生成。

首先,我们需要按如下方式导入 NLTK 包 -

import nltk

接下来,我们需要定义句子。此处 DT:限定词,VBP:动词,JJ:形容词,IN:介词和 NN:名词。

sentence = [("a", "DT"),("clever","JJ"),("fox","NN"),("was","VBP"),("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]

接下来,我们以正则表达式的形式给出了语法。

grammar = "NP:{<DT>?<JJ>*<NN>}"

现在,下一行代码将定义用于解析语法的一个解析器。

parser_chunking = nltk.RegexpParser(grammar)

现在,解析器将解析这个句子。

parser_chunking.parse(sentence)

然后,我们把输出保存在变量里。

Output = parser_chunking.parse(sentence)

借助以下代码,我们能够图形化输出,如图所示。

output.draw()
phrase chunking

Bag of Word (BoW) Model Extracting and converting the Text into Numeric Form

单词袋 (BoW) 是自然语言处理中一个有用的模型,主要用于提取文本中的特征。从文本中提取特征后,它可用于机器学习算法中的建模,因为原始数据不能用于 ML 应用程序。

Working of BoW Model

最初,模型从文档中的所有单词中提取词汇表。稍后,使用文档术语矩阵,它将建立一个模型。这样一来,BoW 模型将文档仅表示为单词的集合,顺序或结构将被丢弃。

Example

假设我们有以下两个句子:

Sentence1 – 这是单词袋模型的示例。

Sentence2 – 我们可以使用单词袋模型提取特征。

现在,通过考虑这两个句子,我们有以下 14 个不同的单词:

  1. This

  2. is

  3. an

  4. example

  5. bag

  6. of

  7. words

  8. model

  9. we

  10. can

  11. extract

  12. features

  13. by

  14. using

Building a Bag of Words Model in NLTK

我们来看一看以下 Python 脚本,它将在 NLTK 中构建一个 BoW 模型。

首先,导入以下包:

from sklearn.feature_extraction.text import CountVectorizer

接下来,定义句子集:

Sentences=['This is an example of Bag of Words model.', ' We can extract
   features by using Bag of Words model.']
   vector_count = CountVectorizer()
   features_text = vector_count.fit_transform(Sentences).todense()
   print(vector_count.vocabulary_)

Output

它显示我们在以上两个句子中发现了 14 个不同的单词:

{
   'this': 10, 'is': 7, 'an': 0, 'example': 4, 'of': 9,
   'bag': 1, 'words': 13, 'model': 8, 'we': 12, 'can': 3,
   'extract': 5, 'features': 6, 'by': 2, 'using':11
}

Topic Modeling: Identifying Patterns in Text Data

通常,文档被分组为主题,主题建模是一种用于识别文本中与特定主题相对应的模式的技术。换句话说,主题建模用于发现给定文档集中的抽象主题或隐藏结构。

你可以在以下情况下使用主题建模:

Text Classification

主题建模可以改进分类,因为它将相似的单词组合在一起,而不是将每个单词单独用作一个特征。

Recommender Systems

我们可以通过使用相似性度量来构建推荐系统。

Topic Modeling Algorithms

我们可以使用以下算法来实现主题建模 −

Latent Dirichlet Allocation(LDA) − 它是使用概率图形模型来实现主题建模的最流行算法之一。

Latent Semantic Analysis(LDA) or Latent Semantic Indexing(LSI) − 它基于线性代数,并在文档术语矩阵上使用 SVD(奇异值分解)的概念。

Non-Negative Matrix Factorization (NMF) − 它也基于线性代数,如 LDA。

上面提到的算法将具有以下元素 −

  1. Number of topics: Parameter

  2. Document-Word Matrix: Input

  3. WTM(单词主题矩阵)和 TDM(主题文档矩阵):输出