Python 网页抓取 - 文字处理



在上一章中,我们了解了如何处理我们通过网页抓取的内容获取的视频和图片。在本章中,我们将使用 Python 库来处理文本分析,并详细了解这方面的内容。

简介

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

分析文本中的单词,可以让我们了解哪些单词很重要,哪些单词不寻常以及单词是如何分组的。这种分析可以简化网页抓取的任务。

NLTK 入门

自然语言工具包 (NLTK) 是一个 Python 库的集合,专门设计用于识别和标记英语等自然语言文本中找到的词性。

安装 NLTK

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

pip install nltk

如果你正在使用 Anaconda,那么可以使用以下命令构建一个针对 NLTK 的 conda 包 −

conda install -c anaconda nltk

下载 NLTK 的数据

在安装 NLTK 之后,我们必须下载预设的文本存储库。但在下载文本预设存储库之前,我们需要使用import命令帮助导入 NLTK,如下所示 −

mport nltk

现在,可以在以下命令的帮助下下载 NLTK 数据 −

nltk.download()

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

安装其他必要的包

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

gensim − 一个强大的语义建模库,对许多应用程序都很有用。它可以通过以下命令进行安装 −

pip install gensim

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

pip install pattern

标记化

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

示例

Tokenization

NLTK 模块提供了不同的包来进行标记化。我们可以根据自己的需要使用这些包。这里描述了其中的一些包 −

sent_tokenize 包 − 此包会将输入文本分成句子。你可以使用以下命令来导入此包 −

from nltk.tokenize import sent_tokenize

word_tokenize 包 − 此包会将输入文本分成单词。你可以使用以下命令来导入此包 −

from nltk.tokenize import word_tokenize

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

from nltk.tokenize import WordPuncttokenizer

词干分析

任何语言中都存在各种形式的单词。一门语言会因语法原因而包含许多变体。例如,考虑单词 democracydemocraticdemocratization。对于机器学习以及网络抓取项目而言,机器理解这些不同的单词具有相同的基元形式非常重要。因此我们可以说,在分析文本时,提取单词的基元形式非常有用。

这可以通过词干分析来实现,它可以定义为通过切除单词尾部来提取单词基元形式的启发式过程。

NLTK 模块为词干分析提供了不同的包。我们可以根据自己的要求使用这些包。以下对其中一些包进行了说明 −

PorterStemmer 包 – 此 Python 词干分析包使用 Porter 算法来提取基元形式。你可以使用以下命令来导入该包 −

from nltk.stem.porter import PorterStemmer

例如,将单词 “writing” 作为输入形式提供给此词干分析器时,词干分析后得到的输出将是单词 “write”

LancasterStemmer 包 – 此 Python 词干分析包使用 Lancaster 算法来提取基元形式。你可以使用以下命令来导入该包 −

from nltk.stem.lancaster import LancasterStemmer

例如,将单词 “writing” 作为输入形式提供给此词干分析器时,词干分析后得到的输出将是单词 “writ”

SnowballStemmer 包 – 此 Python 词干分析包使用 Snowball 算法来提取基元形式。你可以使用以下命令来导入该包 −

from nltk.stem.snowball import SnowballStemmer

例如,将单词 “writing” 作为输入形式提供给此词干分析器时,词干分析后得到的输出将是单词 “write”

词形还原

另一种提取单词基元形式的方法是词形还原,其通常旨在通过使用词汇和形态分析来移除屈折词尾。词形还原后的任何单词的基元形式都称为词干。

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

WordNetLemmatizer 包 – 它会提取单词的基元形式,具体取决于该单词是作为名词还是动词使用。你可以使用以下命令来导入该包 −

from nltk.stem import WordNetLemmatizer

块分析

块分析是指将数据划分为小块,这是自然语言处理中用于识别词性和短语(例如名词短语)的重要过程之一。块分析是要对标记进行标记。借助块分析过程,我们能够获取句子的结构。

示例

在此示例中,我们将使用 NLTK Python 模块实现名词短语块分析。名词短语块分析是一种块分析分类,它将在句子中查找名词短语块。

实现名词短语块分析的步骤

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

第 1 步 − 块语法定义

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

第 2 步 − 块解析器创建

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

第 3 步 − 输出

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

首先,我们需要如下导入 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

单词袋模型 (BoW) 提取文本并将其转换为数字形式

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

BoW 模型的工作原理

最初,模型从文档中的所有单词中提取词汇表。然后,使用文档术语矩阵,它会建立模型。通过这种方式,BoW 模型将文档表示为一个仅仅由单词组成的词袋,而顺序或结构则被舍弃。

示例

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

句子 1 - 这是一个单词袋模型示例。

句子 2 - 我们可以使用单词袋模型提取特征。

现在,通过考虑这两个句子,我们得到了以下 14 个不同的单词 -

  • 一个
  • 示例
  • 词袋
  • 单词
  • 模型
  • 我们
  • 可以
  • 提取
  • 特征
  • 通过
  • 使用

在 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_)

输出

它表明,在上述两个句子中有 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
}

主题建模:在文本数据中识别模式

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

你可以在以下场景中使用主题建模 -

文本分类

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

推荐系统

我们可以利用相似度测量构建推荐系统。

主题建模算法

我们可以通过以下算法实现主题建模 -

潜在狄利克雷分配(LDA) - 这是最流行的算法之一,它使用概率图模型来实现主题建模。

潜在语义分析 (LDA) 或潜在语义索引 (LSI) - 它基于线性代数,并在文档术语矩阵上使用 SVD(奇异值分解)的概念。

非负矩阵分解 (NMF) - 它也基于线性代数,与 LDA 类似。

上述算法将具有以下元素 -

  • 主题数量:参数
  • 文档-单词矩阵:输入
  • WTM(单词主题矩阵)和 TDM(主题文档矩阵):输出
广告