第一步:生成对应的数据表
import pandas as pd
#编码转换完成的数据,取的是1W的子集
trainname = './data/user_tag_query.10W.TRAIN-1w.csv'
testname = './data/user_tag_query.10W.TEST-1w.csv'
data = pd.read_csv(trainname,encoding='gbk')
print (data.info())
#分别生成三种标签数据(性别,年龄,学历)
data.age.to_csv("./data/train_age.csv", index=False)
data.Gender.to_csv("./data/train_gender.csv", index=False)
data.Education.to_csv("./data/train_education.csv", index=False)
#将搜索数据单独拿出来
data.QueryList.to_csv("./data/train_querylist.csv", index=False)
data = pd.read_csv(testname,encoding='gbk')
print (data.info())
data.QueryList.to_csv("./data/test_querylist.csv", index=False)
第二步:对用户的搜索数据进行分词和词性过滤
这里需要分别对训练集和测试集进行相同的操作,路径名字要改动一下
import pandas as pd
import jieba.analyse
import time
import jieba
import jieba.posseg
import os, sys
def input(trainname):
traindata = []
with open(trainname, 'rb') as f:
line = f.readline()
count = 0
while line:
try:
traindata.append(line)
count += 1
except:
print ("error:", line, count)
line=f.readline()
return traindata
start = time.clock()
filepath = './data/test_querylist.csv'
QueryList = input(filepath)
writepath = './data/test_querylist_writefile-1w.csv'
csvfile = open(writepath, 'w')
POS = {
}
for i in range(len(QueryList)):
#print (i)
if i%2000 == 0 and i >=1000:
print (i,'finished')
s = []
str = ""
words = jieba.posseg.cut(QueryList[i])# 带有词性的精确分词模式
allowPOS = ['n','v','j']
for word, flag in words:
POS[flag]=POS.get(flag,0)+1
if (flag[0] in allowPOS) and len(word)>=2:
str += word + " "
cur_str = str.encode('utf8')
cur_str = cur_str.decode('utf8')
s.append(cur_str)
csvfile.write(" ".join(s)+'\n')
csvfile.close()
end = time.clock()
print ("total time: %f s" % (end - start))
第三步:使用Gensim库建立word2vec词向量模型
参数定义:
-
sentences:可以是一个list
-
sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
-
size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
-
window:表示当前词与预测词在一个句子中的最大距离是多少
-
alpha: 是学习速率
-
seed:用于随机数发生器。与初始化词向量有关。
-
min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
-
max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
-
workers参数控制训练的并行数。
-
hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
-
negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
-
iter: 迭代次数,默认为5
from gensim.models import word2vec
#将数据变换成list of list格式
train_path = './data/train_querylist_writefile-1w.csv'
with open(train_path, 'r') as f:
My_list = []
lines = f.readlines()
for line in lines:
cur_list = []
line = line.strip()
data = line.split(" ")
for d in data:
cur_list.append(d)
My_list.append(cur_list)
model = word2vec.Word2Vec(My_list, size=300, window=10,workers=4)
savepath = '1w_word2vec_' + '300'+'.model' # 保存model的路径
model.save(savepath)
model.most_similar("大哥")
model.most_similar("清华")