用python实现skip-gram算法:AAAI-14 accepted papers(NLP)分类任务

本文介绍了使用Python复现word2vec中的skip-gram方法,将特征应用于AAAI 2014 Accepted Papers Data Set的分类任务。通过对比TF-IDF和gensim的word2vec,探讨了模型性能和数据处理策略。实验结果显示,自定义skip-gram模型在速度上较慢,但性能优于gensim模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用python动手简易复现了下word2vec中的skip-gram方法,并将嵌入的特征向量与TF-IDF特征和gensim提供的word2vec方法进行了简易对比。
参考资料:A Neural Probabilistic Language ModelEfficient 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作为文本的标记。
其中titlekeywords用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")
    # 读取词向量缓存
    # word_tab = pd.read_csv('word_ve
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值