词嵌入教程

1无论我们是谁 , 阅读、理解、交流并最终产生新的内容是我们在职业生活中都要做的事情 。
当涉及到从给定的文本体中提取有用的特征时 , 所涉及的过程与连续整数向量(词袋)相比是根本不同的 。 这是因为句子或文本中的信息是以结构化的顺序编码的 , 单词的语义位置传达了文本的意思 。
因此 , 在保持文本的上下文意义的同时 , 对数据进行适当表示的双重要求促使我学习并实现了两种不同的NLP模型来实现文本分类的任务 。
词嵌入是文本中单个单词的密集表示 , 考虑到上下文和其他与之相关的单词 。
与简单的词袋模型相比 , 该实值向量可以更有效地选择维数 , 更有效地捕捉词与词之间的语义关系 。
词嵌入教程文章插图
简单地说 , 具有相似含义或经常出现在相似上下文中的词 , 将具有相似的向量表示 , 这取决于这些词在其含义中的“接近”或“相距”有多远 。
在本文中 , 我将探讨两个词的嵌入-

  1. 训练我们自己的嵌入
  2. 预训练的GloVe 词嵌入
数据集对于这个案例研究 , 我们将使用Kaggle的Stack Overflow 数据集() 。 这个数据集包含了6万个用户在网站上提出的问题 , 主要任务是将问题分为3类 。
现在让我们看看这个多分类NLP项目的实际模型本身 。
但是 , 在开始之前 , 请确保你已经安装了这些包/库 。
pip install gensim# 用于NLP预处理任务pip install keras# 嵌入层1. 训练词嵌入如果你希望跳过解释 , 请访问第一个模型的完整代码:
1) 数据预处理在第一个模型中 , 我们将训练一个神经网络来从我们的文本语料库中学习嵌入 。 具体地说 , 我们将使用Keras库为神经网络的嵌入层提供词标识及其索引 。
在训练我们的网络之前 , 必须确定一些关键参数 。 这些包括词汇的大小或语料库中唯一单词的数量以及嵌入向量的维数 。
以下链接是用于训练和测试的数据集 。 现在我们将导入它们 , 只保留问题和质量列以供分析:
我还更改了列名并定义了一个函数text_clean来清理问题 。
# 导入库# 数据操作/处理import pandas as pd, numpy as np# 可视化import seaborn as sb, matplotlib.pyplot as plt# NLPimport refrom nltk.corpus import stopwordsfrom gensim.utils import simple_preprocessstop_words = set(stopwords.words('english'))# 导入数据集dataset = pd.read_csv('train.csv')[['Body', 'Y']].rename(columns = {'Body': 'question', 'Y': 'category'})ds = pd.read_csv('valid.csv')[['Body', 'Y']].rename(columns = {'Body': 'question', 'Y': 'category'})# 清理符号和HTML标签symbols = re.compile(pattern = '[/<>(){}\[\]\|@,;]')tags = ['href', 'http', 'https', 'www']def text_clean(s: str) -> str:s = symbols.sub(' ', s)for i in tags:s = s.replace(i, ' ')return ' '.join(word for word in simple_preprocess(s) if not word in stop_words)dataset.iloc[:, 0] = dataset.iloc[:, 0].apply(text_clean)ds.iloc[:, 0] = ds.iloc[:, 0].apply(text_clean)# 训练和测试集X_train, y_train = dataset.iloc[:, 0].values, dataset.iloc[:, 1].values.reshape(-1, 1)X_test, y_test = ds.iloc[:, 0].values, ds.iloc[:, 1].values.reshape(-1, 1)# one-hot编码from sklearn.preprocessing import OneHotEncoder as ohefrom sklearn.compose import ColumnTransformerct = ColumnTransformer(transformers = [('one_hot_encoder', ohe(categories = 'auto'), [0])],remainder = 'passthrough')y_train = ct.fit_transform(y_train)y_test = ct.transform(y_test)# 设置参数vocab_size = 2000sequence_length = 100如果你浏览原始数据集 , 你会发现HTML标记中包含的问题 , 例如 ,
…question
。 此外 , 还有一些词 , 如href , https等 , 在整个文本中都有 , 所以我要确保从文本中删除这两组不需要的字符 。
Gensim的simple_preprocess方法返回一个小写的标记列表 , 去掉重音符号 。
在这里使用apply方法将通过预处理函数迭代运行每一行 , 并在继续下一行之前返回输出 。 对训练和测试数据集应用文本预处理功能 。
因为在因变量向量中有3个类别 , 我们将应用one-hot编码并初始化一些参数以备以后使用 。
2) 标识化接下来 , 我们将使用Keras Tokenizer类将单词组成的问题转换成一个数组 , 用它们的索引表示单词 。
因此 , 我们首先必须使用fit_on_texts方法 , 从数据集中出现的单词构建索引词汇表 。
在建立词汇表之后 , 我们使用text_to_sequences方法将句子转换成表示单词的数字列表 。
pad_sequences函数确保所有观察值的长度相同 , 可以设置为任意数字或数据集中最长问题的长度 。
【词嵌入教程】我们先前初始化的vocab_size参数只是我们词汇表的大小(用于学习和索引) 。