Índice
1.1, estrutura de rede FastText
1.2. Classificação de texto baseada em fastText
2. vetor de palavras de treinamento word2vec e seu uso
2.1. Use jieba para segmentar o corpus
2.2. Use a classe LineSentence para ler arquivos
2.3. Treinamento de vetores de palavras
2.5. Visualização de vetores de palavras
3.2. Construção da matriz de peso do vetor de palavras
1、FastText
FastText é um método típico de representação vetorial de palavras de aprendizado profundo. É muito simples mapear palavras para um espaço denso por meio da camada de incorporação e, em seguida, fazer a média de todas as palavras na frase no espaço de incorporação para concluir a operação de classificação.
1.1, estrutura de rede FastText
#FastText网络结构
from keras.models import Sequential
from keras.layers import Embedding
from keras.layers import GlobalAveragePooling1D
from keras.layers import Dense
import faxt
vocab_size = 2000
embedding_dim = 100
max_word = 500
class_num = 5
def build_fastText():
model = Sequential()
model.add(Embedding(vocab_size,embedding_dim,input_length = max_word))
model.add(GlobalAveragePooling1D())
model.add(Dense(class_num,activation = 'softmax'))
model.compile(loss='categorical_crossentropy', optimizer='SGD',metrics = ['accuracy'])
return model
if __name__ == '__main__':
model = build_fastText()
print(model.summary())
Modelo: "sequential_1" _________________________________________________________________ Camada (tipo) Parâmetro de forma de saída # ==================================================== =============== incorporação_1 (Incorporação) (Nenhuma, 500, 100) 200000 global_average_pooling1d_1 (Nenhum, 100) 0 (GlobalAveragePooling1D) denso_1 (Denso) (Nenhum, 5) 505 ==================================================== =============== Parâmetros totais: 200.505 Parâmetros treináveis: 200.505 Parâmetros não treináveis: 0 _________________________________________________________________ Nenhum
1.2. Classificação de texto baseada em fastText
#基于fastText的文本分类
import pandas as pd
from sklearn.metrics import f1_score
import fasttext.FastText
train_df = pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t', nrows=15000)
train_df['label_ft'] = '__label__' + train_df['label'].astype(str)
train_df[['text', 'label_ft']].iloc[:-5000].to_csv('train.csv', index=None, header=None, sep='\t')
model = fasttext.train_supervised('train.csv', lr=1.0, wordNgrams=2,
verbose=2, minCount=2, epoch=25, loss="hs")
val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]
val_pred
print(f1_score(train_df['label'].values[-5000:].astype(str), val_pred, average='macro'))
0.82
fasttext(3)--Documentação da API e Descrição dos Parâmetros_ouprince's Blog-CSDN Blog
2. vetor de palavras de treinamento word2vec e seu uso
Use a biblioteca gensim para implementar word2vec para construir um modelo de vetor de palavras.
- Use jieba para segmentar o conjunto de dados do corpus, e o corpus após a segmentação de palavras ser processado no formato de armazenamento de um texto por linha. De acordo com o formato acima, ele é integrado a um corpus de texto de segmentação de palavras.
- Leia frases com a função LineSentence fornecida por keras .
- Use a classe gensim.models.word2vec.Word2Vec para treinar vetores de palavras.
- class gensim.models.word2vec.Word2Vec(sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg =0, hs=0, negativo=5, cbow_mean=1, hashfxn=<hash de função incorporada>, iter=5, null_word=0, trim_rule=Nenhum, sorted_vocab=1, batch_words=10000)
Material de texto:
Se houver vida após a morte, seja uma árvore e permaneça para sempre.
Não há postura de alegria e tristeza, metade da qual é pacífica na poeira, metade da qual voa ao vento, metade da
qual está na sombra e metade da qual é banhada pelo sol.
Muito calado, muito orgulhoso.
Nunca confie, nunca busque.
2.1. Use jieba para segmentar o corpus
from gensim.models.word2vec import Word2Vec
from gensim.models import word2vec
import jieba
file= 'poem.txt'
# 先用jieba对中文语料分词
f1= open(file, 'r', encoding='UTF-8')
f2 = f1.read()
f3 = jieba.cut(f2)
f5 = open('poem1.txt', 'w', encoding='UTF-8')
f5.write(' '.join(f3))
2.2. Use a classe LineSentence para ler arquivos
# 使用word2vec提供的LineSentence类来读文件
f4= word2vec.LineSentence('poem1.txt') #LineSentence把文本按换行分成句子
# LineSentence:
for i in f4:
print(i)
'''['如果', '有来生', ',', '要', '做', '一棵树', ',', '站成', '永恒', '。']
['没有', '悲欢', '的', '姿势', ',', '一半', '在', '尘土', '里', '安详', ',', '一半', '在', '风里', '飞扬', ';']
['一半', '洒落', '荫凉', ',', '一半', '沐浴', '阳光', '。']
['非常', '沉默', '、', '非常', '骄傲', '。']
['从不', '依靠', '、', '从不', '寻找', '。']'''
2.3. Treinamento de vetores de palavras
#构建词向量模型
w2v_model = Word2Vec(f4, vector_size=10 , window=2, min_count=0)
#模型存放与加载
w2v_model.save('w2v.model')
# 保存词向量
model.wv.save_word2vec_format('poem.vector', binary=False)
2.4, o uso da palavra vetor
- Carregue vetores de palavras através do modelo.Em aplicações de engenharia, é recomendado usar este método, e a velocidade de carregamento é rápida.
model = gensim.models.Word2Vec.load('test.model') é para carregar a word vector através do model, basta alterar o nome do model em uso real
- Use o vetor de palavras salvo para carregar, o que não é recomendado em engenharia, e a velocidade de carregamento é lenta.
vector = gensim.models.KeyedVectors.load_word2vec_format('data.vector') carrega a palavra vetor usando a palavra vetor salva, apenas mude o nome do arquivo em uso atual. vector['very'] para obter vetores de palavras para este método.
#1 通过模型加载
w2v_model = Word2Vec.load('w2v,model')
#模型词向量对应的词表dic
dic = w2v_model.wv.index2word
print(dic)
print(len(dic))
'''想要获得的词不在word2vec模型的词表中,会发生错误,获取词向量时先判断,如果词不在word2vec模型的词表中需要另做处理'''
print(w2v_model.wv['非常'])#获取词“非常”对应的词向量
print(w2v_model.most_similar('非常', topn=10))#获取词“非常”最相似的10个词
#计算两个词的相似度
w2v_model.wv.similarity('如果', '要')
# 找出最相似的前n个词
w2v_model.wv.similar_by_word('非常',topn = 10)
#找出类别不同的词
print( w2v_model.wv.doesnt_match(u"有来生 化为 的 沐浴".split()))
#size
w2v_model.layer1_size
#获取model中的词:
w2v_model.wv.key_to_index.keys()
# 2 通过词向量加载
vector = gensim.models.KeyedVectors.load_word2vec_format('data.vector')
print(vector['提供'])
2.5. Visualização de vetores de palavras
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.Word2Vec.load('w2v.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)
3、TextCNN
TextoCNN:
- Construa um modelo de vetor de palavras através do word2vec
- Usando redes neurais para realizar classificação de texto com base em vetores de palavras
A camada de incorporação da Rede Neural pode ser usada para carregar o modelo de incorporação de palavras treinadas: use o vetor de palavras aprendido por word2vec como o peso inicial da camada de incorporação de NN , em vez de usar pesos de inicialização aleatórios.
3.1. Importar dados
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split
from collections import Counter
from gensim.models import Word2Vec
import numpy as np
from sklearn import preprocessing
from sklearn.metrics import precision_score, accuracy_score,recall_score,f1_score,roc_auc_score, precision_recall_fscore_support, roc_curve, classification_report
train_data=pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t')
test_data=pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t')
3.2. Construção da matriz de peso do vetor de palavras
from collections import Counter
import pandas as pd
# Vocab 的作用是:
# 1. 创建 词 和 index 对应的字典,这里包括 2 份字典,分别是:_id2word 和 _id2extword
# 其中 _id2word 是从新闻得到的, 把词频小于 5 的词替换为了 UNK。对应到模型输入的 batch_inputs1。
# _id2extword 是从 word2vec.txt 中得到的,有 5976 个词。对应到模型输入的 batch_inputs2。
# 后面有两个 embedding 层,_id2word 对应的 embedding 是可学习的,_id2extword 对应的 embedding 是从文件中加载的,是固定的
# 2.创建 label 和 index 对应的字典
train_data=pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t')
test_data=pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t')
class Vocab():
def __init__(self, train_data):
self.min_count = 5
self.pad = 0
self.unk = 1
self._id2word = ['[PAD]', '[UNK]']#从训练集中得到
self._id2extword = ['[PAD]', '[UNK]']#从导入的词向量中得到
#得到词向量的权重矩阵
def load_pretrained_embs(self, embfilepath):
with open(embfilepath, encoding='utf-8') as f: #打开训练好的词向量文件
lines = f.readlines()
items = lines[0].split()
# 第一行分别是单词数量、词向量维度
word_count, embedding_dim = int(items[0]), int(items[1])
# 下面的代码和 word2vec.txt 的结构有关
for line in lines[1:]:
index = len(self._id2extword)#词向量中单词的数目
embeddings_martix = np.zeros((word_count + index, embedding_dim))
values = line.split()
self._id2extword.append(values[0]) # 首先添加第一列的单词到词典中
vector = np.array(values[1:], dtype='float64') # 后面 100 列的词向量
embeddings_martix[self.unk] += vector
embeddings_martix[index] = vector
index += 1
# unk 的词向量是所有词的平均
embeddings_martix[self.unk] = embeddings_martix[self.unk] / word_count
# 除以标准差
embeddings_martix = embeddings_martix / np.std(embeddings_martix)
reverse = lambda x: dict(zip(x, range(len(x))))
self._extword2id = reverse(self._id2extword)
# assert len(set(self._id2extword)) == len(self._id2extword)
return embeddings_martix
vocab = Vocab(train_data)
Para ser adicionado. . .
Operação de treinamento, uso e visualização de vetores de palavras Word2Vec
genSIM importa parâmetros de vetores de palavras em formato txt_Z-Jeff's Blog-CSDN Blog
[Deep Learning] Texto detalhadoCNN - Know (zhihu.com)
Pontos de conhecimento de PNL: Tokenizer tokenizer - Nuggets (juejin.cn)
(1 条 消息) 自然 语言 处理 常用 标识符 < UNK >, < PAD >, < SOS >, < EOS > 等 _ 呆萌 的 代 MA 博客 博客 -CSDN 博客