作者|Emmanuella Anggi 编译|VK 来源|Towards Data Science

在这篇文章中,我将详细介绍如何使用fastText和GloVe作单词嵌入到LSTM模型上进行文本分类。

我在写关于自然语言生成的论文时对词嵌入产生了兴趣。词嵌入提高了模型的性能。在本文中,我想看看每种方法(有fastText和GloVe以及不使用)对预测的影响。

在我的Github代码中,我还将结果与CNN进行了比较。我在这里使用的数据集来自Kaggle,由tweets组成,标签是表明推特是否是灾难性推特(描述灾难的推特)。说实话,在第一次看到这个数据集时,我立刻想到了BERT,它的理解能力比我在本文中提出的更好(进一步阅读BERT)。

但无论如何,在本文中,我将重点介绍fastText和GloVe。


数据+预处理

数据包括7613条tweet(Text列)和label(Target列),不管他们是否在谈论真正的灾难。有3271行通知实际灾难,有4342行通知非实际灾难。如果你想了解更多关于数据的信息,可以在这里阅读。

链接:https://www.kaggle.com/c/nlp-getting-started

文本中真实灾难词的例子:

“ Forest fire near La Ronge Sask. Canada “

使用灾难词而不是关于灾难的例子:

“These boxes are ready to explode! Exploding Kittens finally arrived! gameofkittens #explodingkittens”

数据将被分成训练(6090行)和测试(1523行)集,然后进行预处理。我们将只使用文本列和目标列。

from sklearn.model_selection import train_test_splitdata = pd.read_csv('train.csv', sep=',', header=0)train_df, test_df = train_test_split(data, test_size=0.2, random_state=42, shuffle=True)

此处使用的预处理步骤:

  1. 小写

  2. 清除停用词

  3. 标记化

from sklearn.utils import shuffleraw_docs_train = train_df['text'].tolist()
raw_docs_test = test_df['text'].tolist()
num_classes = len(label_names)processed_docs_train = []for doc in tqdm(raw_docs_train):tokens = word_tokenize(doc)filtered = [word for word in tokens if word not in stop_words]processed_docs_train.append(" ".join(filtered))processed_docs_test = []for doc in tqdm(raw_docs_test):tokens = word_tokenize(doc)filtered = [word for word in tokens if word not in stop_words]processed_docs_test.append(" ".join(filtered))tokenizer = Tokenizer(num_words=MAX_NB_WORDS, lower=True, char_level=False)
tokenizer.fit_on_texts(processed_docs_train + processed_docs_test)  word_seq_train = tokenizer.texts_to_sequences(processed_docs_train)
word_seq_test = tokenizer.texts_to_sequences(processed_docs_test)
word_index = tokenizer.word_indexword_seq_train = sequence.pad_sequences(word_seq_train, maxlen=max_seq_len)word_seq_test = sequence.pad_sequences(word_seq_test, maxlen=max_seq_len)

词嵌入

第1步:下载预训练模型

使用fastText和Glove的第一步是下载每个预训练过的模型。我使用google colab来防止我的笔记本电脑使用大内存,所以我用request library下载了它,然后直接在notebook上解压。

我使用了两个词嵌入中最大的预训练模型。fastText模型给出了200万个词向量,而GloVe给出了220万个单词向量。

fastText预训练模型下载
import requests, zipfile, iozip_file_url = “https://dl.fbaipublicfiles.com/fasttext/vectors-english/wiki-news-300d-1M.vec.zip"r = requests.get(zip_file_url)z = zipfile.ZipFile(io.BytesIO(r.content))z.extractall()
GloVe预训练模型下载
import requests, zipfile, iozip_file_url = “http://nlp.stanford.edu/data/glove.840B.300d.zip"r = requests.get(zip_file_url)z = zipfile.ZipFile(io.BytesIO(r.content))z.extractall()

第2步:下载预训练模型

FastText提供了加载词向量的格式,需要使用它来加载这两个模型。

embeddings_index = {}f = codecs.open(‘crawl-300d-2M.vec’, encoding=’utf-8')
# Glove
# f = codecs.open(‘glove.840B.300d.txt’, encoding=’utf-8')for line in tqdm(f):values = line.rstrip().rsplit(‘ ‘)word = values[0]coefs = np.asarray(values[1:], dtype=’float32')embeddings_index[word] = coefsf.close()

第3步:嵌入矩阵

采用嵌入矩阵来确定训练数据中每个词的权重。

但是有一种可能性是,有些词不在向量中,比如打字错误、缩写或用户名。这些单词将存储在一个列表中,我们可以比较处理来自fastText和GloVe的词的性能

words_not_found = []nb_words = min(MAX_NB_WORDS, len(word_index)+1)
embedding_matrix = np.zeros((nb_words, embed_dim))for word, i in word_index.items():if i >= nb_words:continueembedding_vector = embeddings_index.get(word)if (embedding_vector is not None) and len(embedding_vector) > 0:embedding_matrix[i] = embedding_vectorelse:words_not_found.append(word)print('number of null word embeddings: %d' % np.sum(np.sum(embedding_matrix, axis=1) == 0))

fastText上的null word嵌入数为9175,GloVe 上的null word嵌入数为9186。

LSTM

你可以对超参数或架构进行微调,但我将使用非常简单的一个架构,它包含嵌入层、LSTM层、Dense层和Dropout层。

from keras.layers import BatchNormalization
import tensorflow as tfmodel = tf.keras.Sequential()model.add(Embedding(nb_words, embed_dim, input_length=max_seq_len, weights=[embedding_matrix],trainable=False))model.add(Bidirectional(LSTM(32, return_sequences= True)))
model.add(Dense(32,activation=’relu’))model.add(Dropout(0.3))
model.add(Dense(1,activation=’sigmoid’))model.summary()

from keras.optimizers import RMSprop
from keras.callbacks import ModelCheckpoint
from tensorflow.keras.callbacks import EarlyStoppingmodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])es_callback = EarlyStopping(monitor='val_loss', patience=3)history = model.fit(word_seq_train, y_train, batch_size=256, epochs=30, validation_split=0.3, callbacks=[es_callback], shuffle=False)

结果

fastText的准确率为83%,而GloVe的准确率为81%。与没有词嵌入的模型(68%)的性能比较,可以看出词嵌入对性能有显著的影响。

fastText 嵌入的准确度

GloVe 嵌入的准确度

没有词嵌入的准确度

如果你想将代码其应用于其他数据集,可以在Github上看到完整的代码。

Github上完整代码:https://github.com/emmanuellaanggi/disaster_tweet_sentiment。

原文链接:https://towardsdatascience.com/text-classification-on-disaster-tweets-with-lstm-and-word-embedding-df35f039c1db

欢迎关注磐创AI博客站: http://panchuang.net/

sklearn机器学习中文官方文档: http://sklearn123.com/

欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

基于LSTM和词嵌入的tweet文本分类相关推荐

  1. fastText中的子词嵌入和高效文本分类:简单高效性能好

    fastText 由Facebook主持的研究.该研究分为两个项目:子词嵌入和高效文本分类.有学者认为fastText只包含高效文本分类,主张它才是该研究的重中之重.不过,在Facebook相关研究的 ...

  2. 今晚8点:基于强化学习的关系抽取和文本分类 | PhD Talk #18

    「PhD Talk」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义 ...

  3. 直播预告:基于强化学习的关系抽取和文本分类 | PhD Talk #18

    「PhD Talk」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义 ...

  4. 【NLP】文献翻译1——基于结构和词嵌入的文本相似性测量方法

    Measuring text similarity based on structure and word embedding 摘要 1. 简介 2. 相关工作 3. 句子相似性 3.1 基于结构的相 ...

  5. 基于Keras预训练词向量模型的文本分类方法

    本文语料仍然是上篇所用的搜狗新闻语料,采用中文预训练词向量模型对词进行向量表示.上篇文章将文本分词之后,采用了TF-IDF的特征提取方式对文本进行向量化表示,所产生的文本表示矩阵是一个稀疏矩阵,本篇采 ...

  6. 基于动态路由的胶囊网络在文本分类上的探索

    摘要 简介 模型 2.1 N-gram 卷积层 2.2 初级胶囊层 2.2.1 孩子-父母(部分-整体)关系 2.3 动态路由 孤立类别 Leaky-Softmax 参数修正 实验 3.1 实验数据集 ...

  7. 基于tensorflow+RNN的新浪新闻文本分类

    2018年10月11日笔记 tensorflow是谷歌google的深度学习框架,tensor中文叫做张量,flow叫做流. RNN是recurrent neural network的简称,中文叫做循 ...

  8. 2020-11-11 吴恩达DL学习-C5 序列模型-W2 自然语言处理与词嵌入(2.9 情绪分类-使用RNN模型,考虑词序)

    1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c 2.详细笔记网站(中文):http://www.ai-sta ...

  9. Word Embedding List|ACL 2020 词嵌入长文汇总及分类

    ACL 2020 于 5 月 17 日放榜啦,在此祝贺.羡慕每一位论文被接收的朋友.以下汇总并尝试按主题分类了 37 篇与 word embedding 有关的长文,让我们一起看看今年词嵌入的研究又有 ...

最新文章

  1. tensorflow gan网络流程图
  2. 基于协程的并发框架orchid简介
  3. 零拷贝 zero-copy 原理
  4. 基于 linux 平台的 libpcap 源代码分析
  5. 3000米排名预测(全排列+判断)
  6. 购票啦 | 2020中国.NET开发者峰会启动
  7. Node.js中事件的循环
  8. c语言编程车,C语言编程之自动类型转化
  9. win10的11对战平台突然无法启动魔兽
  10. odoo10参考系列--Odoo中的安全机制
  11. informix数据库unload下载数据和load上传数据
  12. 基于微信小程序的竞赛管理系统
  13. 移动硬盘计算机限制打不开,可移动磁盘打不开,教您移动硬盘打不开怎么办
  14. property_get和property_set使用方法
  15. 预约洗车/美容/维修/家政/保养/上门洗车预约小程序源码及管理系统
  16. 幻灯片制作去除模板背景
  17. 王者荣耀微信哪个服务器怎么选,王者荣耀:国服战力对比!手Q和微信哪个大区的战力更胜一筹?...
  18. 论文导读|《Exploiting Rich Syntactic Information for Semantic Parsing with Graph-to-Sequence Model》
  19. opencv-python图片的镜像
  20. SQL Server 配置管理器中Browser灰色无法启动解决办法

热门文章

  1. 华为区块链项目总监: 华为区块链率先于溯源场景落地
  2. 使用BookMarkHub插件实现在不同浏览器之间进行书签同步
  3. python Django音乐推荐系统
  4. 怎样删除usb计算机连接网络打印机驱动,USB无法识别打印机的解决办法和教程
  5. 蕉爷的深知精读会(2022年最新整理分享)
  6. 软著申请-中国版权保护中心实名认证流程
  7. 永恩上线服务器维护,lol永恩多久上线-英雄联盟:激斗峡谷(国际服 LOL:Wild Rift)问答专区-OurPlay...
  8. OpenGL图形旋转
  9. Git 忽略某些文件,忽略已提交的文件记录,Git 不追踪变更
  10. 让开源按键组件MultiButton支持菜单操作(事件驱动型)