赞
踩
word2vec生成词向量的可以分为三步:
分词->训练->调用模型
# 数据集是我随便找的一篇小说 import jieba from gensim.models import word2vec # 数据预处理 def load_train_data(filename): # 数据预处理 sentences=[] with open(filename, 'r', encoding='utf-8') as reader: for line in reader: line = line.strip() if len(line) >= 10: sentences.append(line) return sentences # 使用结巴分词 def segment(sentences): words=[] for sentence in sentences: # word=pseg.cut(sentence) # 带分词的词性 word=jieba.cut(sentence) # 只是分词,不带词性,分完词之后,使用一个list装起来 result='' for w in word: result+=' '+w words.append(result) # 读取每一行文本,将所有的文本写 with open('F:\\python\\NLPBase\\data\\test.txt','a',encoding='utf-8') as fw: for result in words: fw.write(result) pass fw.close() return words # 生成word2vec模型,生成词向量 def word2vect(filepath): sentences = word2vec.LineSentence(filepath) model = word2vec.Word2Vec(sentences, hs=1, min_count=1, window=3, vector_size=10) model.save('model') # 保存模型 #====================================== # 加载数据集 sentences=load_train_data('F:\\python\\NLPBase\\data\\dataset.txt') # 分词 words=segment(sentences) #训练 word2vect('F:\\python\\NLPBase\\data\\test.txt') model = word2vec.Word2Vec.load('model') # 加载模型 # 找出一个词向量最近的词集合 for val in model.wv.similar_by_word("南方", topn=10): print(val[0], val[1]) pass
结果:
bert的使用可以简单的分成三步:
加载bert分词器->加载bert模型->分词->将token转为vocabulary索引->训练->生成词向量
注意:这个其中有一个bert数据的加载,如果是从网上下载的文件一般有三份东西,json包,bert预训练模型,语料表,一旦下载过来了这三个文件的名称就不能修改了,不然就会出错。
import torch from pytorch_pretrained_bert import BertModel, BertTokenizer # 注意这个bert的配置文件可以从网上下载,也可以直接加载网上的,我这里是直接加载网上的,如果你下载了这些配置文件到本地,则就直接填写路径就可以了 # 加载bert的分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # 加载bert模型,这个路径文件夹下有bert_config.json配置文件和model.bin模型权重文件 bert = BertModel.from_pretrained('bert-base-uncased') # 分词 s = "I'm not sure, this can work, lol -.-" tokens = tokenizer.tokenize(s) # "i\\'\\m\\not\\sure\\,\\this\\can\\work\\,\\lo\\##l\\-\\.\\-" # 将token转为vocabulary索引 ids = torch.tensor([tokenizer.convert_tokens_to_ids(tokens)]) # 放到bert模型中训练 result = bert(ids, output_all_encoded_layers=True) print(result)
结果
bert和word2vec其实都是生成词向量,区别就是在于,word2vec中的词向量是固定的,他只会把意思相近的词放在相近的位置。
但是这样的做法有点不妥的地方就是,不同的文章中的语意是不一样的。比如:
比如这两句话中的it指代的意思不一样的,所以it与每一个词的关系也不一样。
所以就引入了Transformer中的self-attention机制。使得每个词之间与上下文之间的权重不一样,这样就能更好的表达词语之间的语义信息,这就是bert。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。