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(主題文件矩陣):輸出
廣告