1. 加载语料库

# 语料库

import jieba
#定义停用词、标点符号
punctuation = [",","。", ":", ";", "?"]
#定义语料
content = ["机器学习带动人工智能飞速的发展。",
"深度学习带动人工智能飞速的发展。",
"机器学习和深度学习带动人工智能飞速的发展。"
]
# 对语料进行分词
segs_1 = [jieba.lcut(con) for con in content]
# print(segs_1)

#去掉停止词
tokenized = []
for sentence in segs_1:
words = []
for word in sentence:
if word not in punctuation:
words.append(word)
tokenized.append(words)
print("\n去除停止词后:",tokenized)

2.词袋

要将文档转换为矢量,我们将使用一种称为bag-of-words的文档表示形式 。在这种表示形式中,每个文档都由一个矢量表示,其中每个矢量元素代表一个问题-答案对,格式为:(词语/ID,num次数),注:问题与ID之间的映射称为字典。

from gensim import corpora
dictionary = corpora.Dictionary(tokenized)

# dictionary.save('deerwester.dict') # 保存字典,以备将来参考
print(dictionary)
print(dictionary.token2id)
# 实际将标记化文档转换为矢量:
new_doc = "人机交互和人工智能带来重大变革"
segs_new = jieba.lcut(new_doc)
print(segs_new)
new_vec = dictionary.doc2bow(segs_new)
print(new_vec)


"""
把原语料的标记化文档全部转换为矢量:
"""
vec = []
for toke in tokenized:
vec.append(dictionary.doc2bow(toke))
print(vec)
corpus = [dictionary.doc2bow(text) for text in tokenized]
corpora.MmCorpus.serialize('deerwester.mm', corpus) #存储到磁盘,供以后使用
print(corpus)

3. 语料流-一次一份文档

以上语料库作为纯Python列表完全位于内存中。在这个简单的示例中,它没什么大不了,但是只是为了使事情变得清楚,我们假设语料库中有数百万个文档。将所有这些都存储在RAM中是行不通的。相反,我们假设文档存储在磁盘上的文件中,每行一个文档。Gensim仅要求语料库一次必须能够返回一个文档向量:

Gensim的全部功能来自这样一个事实,即语料库不必是list,或NumPy数组,Pandas数据框等。Gensim接受任何在迭代时依次产生document的对象。

from smart_open import open  # for transparently opening remote files

"""
每个文档在一个文件中只占一行的假设并不重要;您可以模制__iter__函数以适合您的输入格式,
无论它是什么。遍历目录,解析XML,访问网络…只需解析您的输入以获取每个文档中标记的干净列表,
然后通过字典将标记转换为其ID,并在__iter__内生成所得的稀疏向量。
"""

class MyCorpus:
def __init__(self):
self.data = ["机器学习带动人工智能飞速的发展。","深度学习带动人工智能飞速的发展。","机器学习和深度学习带动人工智能飞速的发展。"]
def __iter__(self):
for text in self.data:
#假设每行有一个文档,用空格分隔标记
yield dictionary.doc2bow(jieba.lcut(text))

corpus_memory_friendly = MyCorpus() # 不会将语料库加载到内存中!
print(corpus_memory_friendly)


"""
语料库现在是一个对象。我们没有定义任何打印方式,因此print仅输出内存中对象的地址。
不是很有用。要查看组成向量,让我们遍历语料库并打印每个文档向量(一次一个):
"""
for vector in corpus_memory_friendly: # load one vector into memory at a time
print(vector)

4. 语料库格式

存在几种用于将向量空间语料库(向量序列)序列化到磁盘的文件格式。 Gensim通过前面提到的流式语料库接口实现它们:以惰性方式从磁盘读取文档(或将其存储到磁盘),一次仅一个文档,而整个语料库不会一次读入主存储器。

4.1 Market Matrix 格式保存语料库

corpus = [[(1, 0.5)], []]  # 将一个文档设置为空

corpora.MmCorpus.serialize('corpus.mm', corpus)


# 相反,要从Matrix Market文件加载语料库迭代器,请执行以下操作:

corpus = corpora.MmCorpus('corpus.mm')
print(corpus)#语料库对象是流

print(list(corpus))

for doc in corpus:
print(doc)

其它格式保存:

## 其它格式
corpora.SvmLightCorpus.serialize('corpus.svmlight', corpus)
corpora.BleiCorpus.serialize('corpus.lda-c', corpus)
corpora.LowCorpus.serialize('corpus.low', corpus)

5. numpy与gensim的转换

import gensim
import numpy as np
numpy_matrix = np.random.randint(10, size=[5, 2])
print(numpy_matrix)
corpus = gensim.matutils.Dense2Corpus(numpy_matrix)
print(corpus)#一个可迭代对象
print(list(corpus))
numpy_matrix = gensim.matutils.corpus2dense(corpus, num_terms=7)#假如需要七个语料库特征数
print(numpy_matrix)

6.稀疏矩阵和gensim

import scipy
scipy_sparse_matrix = scipy.sparse.rand(4,4,density=0.5,dtype=None)
print(scipy_sparse_matrix)


corpus = gensim.matutils.Sparse2Corpus(scipy_sparse_matrix)
print(list(corpus))


scipy_csc_matrix = gensim.matutils.corpus2csc(corpus)
print(scipy_csc_matrix)