本文将从多个方面对GloVe词向量进行详细的阐述,包括其原理、优缺点、应用以及代码实现。如果你对词向量感兴趣,那么这篇文章将会是一次很好的学习体验。
一、原理
GloVe(Global Vectors for Word Representation)是由斯坦福大学的研究者Jeffrey Pennington、Richard Socher和Christopher D. Manning提出的一种词向量模型。
GloVe的主要思想是将词向量表示为两个词的共现概率,通过优化共现概率的对数差异来学习词向量。GloVe模型的假设是:如果两个词经常一起出现,则这两个词之间必定存在一种关系。这种关系可以建立在共现矩阵中,其中第(i,j)个元素Xij表示i词和j词在同一上下文中出现的次数。模型的核心思想是通过尝试对点对之间的共现率进行建模来学习词向量。对于J个不同的单词,GloVe的目标是学习一个J x V的单词-词向量矩阵W,其中每个词有一个V维的向量表示。GloVe使用了以下公式:
W(i,j) = exp(θ * f(Xij))
其中,f(Xij) = (Xij / Xmax) ^ α
其中,Xij是两个词在上下文中的共现次数,Xmax是所有共现频率的上限,α是一个消除频率影响的参数,θ是学习的权值。通过对数差异来优化目标函数:
J = ∑∑(W(i,j) * (wi · wj + bi + bj – logXij))^2
其中,wi是词i的词向量,bi是词i的偏差项,同理wj和bj,logXij是所有共现概率的对数。
二、优缺点
相对于其他词向量模型,GloVe有以下几点优点:
1.对极端高频和低频词语具有鲁棒性。
2.一个单独的全局共现矩阵可以用来生成不同大小的词向量。
3.对于大规模语料库,训练速度相对较快。
与此同时,GloVe也有一些缺点:
1.缺乏层次结构,无法处理语义关系的复杂性。
2.对于一些意义相似但表述方式不同的词汇,无法学习到它们之间的细微差异。
三、应用
GloVe词向量在自然语言处理领域应用广泛,包括语义相似度计算、命名实体识别、文本分类等。在此,我们以情感分类问题为例,简单介绍GloVe的应用。
首先,我们需要将文本转换成数值形式,例如词袋模型。然后使用GloVe模型来学习每个词的词向量,最后可以使用一些分类器来对文本进行分类。下面我们给出Python代码示例:
import os
import urllib.request
import numpy as np
from keras.layers import Conv1D, Dense, Input, LSTM, Embedding
from keras.layers import Dropout, Activation
from keras.layers.merge import concatenate
from keras.layers.normalization import BatchNormalization
from keras.models import Model
from keras.preprocessing import sequence
from keras.utils import np_utils
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 下载并解压数据集
url = 'https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz'
filepath = './aclImdb_v1.tar.gz'
if not os.path.isfile(filepath):
result = urllib.request.urlretrieve(url, filepath)
print('downloaded:', result)
import tarfile
if not os.path.exists('./aclImdb'):
tfile = tarfile.open('./aclImdb_v1.tar.gz', 'r:gz')
result = tfile.extractall('./')
print('extracted to:', result)
# 加载数据集
def load_dataset(mode='train'):
"""
mode: 'train' or 'test'
"""
data_path = './aclImdb/{}/'.format(mode)
pos_files = os.listdir(data_path + 'pos/')
neg_files = os.listdir(data_path + 'neg/')
texts = []
labels = []
for filename in pos_files:
with open(data_path + 'pos/' + filename, encoding='utf-8') as f:
texts.append(f.read())
labels.append(1)
for filename in neg_files:
with open(data_path + 'neg/' + filename, encoding='utf-8') as f:
texts.append(f.read())
labels.append(0)
return texts, labels
train_texts, train_labels = load_dataset('train')
test_texts, test_labels = load_dataset('test')
# 构建词典
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
tokenizer = Tokenizer()
tokenizer.fit_on_texts(train_texts)
word_index = tokenizer.word_index
MAX_SEQUENCE_LENGTH = 500
train_sequences = tokenizer.texts_to_sequences(train_texts)
train_sequences = pad_sequences(train_sequences, maxlen=MAX_SEQUENCE_LENGTH)
test_seqences = tokenizer.texts_to_sequences(test_texts)
test_seqences = pad_sequences(test_seqences, maxlen=MAX_SEQUENCE_LENGTH)
# 加载GloVe模型
GLOVE_DIR = './glove.6B/'
embeddings_index = {}
with open(os.path.join(GLOVE_DIR, 'glove.6B.100d.txt'), encoding='utf-8') as f:
for line in f:
values = line.split()
word = values[0]
coefs = np.array(values[1:], dtype='float32')
embeddings_index[word] = coefs
# 创建词向量矩阵
EMBEDDING_DIM = 100
embedding_matrix = np.zeros((len(word_index) + 1, EMBEDDING_DIM))
for word, i in word_index.items():
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
# words not found in embedding index will be all-zeros.
embedding_matrix[i] = embedding_vector
# 构建模型
def build_model():
inputs = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
x = Embedding(len(word_index) + 1,
EMBEDDING_DIM,
weights=[embedding_matrix],
input_length=MAX_SEQUENCE_LENGTH,
trainable=True)(inputs)
x = Conv1D(filters=128, kernel_size=5, activation='relu')(x)
x = Dropout(0.5)(x)
x = LSTM(64)(x)
x = Dense(10, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(1, activation='sigmoid')(x)
model = Model(inputs=inputs, outputs=predictions)
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
return model
model = build_model()
model.fit(train_sequences, train_labels,
batch_size=32,
epochs=5,
validation_data=(test_seqences, test_labels))
y_pred = model.predict(test_seqences).flatten()
y_pred = np.round(y_pred).astype(int)
print('accuracy:', accuracy_score(test_labels, y_pred))
四、总结
本文从原理、优缺点、应用三个方面对GloVe词向量进行了详细的阐述,并且给出了一个简单的情感分类问题实例,希望对读者对词向量的学习有帮助。GloVe词向量模型在自然语言处理领域应用广泛,其优越性的表现是基于全局统计的,这也是其相较于其他方法的优势所在。
原创文章,作者:TYJSY,如若转载,请注明出处:https://www.506064.com/n/374378.html