当前位置: 首页 > 工具软件 > Gensim > 使用案例 >

Gensim核心概念以及使用流程

梅宏盛
2023-12-01

1.Gensim的一些概念

  • 文件:一些文字。
  • 语料库:文件的集合。
  • 向量:文档的数学方便表示。
  • 模型:一种将向量从一种表示转换为另一种表示的算法。

2.加载语料库

# 语料库

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)

3. 添加索引

将语料库中的每个单词与唯一的整数ID相关联。可以使用gensim.corpora.Dictionary 该类来做到这一点。该词典定义了我们处理过程所知道的所有单词的词汇表。

from gensim import corpora
"""
对于较大的语料库,包含成千上万个标记的字典是很常见的。
"""

dictionary = corpora.Dictionary(tokenized)
print(dictionary)

处理的语料库中有9个唯一的词,这意味着在词袋模型下,每个文档将由9维向量表示。
可以使用字典将标记化的文档转换为这些9维向量。我们可以看到这些ID对应于什么:

import pprint

pprint.pprint(dictionary.token2id)

例如,假设要对短语“人机交互带来重大变革”进行矢量化处理(请注意,该短语不在我们的原始语料库中)。
可以使用doc2bow 字典的方法为文档创建词袋表示法,该方法返回单词计数的稀疏表示法:
【注意,由于不在原始语料库中,所以有些词是无法转换的,也就说这个东东完全是依靠语料库的强大,是优点也是缺点】
每个元组中的第一个条目对应于字典中令牌的ID,第二个条目对应于此令牌的计数。

new_doc = "人机交互和人工智能带来重大变革"
segs_new = jieba.lcut(new_doc)
print(segs_new)
new_vec = dictionary.doc2bow(segs_new)
print(new_vec)

3.1 Doc2Bow 将整个原始语料库转换为向量列表

以上Doc2Bow产出的向量列表,可以作为一些分类算法/预测算法的/深度模型的输入数据

bow_corpus = [dictionary.doc2bow(text) for text in tokenized]
pprint.pprint(bow_corpus)

4. tf-idf模型

tf-idf模型将向量从词袋表示转换为向量空间,在该向量空间中,将根据语料库中每个词的相对稀有度对频率计数进行加权。

from gensim import models

# train the model
tfidf = models.TfidfModel(bow_corpus)

# transform the string
new_doc = "人机交互和机器智能、人工智能带来重大变革"
segs_new = jieba.lcut(new_doc)
# 去除停止词:略
print(segs_new)

"""
该tfidf模型再次返回一个元组列表,其中第一个条目是令牌ID,第二个条目是tf-idf权重。
"""
print(dictionary.doc2bow(segs_new))
print(tfidf[dictionary.doc2bow(segs_new)])
"""
要通过TfIdf转换整个语料并对其进行索引,以准备相似性查询:
"""
from gensim import similarities

index = similarities.SparseMatrixSimilarity(tfidf[bow_corpus],num_features=len(dictionary))


"""
查询我们的查询文档query_document与语料库中某个文档的相似性:【一个文档就是一个句子】
"""
query_document =  jieba.lcut("深度算法加速人工智能飞速的发展和应用。")
print(query_document)
query_bow = dictionary.doc2bow(query_document)
sims = index[tfidf[query_bow]]
print(list(enumerate(sims)))

# 按照相似度大小顺序排序
for document_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
    print(document_number, score)

5. 流程化

  • 预处理(分词、去除停止词)
  • 用corpora.Dictionary(tokenized)进行打标记;
  • 用dictionary.doc2bow(segs_new)创建词袋,即向量列表;segs_new是一个句子的分词列表。
  • 训练gensim的TF-Idf模型,使用tfidf[dictionary.doc2bow(segs_new)]转换原语料或者新语料为一个向量列表;segs_new是一个句子的分词列表。
  • 使用similarities.SparseMatrixSimilarity(tfidf[bow_corpus],num_features=len(dictionary))进行打标计,并使用index[tfidf[query_bow]]查找相似度大小,query_bow是dictionary.doc2bow(query_document)的来,而query_document是一个句子的分词列表。
  • 以上的任何一个向量列表都可以用于SVM\KNN、深度模型等模型的训练,当然,分类/预测 模型的效果也取决向量列表的表达程度好坏。
 类似资料: