关于#word2vec#出现”cannot unpack non-iterable float object“的问题,如何解决?

在运行关于word2vec时出现了 ”cannot unpack non-iterable float object“,此问题在单独运行测试word2vec不会出现,但是当用“Word2vec查找词向量”作为一个函数时会报错。

img

img

这段代码看起来是一个函数,作用是将输入的 token 使用 word2vec 模型替换为相似度最高的单词。具体来说,它首先调用 word2vec 模型的 most_similar() 函数获取与输入 token 最相似的 10 个单词。然后它遍历这 10 个单词,找到其中一个不在停用词列表中的单词作为替换结果。如果找不到这样的单词,则替换失败。最后,它返回替换后的结果和相似度分数。

这段代码中可能会出现 "cannot unpack non-iterable float object" 错误的原因可能是在使用 word2vec 模型的 most_similar() 函数时没有获取到返回的结果。你可以尝试增加一些代码来检查函数的返回结果是否是一个合法的列表。

import gensim
import jieba
import jieba.analyse

# 加载停用词表
def load_stopwords(stopwords_path):
    stopwords = set()
    with open(stopwords_path, 'r', encoding='utf-8') as f:
        for line in f:
            stopwords.add(line.strip())
    return stopwords

# 加载Word2Vec模型
def load_word2vec_model(model_path):
    model = gensim.models.Word2Vec.load(model_path)
    return model

# 分词并去除停用词
def seg_and_remove_stopwords(sentence, stopwords):
    words = jieba.lcut(sentence)
    result = []
    for word in words:
        if word not in stopwords:
            result.append(word)
    return result

# 将句子转换为向量
def sentence2vec(sentence, model, stopwords):
    words = seg_and_remove_stopwords(sentence, stopwords)
    vec = None
    for word in words:
        if vec is None:
            vec = model.wv[word]
        else:
            vec = vec + model.wv[word]
    return vec / len(words)

# 计算两个向量之间的相似度
def calculate_similarity(vec1, vec2):
    result = vec1.dot(vec2) / (vec1.norm() * vec2.norm())
    return result

# 使用Word2Vec替换token
def replace_with_word2vec(token, model, stopwords):
    results = model.most_similar(token, topn=10)
    tagList = stopwords
    re_token = ""
    re_score = 0
    for item in results:
        if item[0] in tagList:
            re_token = item[0]
            re_score = item[1]
            break
    if re_token == "":
        print("Word2Vec替换失败")
    else:
        print("Word2Vec替换结果:", re_token)
    return re_token, re_score

你需要根据你的具体需求调用上述函数完成你的任务。