利用最大熵模型来训练词向量

前面我们已经训练好词向量了,利用Word2vec将旅游评论数据转化为词向量,这篇文章主要介绍用最大熵模型训练我们上文得到的词向量。

最终代码已上传到github上,传送门​​​​​​​

一、读取数据

读取上一级的得到的词向量,并划分测试集合训练集,具体代码如下:

print ("读取数据")
df = pd.read_csv(r"E:\shixun\vvvv.csv")
df.fillna(df.mean())
x = df.iloc[:,2:]
y = df.iloc[:,1]
print("数据读取完成")
x["index"] = range(len(x))
#xdic=x.set_index("index").T.to_dict("list")
x_train,x_test, y_train, y_test=train_test_split(x,y,test_size=0.3)

英文有的数据为空,所以我们就用平均值的方式来替换它。我还加了一列,我现在都忘了我为什么要加这一列,不过我记得当时好像报错了,所以我加了一列,但现在我忘了为什么加这一列,所以代码加注释是多么重要啊。

二、最大熵模型训练

我们调用nltk.classify .MaxentClassifier()的方法来来训练最大熵模型,但这个模型最让人无语的就是它要求输入的模型格式list(tuple(dict, str)),所以我们需要将我们的数据给改变格式,具体实现代码

train=[]
for i in range(len(x_train)):
    sss={}
    #sss[x.iloc[1,400]]=x.iloc[1,:400].tolist()
    # sss[x.iloc[1,400]]=x.iloc[1,:400].sum()
    sss[x_train.iloc[1, 400]]=tuple(x_train.iloc[1, :400].tolist())
    #必须是数字,而不能是列表
    train.append((sss,y_train[x_train.index[i]]))
# for i in range(len(xdic)):
test=[]
for i in range(len(x_test)):
    sss={}
    #sss[x.iloc[1,400]]=x.iloc[1,:400].tolist()
    # sss[x.iloc[1,400]]=x.iloc[1,:400].sum()
    sss[x_test.iloc[1, 400]]=tuple(x_test.iloc[1, :400].tolist())
    #必须是数字,而不能是列表
    test.append((sss,y_test[x_test.index[i]]))

然后将我们定义的训练进行训练,训练时间肯有点长,我是训练了快20个小时才训练好,

classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)

然后就是用测试数据来测试模型

classify_results=[]
for i in test:
    classify_results.append(classifier.classify(i[0]))

target_name = ['score 0','score 1','score 2','score 3','score 4','score 5']
print(classification_report(y_test,classify_results, target_names=target_name))

训练结果不是很理想,截图如下:

可能是我有些地方弄错了,也可能是数据集问题,也有可能是我训练参数没有调好。可是训练一次模型需要这么长时间,我没办法进行改进,只好先将就一下,毕竟还要做其他的东西。

参考文献:

http://www.nltk.org/api/nltk.classify.html#nltk.classify.maxent.MaxentClassifier

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值