目录

1、FastText

1.1、FastText网络结构

1.2、基于fastText的文本分类

2、word2vec训练词向量及使用

2.1、用jieba对语料进行分词处理

2.2、用LineSentence类来读文件

2.3、词向量的训练

2.4、词向量的使用

2.5、词向量可视化

3、TextCNN

3.1、导入数据

3.2、构建词向量权重矩阵


1、FastText

FastText是一种典型的深度学习词向量的表示方法,它非常简单通过Embedding层将单词映射到稠密空间,然后将句子中所有的单词在Embedding空间中进行平均,进而完成分类操作。

1.1、FastText网络结构

#FastText网络结构from keras.models import Sequential
from keras.layers import Embedding
from keras.layers import GlobalAveragePooling1D
from keras.layers import Dense
import faxtvocab_size = 2000
embedding_dim = 100
max_word = 500
class_num = 5def 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 modelif __name__ == '__main__':model = build_fastText()print(model.summary())
Model: "sequential_1"
_________________________________________________________________Layer (type)                Output Shape              Param #
=================================================================embedding_1 (Embedding)     (None, 500, 100)          200000    global_average_pooling1d_1   (None, 100)              0         (GlobalAveragePooling1D)                                        dense_1 (Dense)             (None, 5)                 505       =================================================================
Total params: 200,505
Trainable params: 200,505
Non-trainable params: 0
_________________________________________________________________
None

1.2、基于fastText的文本分类

#基于fastText的文本分类
import pandas as pd
from sklearn.metrics import f1_score
import fasttext.FastTexttrain_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)-- API 文档 & 参数说明_ouprince的博客-CSDN博客

2、word2vec训练词向量及使用

使用gensim库来实现word2vec构建词向量模型。

  1. 用jieba对语料数据集进行分词,分词后的语料按一行存储一个文本的格式处理。按以上格式整合为一个分词语料文本。
  2. 用keras提供的LineSentence函数 读入句子。
  3. 用class gensim.models.word2vec.Word2Vec训练词向量。
  • 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, negative=5, cbow_mean=1, hashfxn=<built-in function hash>, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)

文本素材:

如果有来生,要做一棵树, 站成永恒。 
没有悲欢的姿势, 一半在尘土里安详, 一半在风里飞扬;
 一半洒落荫凉, 一半沐浴阳光。 
非常沉默、非常骄傲。 
从不依靠、从不寻找。

2.1、用jieba对语料进行分词处理

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、用LineSentence类来读文件

# 使用word2vec提供的LineSentence类来读文件
f4=  word2vec.LineSentence('poem1.txt')  #LineSentence把文本按换行分成句子# LineSentence:
for i in f4:print(i)'''['如果', '有来生', ',', '要', '做', '一棵树', ',', '站成', '永恒', '。']
['没有', '悲欢', '的', '姿势', ',', '一半', '在', '尘土', '里', '安详', ',', '一半', '在', '风里', '飞扬', ';']
['一半', '洒落', '荫凉', ',', '一半', '沐浴', '阳光', '。']
['非常', '沉默', '、', '非常', '骄傲', '。']
['从不', '依靠', '、', '从不', '寻找', '。']'''

2.3、词向量的训练

#构建词向量模型
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、词向量的使用

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

model = gensim.models.Word2Vec.load('test.model') 为通过模型加载词向量,在实际使用中更改模型名称即可

  • 使用保存的词向量加载,工程中不推荐,加载速度慢。

vector = gensim.models.KeyedVectors.load_word2vec_format('data.vector')为使用保存的词向量加载词向量,在实际使用中更改文件名称即可。vector['非常'] 为该种方法获取词向量的方法。

#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、词向量可视化

from builtins import bytes, rangeimport 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 = fontelse: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

TextCNN:

  • 通过word2vec构建出词向量模型
  • 利用神经网络在词向量的基础上实现文本分类

Neural Network的embedding layer可用于加载训练好的词嵌入模型:用word2vec学到的词向量作为NN的embedding layer的初始权重,而不是用随机的初始化权重。

3.1、导入数据

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 Word2Vecimport 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_reporttrain_data=pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t')
test_data=pd.read_csv('新建文件夹/天池—新闻文本分类/train_set.csv', sep='\t')  

3.2、构建词向量权重矩阵

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 = 5self.pad = 0self.unk = 1self._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] += vectorembeddings_martix[index] = vectorindex += 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_martixvocab = Vocab(train_data)

待补充。。。

Word2Vec词向量训练、使用及可视化操作

genSIM 导入 txt 格式的词向量参数_Z-Jeff的博客-CSDN博客

【深度学习】详解TextCNN - 知乎 (zhihu.com)

NLP知识点:Tokenizer分词器 - 掘金 (juejin.cn)

(1条消息) 自然语言处理常用标识符<UNK>,<PAD>,<SOS>,<EOS>等_呆萌的代Ma的博客-CSDN博客

【nlp】天池学习赛-新闻文本分类-深度学习1相关推荐

  1. 【nlp】天池学习赛-新闻文本分类-机器学习

    目录 1.读取数据 查看句子长度 2.可视化 2.1.新闻的字数分布 2.2.新闻文本类别统计 3.数据分析 3.1.统计每个字符出现的次数 3.2.统计不同字符在句子中出现的次数 4.文本特征提取 ...

  2. 阿里天池学习赛 新闻文本分类

    当时我的成绩  阿里天池 原始数据  训练的词向量  模型 代码都在下面这两个链接里 一个完整版 一个不完整版 链接:https://pan.baidu.com/s/1I8l-5f0-IlrSPa3a ...

  3. 天池 入门赛-新闻文本分类-单个bert模型分数0.961

    文章目录 一些说明 三.最终代码及解析 3.1 构建分词器 3.2 预训练bert模型 3.3 分类任务微调: 零.分词tokenization 1.2 分词规则 1.3 character-base ...

  4. fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择 作者:机器人圈 / 微信号:ROBO_AI发表时间 :2017-07-28 图:pixabay

    fastText.TextCNN.TextRNN--这里有一套NLP文本分类深度学习方法库供你选择 「机器人圈」编译:嗯~阿童木呀.多啦A亮 这个库的目的是探索用深度学习进行NLP文本分类的方法. 它 ...

  5. 【赠书】阿里云天池大赛赛题解析,深度学习篇!

    ‍‍ 阿里云天池作为国内知名的竞赛平台和AI社区,自诞生以来就一直秉持着让更多人公平获得大数据的理念.也正因此,天池每场经典赛事沉淀的课题和数据集都会永久保留和开放.截至目前,天池平台已举办了超过20 ...

  6. 《阿里云天池大赛赛题解析(深度学习篇)》学习笔记(1)自然语言处理基础

    自然语言处理基础 Natural Language Processing,NLP. 主要任务包括自然语言理解Natural Language Understanding,NLU和自然语言生成Natur ...

  7. 【文本分类】常见文本分类深度学习模型汇总

    在深度学习被广泛用于NLP之前,文本分类任务的常见pipeline为: (1)人工/半自动特征抽取:包括one-hot编码.count features.TF-IDF.词性/句法信息等等 (2)分类器 ...

  8. 《阿里云天池大赛赛题解析(深度学习篇)》学习笔记(4)序列标注实现思路

    参考 https://www.jianshu.com/p/e6b3565e159d https://blog.csdn.net/gdh756462786/article/details/7910866 ...

  9. 《阿里云天池大赛赛题解析(深度学习篇)》学习笔记(3)实体识别深度学习方法

    双向循环神经网络 BiRNN,包括BiLSTM.BiGRU等. BiRNN通常先采用正向与反向两个循环神经网络. 正向负责从前到后计算,反向负责从后向前计算. 将两个网络的输出采用一定方式(直接相加. ...

最新文章

  1. 自动控制理论及matlab,自动控制理论及MATLAB实现
  2. 自动化软件部署的shell脚本
  3. [Web开发] MySpace 发布开发接口
  4. 数据结构-树与二叉树
  5. Flex 4 NativeWindow 中添加Flex组件(问题很多,尚不完善)
  6. jQuery事件之传递参数
  7. java 关于集合的笔试题_Java集合面试题(一)
  8. 修改ftp服务器用户,通过批处理修改FTP账号和密码
  9. plt的纵坐标的百分号显示
  10. java 解析cron_Quartz 源码解析(六) —— 解析Cron表达式
  11. 某宝双十一自动养猫,解放你的双手得喵币
  12. 015 Django 云笔记项目(可以略过)
  13. 新中大软件ngpower6.1单机版安装流程(WIN11)
  14. 统一过程(UP)模型
  15. 懒得刷牙?微型机器人自动帮你搞定,还能牙刷牙线随时变换
  16. 浅析FPC软性线路板补强
  17. HTTP学习笔记(适合初学)
  18. HanLP自然语言处理包开源(包含源码)
  19. 云服务器怎么安装虚拟显卡,云服务器怎么弄图形界面
  20. java公交线路查询系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. 硬件虚拟修改神器——VirtualHardware
  2. [SVN技巧]代码提交中遇到的两个问题及其解决方案
  3. (转)儒学之忠,学以致用
  4. 若依ruoyi框架的使用
  5. 计算机网络基础与应用配伍题,(更新版)国家开放大学电大专科《计算机组网技术》配伍操作题题库及答案.doc...
  6. PostgreSQL异构引擎pg-strom源码解读
  7. 看我们如何“把大象放进冰箱里”
  8. 毕业10年就能拿到百万年薪:00后大学生,为什么这么自信?
  9. dmbj.top(代码笔记) 上线啦
  10. 多vlan实现互访,使用NAT、DHCP、ACL等技术实现公司组网