📜  Gensim-创建单词袋(BoW)语料库

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


我们已经了解了如何从文档列表和文本文件(一个或多个)创建字典。现在,在本节中,我们将创建一个单词袋(BoW)语料库。为了与Gensim合作,它是我们需要熟悉的最重要的对象之一。基本上,每个文档中包含单词id及其频率的都是语料库。

创建BoW语料库

如前所述,在Gensim中,语料库在每个文档中都包含单词id及其频率。我们可以从简单的文档列表和文本文件创建BoW语料库。我们需要做的是,将单词的标记化列表传递给名为Dictionary.doc2bow()的对象。首先,让我们开始使用简单的文档列表创建BoW语料库。

从简单的句子列表

在下面的示例中,我们将从包含三个句子的简单列表中创建BoW语料库。

首先,我们需要导入所有必要的包,如下所示:

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

现在提供包含句子的列表。我们的清单中有三个句子-

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

接下来,对句子进行标记化,如下所示:

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

创建一个corpora.Dictionary()对象,如下所示:

dictionary = corpora.Dictionary()

现在将这些标记化的句子传递给dictionary.doc2bow()对象,如下所示:

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

最后我们可以打印单词语料袋-

print(BoW_corpus)

输出

[
   [(0, 1), (1, 1), (2, 1), (3, 1)], 
   [(2, 1), (3, 1), (4, 2)], [(0, 2), (3, 3), (5, 2), (6, 1), (7, 2), (8, 1)]
]

上面的输出显示id = 0的单词在第一个文档中出现一次(因为我们在输出中得到(0,1)),依此类推。

以上输出对于人类来说是不可能的。我们也可以将这些id转换为单词,但是为此,我们需要字典进行如下转换-

id_words = [[(dictionary[id], count) for id, count in line] for line in BoW_corpus]
print(id_words)

输出

[
   [('are', 1), ('hello', 1), ('how', 1), ('you', 1)], 
   [('how', 1), ('you', 1), ('do', 2)], 
   [('are', 2), ('you', 3), ('doing', 2), ('hey', 1), ('what', 2), ('yes', 1)]
]

现在,上面的输出以某种方式人类可读。

完整的实施实例

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
print(BoW_corpus)
id_words = [[(dictionary[id], count) for id, count in line] for line in BoW_corpus]
print(id_words)

从文本文件

在下面的示例中,我们将从文本文件创建BoW语料库。为此,我们将上一示例中使用的文档保存在名为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中读取文档并将其标记为-

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

现在我们需要将这些标记化的单词传递到dictionary.doc2bow()对象中(如上例所示)

BoW_corpus = [
   dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized
]
print(BoW_corpus)

输出

[
   [(9, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 1)], 
   [
      (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), 
      (22, 1), (23, 1), (24, 1)
   ], 
   [
      (23, 2), (25, 1), (26, 1), (27, 1), (28, 1), (29, 1), 
      (30, 1), (31, 1), (32, 1), (33, 1), (34, 1), (35, 1), (36, 1)
   ], 
   [(3, 1), (18, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 1)], 
   [
      (18, 1), (27, 1), (31, 2), (32, 1), (38, 1), (41, 1), (43, 1), 
      (44, 1), (45, 1), (46, 1), (47, 1), (48, 1), (49, 1), (50, 1), (51, 1), (52, 1)
   ]
]

doc.txt文件具有以下内容-

CNTK以前称为Computational Network Toolkit,它是一个免费的易于使用的开源商业级工具包,使我们能够训练深度学习算法来像人脑一样学习。

您可以在tutorialspoint.com上找到其免费教程,还免费提供有关AI深度学习机器学习等技术的最佳技术教程。

完整的实施实例

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_tokenized = [
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
print(BoW_corpus)

保存和加载Gensim语料库

我们可以在以下脚本的帮助下保存语料库-

corpora.MmCorpus.serialize(‘/Users/Desktop/BoW_corpus.mm’, bow_corpus)

#提供主体的路径和名称。语料库的名称是BoW_corpus,我们将其保存为Matrix Market格式。

类似地,我们可以使用以下脚本加载保存的语料库:

corpus_load = corpora.MmCorpus(‘/Users/Desktop/BoW_corpus.mm’)
for line in corpus_load:
print(line)