炼丹记之在非典型NLP领域使用word2vec构造特征

最近各种竞赛上对时序数据进行embeding很火、效果很好,比如数字中国2020的智慧海海建设中rank1的分享,譬如2020腾讯广告大赛。

为了上分,NLP小白一枚不得不花一些时间来啃一下tfidf、word2vec、doc2vec。

以下是利用gensim实现word2vec构建特征的代码(now, show u the code):

# -*- coding: utf-8 -*-
"""
Created on Thu Jun  4 16:23:02 2020

@author: csdn lanxuml
"""
from gensim.test.utils import common_texts
from gensim.models import Word2Vec

import numpy as np
import pandas as pd

#构建n_dims维的特征
n_dims = 64
#模型训练
model = Word2Vec(common_texts, size=n_dims, window=5, min_count=1, workers=4)
#构建n_dims维0行的numpy array
vector_corpus_np = np.zeros((0, n_dims))
#将common_texts中每行记录的模型分数求列均值作为改行的特征向量
vector_corpus_np = np.insert(vector_corpus_np, 0, values=[ np.mean(model[common_texts[i]], axis=0)for i in range(0,len(common_texts))], axis=0)
#将numpy array转为pandas dataframe
vector_corpus_df = pd.DataFrame(vector_corpus_np)
#为了避免在建模时特征名为整数而报错,修改特征名
vector_corpus_df.columns = ['dim_'+str(i) for i in range(0,len(vector_corpus_df.columns.values.tolist()))]

注意(有点乱,看不懂的话可以直接把代码copy下来放notebook或者IDE里跑一下):

    1.如果min_count的值大于1为n时,需要在模型训练前将common_texts中出现次数小于n的词删掉;

    2.由于非典型NLP领域通常给出的非数值特征都是类型数据,所以本文中并没有使用jieba进行分词处理;

    3.实际操作时需要根据已知特征自行构造common_texts,譬如用户i在90天内点击过的广告ID集合(可拼接成一个list)作为该用户的一个文本语句common_texts[i]  (model[common_texts[i]]求列均值构作为该用户的n_dims维特征向量)。

以上,构建好特征之后就可以输入各种模型建(调)模(参)了。

猜你喜欢

转载自blog.csdn.net/lanxuxml/article/details/106573356