Gensim - 建立詞典



在上一章討論向量和模型時,您對詞典有了一定的瞭解。在這裡,我們將更詳細地討論詞典物件。

什麼是詞典?

在深入探討詞典的概念之前,讓我們瞭解一些簡單的 NLP 概念:

  • 詞元 - 詞元表示一個“詞”。

  • 文件 - 文件指的是句子或段落。

  • 語料庫 - 它指的是作為詞袋 (BoW) 的文件集合。

對於所有文件,語料庫始終包含每個單詞的詞元 ID 以及它在文件中的頻率計數。

讓我們轉向 Gensim 中詞典的概念。為了處理文字文件,Gensim 也需要將單詞(即詞元)轉換為它們的唯一 ID。為了實現這一點,它為我們提供了詞典物件的功能,該物件將每個單詞對映到其唯一的整數 ID。它透過將輸入文字轉換為單詞列表,然後將其傳遞給corpora.Dictionary()物件來實現這一點。

詞典的必要性

現在的問題是,詞典物件實際上有什麼用,它可以在哪裡使用?在 Gensim 中,詞典物件用於建立詞袋 (BoW) 語料庫,該語料庫進一步用作主題建模和其他模型的輸入。

文字輸入的形式

我們可以向 Gensim 提供三種不同的文字輸入形式:

  • 作為儲存在 Python 原生列表物件中的句子(在 Python 3 中稱為str

  • 作為一個單一的文字檔案(可以是小檔案或大檔案)

  • 多個文字檔案

使用 Gensim 建立詞典

如前所述,在 Gensim 中,詞典包含所有單詞(即詞元)與其唯一整數 ID 的對映。我們可以從句子列表、一個或多個文字檔案(包含多行文字的文字檔案)建立詞典。因此,首先讓我們從建立使用句子列表的詞典開始。

從句子列表建立

在下面的示例中,我們將從句子列表建立詞典。當我們有句子列表或可以說是多個句子時,我們必須將每個句子轉換為單詞列表,而列表推導式是一種非常常見的方法。

實現示例

首先,匯入所需的包,如下所示:

import gensim
from gensim import corpora
from pprint import pprint

接下來,從句子/文件列表建立列表推導式以用於建立詞典:

doc = [
   "CNTK formerly known as Computational Network Toolkit",
   "is a free easy-to-use open-source commercial-grade toolkit",
   "that enable us to train deep learning algorithms to learn like the human brain."
]

接下來,我們需要將句子拆分為單詞。這稱為分詞。

text_tokens = [[text for text in doc.split()] for doc in doc]

現在,藉助以下指令碼,我們可以建立詞典:

dict_LoS = corpora.Dictionary(text_tokens)

現在讓我們獲取更多資訊,例如詞典中的詞元數量:

print(dict_LoS)

輸出

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

我們還可以檢視單詞到唯一整數的對映,如下所示:

print(dict_LoS.token2id)

輸出

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9,
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14,
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 'learning': 20,
   'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

完整的實現示例

import gensim
from gensim import corpora
from pprint import pprint
doc = [
   "CNTK formerly known as Computational Network Toolkit",
   "is a free easy-to-use open-source commercial-grade toolkit",
   "that enable us to train deep learning algorithms to learn like the human brain."
]
text_tokens = [[text for text in doc.split()] for doc in doc]
dict_LoS = corpora.Dictionary(text_tokens)
print(dict_LoS.token2id)

從單個文字檔案建立

在下面的示例中,我們將從單個文字檔案建立詞典。以類似的方式,我們也可以從多個文字檔案(即檔案目錄)建立詞典。

為此,我們將前一個示例中使用的文件儲存在名為doc.txt的文字檔案中。Gensim 將逐行讀取檔案,並使用simple_preprocess一次處理一行。這樣,它不需要一次將整個檔案載入到記憶體中。

實現示例

首先,匯入所需的包,如下所示:

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os

接下來的程式碼行將使用名為 doc.txt 的單個文字檔案建立 Gensim 詞典:

dict_STF = corpora.Dictionary(
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
)

現在讓我們獲取更多資訊,例如詞典中的詞元數量:

print(dict_STF)

輸出

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

我們還可以檢視單詞到唯一整數的對映,如下所示:

print(dict_STF.token2id)

輸出

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9, 
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14, 
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 
   'learning': 20, 'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

完整的實現示例

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os
dict_STF = corpora.Dictionary(
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
)
dict_STF = corpora.Dictionary(text_tokens)
print(dict_STF.token2id)

從多個文字檔案建立

現在讓我們從多個檔案(即儲存在同一目錄中的多個文字檔案)建立詞典。對於此示例,我們建立了三個不同的文字檔案,分別名為first.txt、second.txtthird.txt,它們包含我們之前示例中使用的文字檔案 (doc.txt) 的三行。這三個文字檔案都儲存在名為ABC的目錄下。

實現示例

為了實現這一點,我們需要定義一個類,其中包含一個方法,該方法可以迭代目錄 (ABC) 中的所有三個文字檔案 (First.txt、Second.txt 和 Third.txt),並生成已處理的單詞詞元列表。

讓我們定義一個名為Read_files的類,它具有一個名為__iteration__()的方法,如下所示:

class Read_files(object):
   def __init__(self, directoryname):
      elf.directoryname = directoryname
   def __iter__(self):
      for fname in os.listdir(self.directoryname):
         for line in open(os.path.join(self.directoryname, fname), encoding='latin'):
   yield simple_preprocess(line)

接下來,我們需要提供目錄的路徑,如下所示:

path = "ABC"

#請根據您儲存目錄的計算機系統提供路徑.

接下來的步驟與我們之前的示例類似。接下來的程式碼行將使用包含三個文字檔案的目錄建立 Gensim 詞典:

dict_MUL = corpora.Dictionary(Read_files(path))

輸出

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

現在我們還可以檢視單詞到唯一整數的對映,如下所示:

print(dict_MUL.token2id)

輸出

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9, 
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14, 
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 
   'learning': 20, 'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

儲存和載入 Gensim 詞典

Gensim 支援使用其自己的原生save()方法將詞典儲存到磁碟,並使用load()方法從磁碟載入詞典。

例如,我們可以使用以下指令碼儲存詞典:

Gensim.corpora.dictionary.save(filename)

#請提供您要儲存詞典的路徑.

同樣,我們可以使用 load() 方法載入儲存的詞典。以下指令碼可以做到這一點:

Gensim.corpora.dictionary.load(filename)

#請提供您儲存詞典的路徑。

廣告
© . All rights reserved.