📜  Gensim-创建字典

📅  最后修改于: 2020-10-16 02:23:26             🧑  作者: Mango


在我们讨论向量和模型的上一章中,您对字典有了一个了解。在这里,我们将更详细地讨论Dictionary对象。

什么是字典?

在深入研究字典的概念之前,让我们了解一些简单的NLP概念-

  • 令牌-令牌表示“单词”。

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

  • 语料库-它指的是文档集合,称为单词袋(BoW)。

对于所有文档,语料库始终包含每个单词的令牌的ID及其在文档中的频率计数。

让我们转到Gensim中的字典概念。为了处理文本文档,Gensim还要求将单词(即标记)转换为它们的唯一ID。为了实现这一点,它为我们提供了Dictionary对象的便利,该对象将每个单词映射到其唯一的整数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,Second和Third.txt)并生成已处理的单词标记列表。

让我们定义一个名为Read_files的类,具有一个名为__迭代__()的方法,如下所示-

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)

#提供保存字典的路径。