用python动手简易复现了下word2vec中的skip-gram方法,并将嵌入的特征向量与TF-IDF特征和gensim提供的word2vec方法进行了简易对比。
参考资料:A Neural Probabilistic Language Model、Efficient Estimation of Word Representations in Vector Space、《动手学深度学习》、Skip-Gram模型理解等
实验的数据集以及源码可在链接中进行下载。如有错误,希望批评指正。
数据集
数据集来源
AAAI 2014 Accepted Papers Data Set
数据处理方式
数据集特征:title, authors, groups, keywords, topics, abstract。
将title, keywords, abstract作为特征, 将groups作为文本的标记。
其中title和keywords用tf-idf进行编码,abstract使用word2vec(skip-gram)方法进行编码,再将词的特征向量进行相加。
将groups中括号中的内容作为标记,再利用提取出的特征进行分类。
程序源码
数据预处理 (data_preprocessing.py)
# -*- coding: utf-8 -*-
"""
数据预处理
数据集内容有:'title', 'authors', 'groups', 'keywords', 'topics', 'abstract'。
将'title', 'keywords', 'abstract'作为特征, 将'groups'作为文本的标记。
其中'title'和'keywords'用tf-idf进行编码,'abstract'使用word2vec(skip-gram)方法进行编码,将词的特征向量进行相加,
将'groups'中括号中的内容作为标记,再进行分析。
"""
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import LabelEncoder
from collections import Counter
import pandas as pd
from nltk.tokenize import WordPunctTokenizer
import numpy as np
from word2vec_demo.word2vec import Word2vec
from itertools import chain
from gensim.models import word2vec
from gensim.test.utils import get_tmpfile
from gensim.models import KeyedVectors
import re
import nltk
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt
def keyword_vectorize(data):
"""
将关键词和标题用tf-idf进行编码
:param data:
:return:
"""
key = data['title'] + ' ' + data['keywords']
vectorizer = CountVectorizer()
transformer = TfidfTransformer()
key_vec = transformer.fit_transform(vectorizer.fit_transform(key))
return key_vec.todense()
def abstract_vectorize(data, nHidden=300):
"""
用word2vec方法将摘要转换成特征向量
:param data:
:param nHidden:
:return:
"""
abst = data['abstract']
sentence = abst.apply(nltk.sent_tokenize) # 分句
# 过滤符号等(只保留了小写字母和空格)
sentence = sentence.apply(lambda x: [re.sub('[^a-z ]', '', i.lower()) for i in x])
word = sentence.apply(lambda x: [WordPunctTokenizer().tokenize(i) for i in x]) # 分词
del abst, sentence # 删除些缓存数据
word_map = Word2vec(nHidden=300)
word_tab = word_map.skip_gram(list(chain.from_iterable(word)))
word_tab.to_csv("word_vec.csv"