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

模式- 用于使gensim包正常工作。它可以通过以下命令安装 -

pip install pattern

代币化

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

例子

代币化

NLTK 模块提供了不同的标记化包。我们可以根据我们的要求使用这些包。这里描述了一些包 -

sent_tokenize 包- 该包将输入文本分成句子。您可以使用以下命令导入此包 -

from nltk.tokenize import sent_tokenize

word_tokenize 包- 该包将输入文本划分为单词。您可以使用以下命令导入此包 -

from nltk.tokenize import word_tokenize

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

from nltk.tokenize import WordPuncttokenizer

词干提取

在任何语言中,单词都有不同的形式。由于语法原因,语言包含许多变体。例如,考虑一下“民主”“民主”和“民主化”这些词。对于机器学习以及网络抓取项目,机器了解这些不同的单词具有相同的基本形式非常重要。因此,我们可以说,在分析文本时提取单词的基本形式是有用的。

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

NLTK 模块为词干提取提供了不同的包。我们可以根据我们的要求使用这些包。这里描述了其中一些包 -

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

from nltk.stem.porter import PorterStemmer

例如,将单词“writing”作为该词干分析器的输入后,词干提取后的输出将是单词“write” 。

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

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

分块

分块,即将数据分成小块,是自然语言处理中识别词性和名词短语等短语的重要过程之一。分块就是对 token 进行标记。我们可以借助分块过程来获得句子的结构。

例子

在此示例中,我们将使用 NLTK Python 模块来实现名词短语分块。NP 词块分析是词块分析的一个类别,它会在句子中找到名词短语词块。

实施名词短语分块的步骤

我们需要按照下面给出的步骤来实现名词短语分块 -

步骤 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()
短语分块

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

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

BoW 模型的工作原理

最初,模型从文档中的所有单词中提取词汇表。随后,它会使用文档术语矩阵构建模型。这样,BoW 模型仅将文档表示为词袋,而丢弃顺序或结构。

例子

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

Sentence1 - 这是词袋模型的示例。

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

现在,通过考虑这两个句子,我们有以下 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(主题文档矩阵):输出