训练word2vec模型时碰到的两个问题:AttributeError和 UnicodeDecodeError,即属性错误和编码问题

一、编码问题
1.报错:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xd7 in position 1
2. 错误的源码

在这里插# -*- coding: utf8 -*-

def write_review(review, stop_words_address, stop_address, no_stop_address):
    """写出处理好的数据"""
    no_stop_review = remove_stop_words(review, stop_words_address)
    with open(no_stop_address, 'a') as f:
        for row in no_stop_review:
            f.write(row[-1])
            f.write("\n")
    f.close()


if __name__ == '__main__':
    segment_text = cut_words('audito_whole.csv')
    review_text = remove_punctuation(segment_text)
    write_review(review_text, 'stop_words.txt', 'no_stop.txt', 'stop.txt')

    # 模型训练主程序
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    sentences_1 = word2vec.LineSentence('no_stop.txt')
    model_1 = word2vec.Word2Vec(sentences_1)

    # model.wv.save_word2vec_format('test_01.model.txt', 'test_01.vocab.txt', binary=False)  # 保存模型,后面可直接调用
    # model = word2vec.Word2Vec.load("test_01.model")  # 调用模型

    # 计算某个词的相关词列表
    a_1 = model_1.wv.most_similar(u"空间", topn=20)
    print(a_1)

    # 计算两个词的相关度
    b_1 = model_1.wv.similarity(u"空间", u"后座")
    print(b_1)

入代码片

3.报错解析:这个错误的意思是,在进行解码时,无法解析编码为0xd7的字符。这是由于在保存文本时没有指明编码方式,导致文本保存时可能使用的时gbk编码。
4.解决办法
①在写出数据时,指出编码格式为utf-8,如下图

def write_review(review, stop_words_address, stop_address, no_stop_address):
    """写出处理好的数据"""
    with open(stop_address, 'a', encoding='utf-8') as f:
        for row in review:
            f.write(row[-1])
            f.write("\n")
    f.close()

    no_stop_review = remove_stop_words(review, stop_words_address)
    with open(no_stop_address, 'a', encoding='utf-8') as f:
        for row in no_stop_review:
            f.write(row[-1])
            f.write("\n")
    f.close()

②对gbk编码的文件做一次转换,如下:

a = []
with open('../new_seg_data/test.txt', encoding='gbk') as f:
    for line in f:
        a.append(line)
f.close()

with open('../new_seg_data/test.txt', 'a', encoding='utf8') as f:
    for line in a:
        f.write(line)
        f.write('\n')
f.close()

5.拓展——为什么会发生这种错误?
首先,我们点击报错的源码文件,如下图:请添加图片描述
打开utils,我们找到如下代码
训练word2vec模型时碰到的两个问题:AttributeError和 UnicodeDecodeError,即属性错误和编码问题_第1张图片
可以看出,word2vec设置的编码格式为utf-8,如果解码时不是utf-8将会触发errors=‘strict’,进而报错UnicodeDecodeError。
另外,如果不懂python的解码和编码,可以查看这篇文章,写的挺清楚的:https://finthon.com/python-encode-decode/

二、属性错误
1.报错:AttributeError: ‘Word2Vec’ object has no attribute ‘most_similar’
2. 错误的源码

 # 模型训练主程序
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    sentences_1 = word2vec.LineSentence('no_stop.txt')
    model_1 = word2vec.Word2Vec(sentences_1)

    # model.wv.save_word2vec_format('test_01.model.txt', 'test_01.vocab.txt', binary=False)  # 保存模型,后面可直接调用
    # model = word2vec.Word2Vec.load("test_01.model")  # 调用模型

    # 计算某个词的相关词列表
    a_1 = model_1.most_similar(u"空间", topn=20)
    print(a_1)

****3.报错解析:****报错说的是属性错误,这是因为在新的word2vec中更新了源代码结构,见官网说明如下:
训练word2vec模型时碰到的两个问题:AttributeError和 UnicodeDecodeError,即属性错误和编码问题_第2张图片
意思是训练好的词向量存储在一个KeyedVectors实例中,这个实例可以是model.wv,方法most_simlar时对象model.wv的方法,而不是以前直接是对象model的方法。

**4.解决办法:**更换调用的对象,如下:

 # 模型训练主程序
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    sentences_1 = word2vec.LineSentence('no_stop.txt')
    model_1 = word2vec.Word2Vec(sentences_1)

    # model.wv.save_word2vec_format('test_01.model.txt', 'test_01.vocab.txt', binary=False)  # 保存模型,后面可直接调用
    # model = word2vec.Word2Vec.load("test_01.model")  # 调用模型

    # 计算某个词的相关词列表
    a_1 = model_1.wv.most_similar(u"空间", topn=20)
    print(a_1)

5.拓展具体为什么是 model_1.wv.most_similar(),我没有在word2vec中找到关于wv定义的语句,有哪位大佬知道吗?

以上均为个人观点,有不对的地方敬请指出,版权所有,转载请注明出处。

你可能感兴趣的:(pycharm,python)