FastText词向量训练、使用及可视化操作【保姆级教程(包含藏文处理方法)】

目录

一、前言

二、FastText词向量训练

2.1 数据输入格式

2.2词向量训练

三、词向量使用


一、前言

        本文是word2vec词向量篇的姊妹篇。fasttext是静态词向量构建方法的一种,本文将介绍fasttext词向量是如何训练的,以及我们训练好的fasttext词向量如何使用,最后介绍了可视化fasttext词向量,即通过可视化图来查看训练的fasttext质量,本文为保姆级教程,会将数据输入格式等细节一并讲清楚。在开始本文前,首先说下本文使用的gensim版本为3.8.3(使用gensim的fasttext方法训练词向量),为确保进行本文所有流程,请与本文gensim版本一致,避免发生版本问题!本文也将会介绍藏文fasttext词向量的处理方法!

二、FastText词向量训练

2.1 数据输入格式

        不同算法模型具有不同的数据输入格式要求,本文使用gensim库中更为便捷的函数LineSentence构建fasttext模型的输入数据,需要注意:

        (1)需要将原始语料分词处理。对于中英文,可使用jieba分词;对于藏文,可采用基于音节的分词方法SentencePiece或者以词级别的分词方法;

        (2)需要注意分词后语料的格式。一行存储一个文本。下面举例说明。

这是 第一个 文本(可能有许多句话组成)。
这是 第二个 文本(可能有许多句话组成)。

        上面举例为使用jieba分词后的中文句子,其他语种同理,分词后按照如上格式放置即可。因此在此需要将分词后的文本进行整合,按照如上格式整合为一个分词语料文本

2.2词向量训练

先放代码:

from gensim.models import FastText
from gensim.models.word2vec import LineSentence

model = FastText(
    LineSentence(open('data.txt', 'r', encoding='utf8')),
    size=100,
    window=3,
    min_count=1,
    iter=10,
    min_n=3,
    max_n=6,
    workers=8
    )

# 词向量保存
model.wv.save_word2vec_format('fasttext.vector', binary=False)

# 模型保存
model.save('fasttext_test.model')

        代码中前两行分别导入fasttext模型与处理数据的LineSentence方法,使用LineSentence方法可避免前期构建语料的复杂性。fasttext模型中第一个参数:

LineSentence(open('data.txt', 'r', encoding='utf8'))

        这个参数即为加载数据,只需将通过2.1部分处理的名为data.txt文件更换为你自己的分词语料文件即可。对于fasttext模型中其他参数在本文不进行过多介绍。

        按照如上所示代码即可训练fasttext模型,训练后按照如上代码保存词向量与模型即可,实际操作时更改名字即可。

三、词向量使用

        按照第二部分操作后已经保存了训练好的词向量及模型,下面介绍词向量的使用方法,先放代码:

import gensim

# 通过模型加载词向量(recommend)
model = gensim.models.FastText.load('fasttext_test.model')

dic = model.wv.index2word
# print(dic)

print(model.wv['提供'])

        在此介绍通过模型加载词向量,在工程化的应用中,建议使用该种方法,加载速度快。

        model = gensim.models.FastText.load('fasttext_test.model) 为通过模型加载词向量,在实际使用中更改模型名称即可,dic = model.wv.index2word 为模型词向量对应的词表,在此需要注意,当我们想要获得的词不在fasttext模型的词表中,会发生错误!因此在工程中获取词向量时首先需要判断,如果词不在fasttext模型的词表中需要另做处理。model.wv['提供'] 为获取词“提供”对应的词向量,在实际应用中,model.wv['提供'] 方式最为常用。

        至此词向量的使用方法及注意事项均介绍完毕!

四、词向量可视化

先上代码

from builtins import bytes, range
 
import pandas as pd
pd.options.mode.chained_assignment = None
from sklearn.manifold import TSNE
import gensim
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname="himalaya.ttf",size=20)
 
 
def tsne_plot(model, words_num):
 
    labels = []
    tokens = []
    for word in model.wv.vocab:
        tokens.append(model[word])
        labels.append(word)
 
    tsne_model = TSNE(perplexity=30, n_components=2, init='pca', n_iter=1000, random_state=23)
    new_values = tsne_model.fit_transform(tokens)
    x = []
    y = []
    for value in new_values:
        x.append(value[0])
        y.append(value[1])
    plt.figure(figsize=(10, 10))
    for i in range(words_num):
        plt.scatter(x[i], y[i])
        if b'\xe0' in bytes(labels[i],encoding="utf-8"):
            this_font = font
        else:
            this_font = 'SimHei'
        plt.annotate(labels[i],
                     Fontproperties=this_font,
                     xy=(x[i], y[i]),
                     xytext=(5, 2),
                     textcoords='offset points',
                     ha='right',
                     va='bottom')
    plt.show()
 
if __name__ == '__main__':
    model = gensim.models.FastText.load('fasttext_test.model')
    print(f'There are {len(model.wv.index2word)} words in vocab')
    word_num = int(input('please input how many words you want to plot:'))
    tsne_plot(model, word_num)

        上面代码看着可能比较复杂,实际使用sklearn库中的TSNE方法进行处理,以PCA降维的方式将词向量降为二维从而可以使用二维图绘图。上文中对于藏文及中文在matplotlib图中的显示均考虑,在此展示藏文可视化后的效果。

        上述代码在主函数中为了避免出错,首先输出了fasttext模型词表中共有多少词,然后输入小于等于词表长度的数字即可展示,不仅可以避免大于词表长度时的错误,也可避免词表中的词过多而展示不清楚的情况。

可视化结果如下图:

如有不理解请在留言区交流!  

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带鱼工作室

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值