达观杯-特征工程 1

特征工程

这里主要是将文本信息转化成向量。分别采用countvectororizer和TfidfVectorizer ,Doc2Vec 和 HashingVectorizer 。

除Doc2vec,其他几种方法都在sklearn包中,具体为sklearn.feature_extraction.text中
使用方法:

from sklearn.feature_extraction.text import **

Doc2vec的使用方法:

from gensim.models.doc2vec import Doc2vec

简单介绍

countvectororizer:

Countvectorizer和Countvectorizermodel旨在通过计数来将一个文档转换为向量。当不存在先验字典时,Countvectorizer可作为Estimator来提取词汇,并生成一个Countvectorizermodel。该模型产生文档关于词语的稀疏表示,其表示可以传递给其他算法如LDA。
在fitting过程中,countvectorizer将根据语料库中的词频排序选出前vocabsize个词。一个可选的参数minDF也影响fitting过程中,它指定词汇表中的词语在文档中最少出现的次数。另一个可选的二值参数控制输出向量,如果设置为真那么所有非零的计数为1。这对于二值型离散概率模型非常有用。

TfidfVectorizer:

词频-逆向文件频率(TF-IDF)是一种在文本挖掘中广泛使用的特征向量化方法,它可以体现一个文档中词语在语料库中的重要程度。

词语由t表示,文档由d表示,语料库由D表示。词频TF(t,d)是词语t在文档d中出现的次数。文件频率DF(t,D)是包含词语的文档的个数。如果我们只使用词频来衡量重要性,很容易过度强调在文档中经常出现而并没有包含太多与文档有关的信息的词语,比如“a”,“the”以及“of”。如果一个词语经常出现在语料库中,它意味着它并没有携带特定的文档的特殊信息。逆向文档频率数值化衡量词语提供多少信息:

其中,|D|是语料库中的文档总数。由于采用了对数,如果一个词出现在所有的文件,其IDF值变为0。

Doc2Vec

Word2vec是一个Estimator,它采用一系列代表文档的词语来训练word2vecmodel。该模型将每个词语映射到一个固定大小的向量。word2vecmodel使用文档中每个词语的平均数来将文档转换为向量,然后这个向量可以作为预测的特征,来计算文档相似度计算等等。

1 countvectororizer

'''
将原始数据的word特征数字化为countvector特征,并将结果保存到本地

article特征可做类似处理

'''
import pandas as pd
from sklearn.feature_extraction.text import countvectororizer
import pickle
import time

t_start = time.time()

1 数据预处理
# 读取原始数据train和test文件
df_train=pd.read_csv('train_set.csv')
df_test=pd.read_csv('test_set.csv')

# 删除特征article,只保留特征word
df_train.drop(columns='article', inplace=True)
df_test.drop(columns='article', inplace=True)
# 按行拼接df_train和df_test
df_all = pd.concat(objs=[df_train, df_test], axis=0, sort=True)

这里将两个数据集凭借起来,是为了增加训练样本的数量。

2 特征工程
# 获取train文件中的特征class
y_train = (df_train['class'] - 1).values

"""
print('2 特征工程')
# 将原始数据数字化为countvector特征

vectorizer = countvectororizer(ngram_range=(1, 2), min_df=100, max_df=0.8)
vectorizer.fit(df_all['word_seg'])
x_train = vectorizer.transform(df_train['word_seg'])
x_test = vectorizer.transform(df_test['word_seg'])

‘min_df’和max_df是设置的过滤参数,min_df表示出现次数少于100次的词不要,max_df表示出现频率大于0.8的词不要。

3 保存至本地
"""
data = (x_train, y_train, x_test)
with open('countvector_word.pkl', 'wb') as f:
	pickle.dump(data,f)

t_end = time.time()
print("共耗时:{}min".format((t_end-t_start)/60))

TfidfVectorizer

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, sublinear_tf=True)
vectorizer.fit(df_all['word_seg'])
x_train = vectorizer.transform(df_train['word_seg'])
x_test = vectorizer.transform(df_test['word_seg'])

在此处仍然是将article这列特征删除,可以考虑将其进行类似的处理。

Doc2Vec

from gensim.models.doc2vec import Doc2Vec, TaggedDocumen

import pandas as pd
import numpy as np

import time
import pickle

t_start = time.time()

#辅助函数 
def sentence2list(sentence):
    s_list = sentence.strip().split() #strip()去掉首尾空格,split()将字符串以空格切分成列表
    return s_list

# 加载原始数据
df_train=pd.read_csv('train_set.csv')
df_test=pd.read_csv('test_set.csv')

df_train.drop(columns='article', inplace=True)
df_test.drop(columns='article', inplace=True)

# 按行拼接df_train和df_test
df_all = pd.concat(objs=[df_train, df_test], axis=0, sort=True)

# 获取train文件中的特征class
y_train = (df_train['class'] - 1).values

df_all['word_list'] = df_all['word_seg'].apply(sentence2list)
texts = df_all['word_list'].tolist()

# 特征工程
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(texts)]
model = Doc2Vec(documents, vector_size=200, window=5, min_count=3, workers=4, epochs=25)
docvecs = model.docvecs

x_train = []
for i in range(0, 102277):
    x_train.append(docvecs[i])
x_train = np.array(x_train)

x_test = []
for j in range(102277, 204554):
    x_test.append(docvecs[j])
x_test = np.array(x_test)

# 保存至本地
data = (x_train, y_train, x_test)

with open('doc2vec_word.pkl', 'wb') as f:
	pickle.dump(data,f) 

t_end = time.time()
print("共耗时:{}min".format((t_end-t_start)/60))


**HashingVectorizer **

from sklearn.feature_extraction.text import HashingVectorizer

# 特征工程

vectorizer = HashingVectorizer(ngram_range=(1, 2), n_features=200)
d_all = vectorizer.fit_transform(df_all['word_seg'])
x_train = d_all[:len(y_train)]
x_test = d_all[len(y_train):]

HashingVectorizer比起前面几种方法最突出的一个特点就是比较省内存

https://blog.csdn.net/liulingyuan6/article/details/53390949?utm_source=copy
https://blog.csdn.net/Datawhale/article/details/82824179?utm_source=copy

猜你喜欢

转载自blog.csdn.net/linichengpps/article/details/82956827