Gensim,是一个Python库,用于可拓展语意统计(Scalable statistical semantics),面向语义结构的纯文本文档分析(Analyze plain-text documents for semantic structure),和相似语义文档检索(Retrieve semantically similar documents)。
这里列举在gensim文档特征提取、相似度计算等功能中的基本使用。
1 文档特征提取
主要将文档(document)转化为表现 词(token) 及其 出现次数(count) 的向量(vector)。
一个向量也可以看作一个 1 x NUM(token) 的矩阵,其中填充了count。
- 向量是稀疏表示的
- 词在向量中映射为id。词和id的映射另保存在词典(dictionary)中
- 文档有多个时,需要先生成词典,根据词典将各个文档转为向量。
import gensim
documents = [
'王者荣耀 中 的 李白 李白 是 一个 刺客 英雄',
'王者荣耀 中 的 黄忠 是 一个 射手 英雄',
'英雄联盟 中 的 薇恩 是 一个 射手 英雄',
]
# 文档转化为词的列表
texts = [doc.split() for doc in documents]
# 生成词典
dictionary = gensim.corpora.Dictionary(texts)
# 查看词典的内部映射
print(dictionary.token2id)
# 利用词典生成向量
vectors = [dictionary.doc2bow(text) for text in texts]
# 输出了二维稀疏矩阵
print(vectors)
输出:
{'一个': 0, '中': 1, '刺客': 2, '是': 3, '李白': 4, '王者荣耀': 5, '的': 6, '英雄': 7, '射手': 8, '黄忠': 9, '英雄联盟': 10, '薇恩': 11}
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 2), (5, 1), (6, 1), (7, 1)],
[(0, 1), (1, 1), (3, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)],
[(0, 1), (1, 1), (3, 1), (6, 1), (7, 1), (8, 1), (10, 1), (11, 1)]]
2 TFIDF模型
TF-IDF(term frequency–inverse document frequency)是一种文档特征统计方法。由TF(词频:文档中词出现次数与总次数之比)和IDF(逆文档频率,词在全部文档中出现的文档数的转化)相乘得到。这个结果体现了词汇在文档中的权重,同时又降低了在全部文档中高频出现词汇的权重。
TF
IDF
比如上述例子中,“英雄”、“一个”等词的IDF=0。
# 向量组成矩阵在gensim中称corpus
corpus = vectors
# 生成模型
tfidf_model = gensim.models.TfidfModel(corpus, id2word=dictionary)
# 计算
tfidf_corpus = tfidf_model[corpus]
print(list(tfidf_corpus))
输出:
[[(2, 0.44124367556640004), (4, 0.8824873511328001), (5, 0.16284991207632712)],
[(5, 0.32718457421365993), (8, 0.32718457421365993), (9, 0.8865102981879297)],
[(8, 0.2525147628886298), (10, 0.6841916012796777), (11, 0.6841916012796777)]]
IDF=1的词最终权重为0,不显示在稀疏表示中。
3 相似度计算
文档转化为稀疏特征向量后,文档间相似问题就转化为向量相似度的问题。通常的一种计算方法是余弦距离。
余弦相似度,表现了 物体对相同特征有同等程度的权重 的程度。
余弦距离
# 生成相似度索引
index = gensim.similarities.MatrixSimilarity(tfidf_corpus)
# 相似度计算,得到 NUM(doc) x NUM(doc) 的矩阵
similarties = index[tfidf_corpus]
print(similarties)
输出:
[[0.99999994 0.05328198 0. ]
[0.05328198 1. 0.08261894]
[0. 0.08261894 0.99999994]]
每行代表一个doc和其他doc的相关度。
由于部分相同词的IDF=0,文档1只和文档2相关;
文档2和其他两个都相关,和文档3相关度强一点。这是因为文档1总次数大,和文档2相同的词汇在文档1中词频更低。











网友评论