NLP之词嵌入---(2.1)FastText:训练词向量

目录

一、FastText原理和算法

1.fastText作用

2.fastText优点

3.N-gram

4.Hierarchical Softmax

二、FastText训练词向量

1.从gensim包加载FastText

2.模型超参数

3.模型训练词向量

4.模型的保存和加载

5.词向量的使用

三、更新模型语料库

四、提取FastText模型训练结果


官网:models.fasttext – FastText model — gensim (radimrehurek.com)

一、FastText原理和算法

1.fastText作用

1)训练词向量

2)进行文本分类

2.fastText优点

相比于传统的word2vec,fastText的优点

  • fastText保持高精度的同时,加快了训练精度和测试精度
  • fastText对word embedding的训练更加准确
  • fastText采用两个重要算法:N-gramHierarchical Softmax
  • 使用n-gram的词向量使得Fast-text模型可以很好的解决未登录词(OOV——out-of-vocabulary)的问题
3.N-gram

在word2vec中采取的是CBOW架构,而fastText采用N-gram架构。

N-gram常用的三种:一元(1-gram)、二元(2-gram)、三元(3-gram)

n就是滑动窗口大小 例:“我在成都吃火锅”

        1-gram:["我","在","成","都","吃","火","锅"]

        2-gram:["我在","在成","成都","都吃","吃火","火锅"]

        3-gram:["我在成","在成都","成都吃","都吃火","吃火锅"]

ps:当fastTest用于训练词向量时,n-gram时采取的skip-gram;而且fasttext并没有保存ngram信息,只是hash并用于检索了。

4.Hierarchical Softmax

Hierarchical Softmax(hs)主要是为了减轻计算量。通过哈夫曼树实现,将词向量作为叶子节点,根据词向量建立哈夫曼树。

二、FastText训练词向量

1.从gensim包加载FastText

本实验从gensim包加载FastText:

from gensim.models import FastText
2.模型超参数
model = FastText(min_count=5,vector_size=300,window=7,workers=10,epochs=50,seed=17,sg=1,hs=1)
  • min_count(int,optional):忽略词频小于该值的词
  • size(int,optional):word向量的维度 
  • window(int,optional):一个句子中当前词和被预测单词的最大距离 
  • workers(int,optional):训练模型时使用的线程数 
  • sg({0,1},optional):模型的训练算法 1:skip-gram 0:CBOW 
  • hs({0,1},optional): 1:采用Hierarchical Softmax训练模型 0:使用负采样
3.模型训练词向量
model.build_vocab(jieba_cut_list)
model.train(jieba_cut_list, total_examples=model.corpus_count, epochs=model.epochs)
  • jieba_cut_list:是已经分词好的句子。例如[ ["我","在","成","都","吃","火","锅"],["我在","在成","成都","都吃","吃火","火锅"]]
4.模型的保存和加载
#保存
model.save("./ceshi_fasttext_model_jieba.model")
#加载
model = FastText.load("./ceshi_fasttext_model_jieba.model")
5.词向量的使用

ps:fasttext和word2vec类似 不再赘述

embedding = (model.wv["卷积","神经网络"])
print(embedding)
print(embedding.shape)

[[ 0.00227801 -0.00387814  0.00224288 -0.00488548  0.00748316 -0.01994031
   0.01059218 -0.00755341  0.00369787  0.00486877 -0.01610742 -0.00284252
  -0.00361041  0.01498076 -0.01373026 -0.00912138  0.02075874  0.00217725
   0.00075823 -0.01980595 -0.01588477  0.00566112 -0.00869555 -0.01784998
  -0.00690811 -0.01436063 -0.00855923 -0.00983512  0.00802138 -0.00407105]
 [ 0.00704242 -0.00535574  0.00206528 -0.00332001  0.00821603  0.00378277
   0.00374471 -0.00333902  0.0018149   0.00255797  0.0008302  -0.00475089
   0.00044787  0.01418014 -0.00519747  0.00257629  0.00276021 -0.0068962
  -0.00523948  0.0022739   0.00367826  0.00574936 -0.00668766  0.00037117
  -0.00311675  0.0114288  -0.00077431 -0.00180964 -0.00337033  0.00084218]]
(2, 30)

  • 只能使用已经训练好的词向量,若想要获取的词不在模型中,则加载报错

三、更新模型语料库

步骤:加载已经训练好的模型-->输入新的语料库model.build_vocab(sentence)-->model.train-->model.save

#更新语料库  
from gensim.models import FastText
model = FastText.load("./ceshi_fasttext_model_jieba.model")
model.build_vocab(second_sentences,update=True)
model.train(second_sentences,total_examples=model.corpus_count, epochs=model.epochs)
#调整模型超参数
model.min_count =10
model.save("./ceshi_fasttext_model_jieba.model")

ps:second_sentences 就是新的语料库

四、提取FastText模型训练结果

  • 训练好的fastText模型可以作为卷积网络的embedding层的输入
vocab_list = Word2VecModel.wv.index_to_key
def get_embedding_model(Word2VecModel):
    vocab_list = Word2VecModel.wv.index_to_key
    word_index = {" ": 0}  # 初始化 `[word : token]` ,后期 tokenize 语料库就是用该词典。
    word_vector = {}  # 初始化`[word : vector]`字典

    # 初始化存储所有向量的大矩阵,留意其中多一位(首行),词向量全为 0,用于 padding补零。
    # 行数 为 所有单词数+1 比如 10000+1 ; 列数为 词向量“维度”比如100。
    embeddings_matrix = np.zeros((len(vocab_list) + 1, Word2VecModel.vector_size))

    ## 填充 上述 的字典 和 大矩阵
    for i in range(len(vocab_list)):
        word = vocab_list[i]  # 每个词语
        word_index[word] = i + 1  # 词语:序号
        word_vector[word] = Word2VecModel.wv[word]  # 词语:词向量
        embeddings_matrix[i + 1] = Word2VecModel.wv[word]  # 词向量矩阵

    #这里的 word_vector 不好打印
    return word_index, word_vector, embeddings_matrix

# 序号化 文本,tokenizer句子,并返回每个句子所对应的词语索引
# 这个只能对单个字,对词语切词的时候无法处理
def tokenizer(texts, word_index):
    token_indexs = []
    for word in texts:
        new_txt = []
        new_txt.append(word_index[word])  # 把句子中的 词语转化为index
        token_indexs.append(new_txt)
    return token_indexs

if __name__ == "__main__":
    ## 1 获取gensim的模型
    model = gensim.models.word2vec.Word2Vec.load("./xiaohua_fasttext_model_jieba.model")
    word_index, word_vector, embeddings_matrix = get_embedding_model(model)

    token_indexs = tokenizer(["卷积"],word_index)
    print(token_indexs)

    #下面就是这个的实现,embedding_table
    import tensorflow as tf
    embedding_table = tf.keras.layers.Embedding(input_dim=len(embeddings_matrix),output_dim=300,weights=[embeddings_matrix],trainable=False)

    char = "卷积"
    char_index = word_index[char]

    #下面是一个小测试,分别打印对应词嵌入的前5个值
    print(model.wv.get_vector(char)[:5])
    print((embedding_table(np.array([[char_index]])))[0][0][:5])

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最小编辑距离算法是自然语言处理中一种常用的算法,用于衡量两个字符串之间的相似程度。在自动拼写纠正中,最小编辑距离算法可以帮助我们找到与输入字符串最相似的正确拼写。 最小编辑距离算法主要通过插入、删除、替换三种方式来计算两个字符串之间的编辑距离。编辑距离越小,表示两个字符串越相似。在自动拼写纠正中,我们可以将输入字符串与词典中的每个单词进行比较,并计算它们的最小编辑距离。最后,我们选择与输入字符串编辑距离最小的词作为可能的正确拼写。 举个例子,如果用户输入的单词是"aple",我们可以将其与词典中的每个单词进行比较,并计算它们的编辑距离。假设词典中有单词"apple"、"banana"和"orange",我们可以得到它们与"aple"的编辑距离分别为1、6和6。由于"apple"的编辑距离最小,所以我们可以判断用户可能想要输入的是"apple"。 自然语言处理中的自动拼写纠正利用了最小编辑距离算法的思想,通过计算字符串之间的相似度来进行纠错。这项技术在搜索引擎、智能键盘等场景中广泛应用。通过自动拼写纠正,可以帮助用户更准确地输入文本,提升用户体验和信息检索的效果。 综上所述,最小编辑距离算法是自然语言处理中用于衡量两个字符串相似程度的一种常用算法。在自动拼写纠正中,最小编辑距离算法帮助我们找到与输入字符串最相似的正确拼写,并提升了用户体验和信息搜索的准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值