煉丹記之在非典型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維特徵向量)。

以上,構建好特徵之後就可以輸入各種模型建(調)模(參)了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章