【问题标题】:save results of word2vec model query in a csv file?将 word2vec 模型查询的结果保存在 csv 文件中?
【发布时间】:2020-07-30 17:51:14
【问题描述】:

我正在语料库上训练 word2vec 模型,然后查询该模型。

这工作正常,但我正在运行一个实验,需要为不同的条件调用模型,为每个条件保存模型,为每个条件查询模型,然后将查询的输出保存到 csv 文件中,比如说,为了进一步分析所有条件。

我研究了 gensim 文档并四处搜索,但不知道该怎么做。

我问了 gensim 的人,他们说因为“most_similar”的结果是一个 python 对象,所以我可以用 pickle 保存它,或者保存为 txt、csv,无论我想要什么格式。

听起来不错,但我不知道如何开始。这是我的代码 - 你能帮我“填空”吗?即使是一些简单的东西,我可以进一步研究并自行扩展?

#train the model
trained_model = gensim.models.Word2Vec(some hyperparamters)

#save the model in the format that is appropriate for querying by writing it to disk and call it stored_model
trained_model.save(some_filename)

#read in the stored model from disk and call it retrieved_model
retrieved_model = gensim.models.Word2Vec.load(some_filename)

#query the retrieved model
#each of these queries produces a tuple of 10 'word', cosine similarity pairs
retrieved_model.wv.most_similar(positive=['smartthings', 'amazon'], negative=['samsung'])
retrieved_model.wv.most_similar(positive=['light', 'nest'], negative=['hue'])
retrieved_model.wv.most_similar(positive=['shopping', 'new_york_times'], negative=['ebay'])
.
.
.
#store the results of all these queries in a csv so they can be analyzed.
?

【问题讨论】:

  • 你能提供一个例子来说明你的 csv 应该是什么样子吗? most_similar 返回一个元组列表,类似于[('friend', 0.50342288), ...]。您是否希望每个查询都有一个 csv(有两列;“单词”和“余弦相似度”),还是希望所有查询都使用一个 csv?至于保存模型,您可以使用trained_model.save(some_filename) 并使用retrieved_model = gensim.models.Word2Vec.load(some_filename) 重新加载。
  • @WhoIsJack,每个查询的 csv 都有两个列,如“word”和“cosinesimilarity”,可以用来描述它是哪个查询,但更好的是所有查询都只有一个 csv查询,以便每个主要列代表一个带有该查询标题的查询,然后是每个查询下的两个子列,其中包含“word”和“cos sim”列。所以,在完美的世界里,一张桌子。

标签: python csv word2vec gensim


【解决方案1】:

正如我在评论中提到的,您可以像这样保存和加载模型对象:

# Save model
filename = 'stored_model.wv' # Can be any arbitrary filename
trained_model.save(filename) 

# Reload model
retrieved_model = gensim.models.Word2Vec.load(filename)

对于检索多个查询,我建议定义一个查询列表并对其进行迭代以检索所有结果。

# Define queries (this is the only user input required!)
my_queries = [{'positive' : ['smartthings','amazon'],
               'negative' : ['samsung']},
              {'positive' : ['light','nest'],
               'negative' : ['hue']},
               #<and so forth...>
              ]

# Initialize empty result list
query_results = []

# Collect query results
for query in my_queries:
    result = retrieved_model.wv.most_similar(**query)
    query_results.append(result)

最后,您可以使用结果列表以您想要的格式写入 csv 文件。可以构造文件头来表示查询。

# Open the file
with open("my_results.csv", "w") as outfile:

    # Construct the header
    header = []
    for query in my_queries:
        head = 'pos:'+'+'.join(query['positive'])+'__neg:'+'+'.join(query['negative']) 
        # First resulting head: 'pos:smartthings+amazon__neg:samsung'
        header.append(head)

    # Write the header
    # Note the additional empty fields (,_,) because each head needs two columns
    outfile.write(",_,".join(header)+",_\n")

    # Write the second row to label the columns
    outfile.write(",".join(["word,cos_sim" for i in range(len(header))])+'\n')

    # Write the data
    for i in range(len(query_results[0])):
        row_results = [r[0]+','+str(r[1]) for r in query_results[i]]
        outfile.write(",".join(row_results)+'\n')

请注意,这仅适用于每个查询检索相同数量的项目(默认情况下是这种情况,但可以使用 most_similartopn 关键字参数进行更改)。

【讨论】:

    【解决方案2】:

    一个简单的方法可以写成如下:

    vocab, vectors = model.wv.vocab, model.wv.vectors
    
    # get node name and embedding vector index.
    name_index = np.array([(v[0], v[1].index) for v in vocab.items()])
    
    # init dataframe using embedding vectors and set index as node name
    df =  pd.DataFrame(vectors[name_index[:,1].astype(int)])
    df.index = name_index[:, 0]
    df.to_csv("embedding.csv")
    

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 2014-02-20
      • 1970-01-01
      • 2011-08-29
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多