gensim #2 迭代计算

关于文档转向量、计算相似度这些算法,许多经典的库中都有,比如sklearn就可以实现#1中的整个流程。

gensim的优势在于2点:

  1. 所有向量使用稀疏表示,占用内存小得多。
  2. 支持结合Python的迭代计算,内存友好。

下面展示如何迭代完成#1中的过程:

// 假设数据来自MongoDB
// 有一个库db_name,内有集合collection_name,每个文档都有一个字段doc,表示文字字符串
import gensim
from pymongo import MongoClient

connection = MongoClient()
collection = connection.db_name.collection_name

# mongoDB原生支持迭代查询,对Python很友好
# cursor = collection.find()

dictionary = gensim.corpora.Dictionary(doc.get('doc').split() for doc in collection.find())

# 创建一个生成器
def iter_vectors():
    for doc in collection.find():
        yield dictionary.doc2bow(doc.get('doc'))

model_tfidf = gensim.models.TfidfModel(iter_vectors(), id2word=dictionary)

index_tmp_file = '/tmp/gensim/test'
index = gensim.similarities.Similarity(
    index_tmp_file,
    model_tfidf[iter_vectors()],
    num_features=len(dictionary)
)

for similarity in index:
  # 这里输出#1中相似度矩阵的每一行
  print(similarity)

整个过程中,始终只有一条来源数据在内存中。这样无论来源数据有多少,都不会爆内存。

你可能感兴趣的:(gensim #2 迭代计算)