Python - 网页抓取处理文本

  • 简述

    在上一章中,我们已经了解了如何处理作为网络抓取内容的一部分获得的视频和图像。在本章中,我们将使用 Python 库处理文本分析,并将详细了解这一点。
  • 介绍

    您可以使用称为自然语言工具包 (NLTK) 的 Python 库执行文本分析。在深入了解 NLTK 的概念之前,让我们先了解一下文本分析和网页抓取之间的关系。
    分析文本中的单词可以让我们知道哪些单词很重要,哪些单词不寻常,单词是如何分组的。这种分析简化了网页抓取的任务。
  • NLTK 入门

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

    安装 NLTK

    您可以使用以下命令在 Python 中安装 NLTK -
    
    pip install nltk
    
    如果您使用的是 Anaconda,则可以使用以下命令构建 NLTK 的 conda 包 -
    
    conda install -c anaconda nltk
    

    下载 NLTK 的数据

    安装 NLTK 后,我们必须下载预设的文本存储库。但在下载文本预设存储库之前,我们需要借助以下工具导入 NLTKimport命令如下 -
    
    mport nltk
    
    现在,借助以下命令可以下载 NLTK 数据 -
    
    nltk.download()
    
    安装所有可用的 NLTK 包需要一些时间,但始终建议安装所有包。
  • 安装其他必要的软件包

    我们还需要一些其他的 Python 包,比如gensimpattern用于进行文本分析以及使用 NLTK 构建构建自然语言处理应用程序。
    gensim− 一个强大的语义建模库,可用于许多应用程序。它可以通过以下命令安装 -
    
    pip install gensim
    
    pattern− 用来制作gensim包工作正常。它可以通过以下命令安装 -
    
    pip install pattern
    
  • 代币化

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

    例子

    代币化
    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
    
  • 词干

    在任何语言中,单词都有不同的形式。由于语法原因,一种语言包含许多变体。例如,考虑单词democracy, democratic, 和democratization. 对于机器学习和网络抓取项目,机器理解这些不同的词具有相同的基本形式很重要。因此,我们可以说在分析文本时提取单词的基本形式可能很有用。
    这可以通过词干提取来实现,词干提取可以定义为通过切断词尾来提取词的基本形式的启发式过程。
    NLTK 模块为词干提取提供了不同的包。我们可以根据我们的要求使用这些包。其中一些软件包在此处描述 -
    PorterStemmer package- 这个 Python 词干提取包使用 Porter 算法来提取基本形式。您可以使用以下命令导入此包 -
    
    from nltk.stem.porter import PorterStemmer
    
    例如,在给出单词之后‘writing’作为这个词干分析器的输入,输出将是这个词‘write’词干后。
    LancasterStemmer package− 此 Python 词干提取包使用 Lancaster 算法来提取基本形式。您可以使用以下命令导入此包 -
    
    from nltk.stem.lancaster import LancasterStemmer
    
    例如,在给出单词之后‘writing’作为这个词干分析器的输入,那么输出就是这个词‘writ’词干后。
    SnowballStemmer package− 此 Python 词干提取包使用 Snowball 算法提取基本形式。您可以使用以下命令导入此包 -
    
    from nltk.stem.snowball import SnowballStemmer
    
    例如,将单词“writing”作为词干分析器的输入后,输出将是词干提取后的单词“write”。
  • 词形还原

    提取单词基本形式的另一种方法是词形还原,通常旨在通过使用词汇和形态分析来去除屈折词尾。词形还原后任何单词的基本形式称为引理。
    NLTK 模块提供以下用于词形还原的包 -
    WordNetLemmatizer package- 它将根据是否用作名词作为动词来提取单词的基本形式。您可以使用以下命令导入此包 -
    
    from nltk.stem import WordNetLemmatizer
    
  • 分块

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

    例子

    在这个例子中,我们将使用 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)模型提取文本并将其转换为数字形式

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

    BoW模型的工作

    最初,模型从文档中的所有单词中提取一个词汇表。后来,使用文档术语矩阵,它会建立一个模型。通过这种方式,BoW 模型将文档仅表示为一个词袋,并且丢弃了顺序或结构。

    例子

    假设我们有以下两个句子 -
    Sentence1− 这是一个词袋模型的例子。
    Sentence2− 我们可以使用 Bag of Words 模型提取特征。
    现在,通过考虑这两个句子,我们有以下 14 个不同的单词 -
    • This
    • is
    • an
    • example
    • bag
    • of
    • words
    • model
    • we
    • can
    • extract
    • features
    • by
    • using
  • 在 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
    }
    
  • 主题建模:识别文本数据中的模式

    通常,文档被分组为主题,主题建模是一种识别文本中与特定主题相对应的模式的技术。换句话说,主题建模用于揭示给定文档集中的抽象主题或隐藏结构。
    您可以在以下场景中使用主题建模 -

    文本分类

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

    推荐系统

    我们可以通过使用相似性度量来构建推荐系统。
  • 主题建模算法

    我们可以使用以下算法来实现主题建模 -
    Latent Dirichlet Allocation(LDA)− 它是最流行的算法之一,它使用概率图模型来实现主题建模。
    Latent Semantic Analysis(LDA) or Latent Semantic Indexing(LSI)− 它基于线性代数,并在文档术语矩阵上使用 SVD(奇异值分解)的概念。
    Non-Negative Matrix Factorization (NMF)− 它也像 LDA 一样基于线性代数。
    上述算法将具有以下元素 -
    • 主题数:参数
    • 文档字矩阵:输入
    • WTM (Word Topic Matrix) & TDM (Topic Document Matrix): 输出