在自然处理领域(NLP),词映射(word embedding)是最重要的技术之一,他实现了将一个不可量化的单词映射到一个实数向量。Word embedding能够表示出文档中单词的语义和与其他单词的相似性等关系。它已经被广泛应用在了推荐系统和文本分类中。本文将简要介绍word embedding中广泛使用的word2vec模型,包括其训练和使用。
word2vec
Word2vec使用两层神经网络学习单词映射。它的输入是一个文本语料库,输出是一组向量。通过word2vec嵌入单词可以使自然语言成为计算机可读的语言,然后可以对单词进行数学运算等操作来实现相似性检测。一组训练好的单词向量会将相似的单词在该空间中彼此靠近放置。例如,“女人”,“男人”和“人”这两个词可能聚集在一起,而黄色,红色和蓝色则聚集在一起。
word2vec的训练算法有两种,一种是CBOW,另一种称为Skip-Gram。 这两种方法之间的主要区别在于,CBOW使用上下文来预测目标单词,而skip-gram使用单词来预测目标上下文。通常,与CBOW方法相比,skip-gram方法具有更好的性能,因为它可以捕获单个单词的两种语义。例如,它将为Apple提供两种矢量表示,一种为“公司”,另一种为“水果”。
基于Gensim的word2vec模式使用
在本文中,我将通过一个具体示例展示如何使用gensim生成word embedding。文中例子使用的数据集来自与kaggle。
该数据集包括诸如汽车的品牌,型号,年份,引擎和其他属性的特征。我们将使用这些功能为每个品牌模型生成word embedding,然后比较不同品牌模型之间的相似性。
word2vec要求使用“list of lists”格式进行训练,具体地说,所有的品牌模型都包含在一个总的列表(lists)中,每个列表(list)都包含一个品牌的描述词。
Step0 导入需要的库
import
Step1 数据读取
df=pd.read_csv('data.csv')
df.head()
Step 2 把“make”列和“model”列合并
df['Maker_Model']= df['Make']+ " " + df['Model']
Step3 选取需要训练的特征,主要为文本类特征
df1 = df[['Engine Fuel Type','Transmission Type','Driven_Wheels','Market Category','Vehicle Size', 'Vehicle Style', 'Maker_Model']]
Step4 将多列特征合并成一列
df2 = df1.apply(lambda x: ','.join(x.astype(str)), axis=1)
df_clean = pd.DataFrame({'clean': df2})
Step5 生成训练lists
sent = [row.split(',') for row in df_clean['clean']]
sent[:2]
Step6 训练word2vec模型
model = Word2Vec(sent, min_count=1,size= 50,workers=3, window =3, sg = 1)
model['Toyota Camry']
Step7 计算相似性
model.similarity('Porsche 718 Cayman', 'Nissan Van')
model.most_similar('Mercedes-Benz SLK-Class')[:5]
Step8 使用TSNE进行可视化
def display_closestwords_tsnescatterplot(model, word, size):
arr = np.empty((0,size), dtype='f')
word_labels = [word]
close_words = model.similar_by_word(word)
arr = np.append(arr, np.array([model[word]]), axis=0)
for wrd_score in close_words:
wrd_vector = model[wrd_score[0]]
word_labels.append(wrd_score[0])
arr = np.append(arr, np.array([wrd_vector]), axis=0)
tsne = manifold.TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
Y = tsne.fit_transform(arr)
x_coords = Y[:, 0]
y_coords = Y[:, 1]
plt.scatter(x_coords, y_coords)
for label, x, y in zip(word_labels, x_coords, y_coords):
plt.annotate(label, xy=(x, y), xytext=(0, 0), textcoords='offset points')
plt.xlim(x_coords.min()+0.00005, x_coords.max()+0.00005)
plt.ylim(y_coords.min()+0.00005, y_coords.max()+0.00005)
plt.show()
display_closestwords_tsnescatterplot(model, 'Porsche 718 Cayman', 50)