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)

#请提供您保存词典的路径。

广告