实习的时候有个任务,利用大样本关联多种特征二分类预测,其中有部分特征为文本特征,简单处理过后可取得一定收益,便考虑使用gensim库里的lda抽取样本在文本特征上的主题分布生成新的特征,具体实现如下:
- gensim中lda包的使用请参考:pyLDA系列︱gensim中的主题模型(Latent Dirichlet Allocation)—— 悟乙己
- lda原理请参考:通俗理解LDA主题模型 —— v_JULY_v
问题背景
在进行特征挖掘时,有一类表现尚好的特征为样本APP相关信息,其内容皆为文本,特征文本内容分为3种,apkname唯一标识、appname和apptags(以逗号分隔),欲将每个样本所包含的APP相关信息经清洗融合为单一文本,作为代表该样本的文本建立主题模型,最终用lda得到每个样本在top主题上的概率分布,作为样本新的特征使用。
特征的样式……编个例子,如下:
apkname | appname | apptags |
---|---|---|
com.bilibili.fgo.qihoo | 命运-冠位指定-FGO | 正版IP 网游 ACT 回合 二次元 |
数据样本量:约300万
数据中app种类:约28万
预处理
特征文本内容分为3种,apkname唯一标识、appname和apptags,为生成特征文本,欲将apkname以"."分隔,appname需进行分词以及特殊符号清洗将其融入tag。
import numpy as np
import pandas as pd
#import pyLDAvis.gensim
import json
import warnings
import gensim
import string
from gensim import corpora, models
import os, sys
import gc
import logging
from logzero import logger
logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s",
level=logging.INFO)
warnings.filterwarnings('ignore') # To ignore all warnings that arise here to enhance clarity
from gensim.models.coherencemodel import CoherenceModel
app = pd.read_csv('../input/user_apklabels.csv',nrows=None, usecols=['apklabels'])
print(app.shape[0] - app.isnull().sum())
app = app[~app.isnull()]
#app['is_num_apkname']=[s.isalnum() for s in app['apklabels'].astype(str).values]
#app = app[app['is_num_apkname']==False]
app.shape[