本文共 3064 字,大约阅读时间需要 10 分钟。
题目描述:
题目理解:
读红楼梦,看尽人世百态。自我反省了一下,发现自己的情商(为人处世)方面确实很差,说话太直或许做事太幼稚。从我和别人的对话之中,些许可以被听者听出来。我所说的话,也就是文本,文本的理解就是通过语气以及说话人的历史性格能够推测出来。
这个题目,主要是通过对游客在某平台的留言以及用户主观的评论,需要的任务就是预测这些人的留言,推测他可能的主观评论。
方法方案:
阅读过很多文本处理的方案,对于中文的方案本身比较少。也是因为中文的语义复杂,包含的情感多样。
1.切分句子为单词,之后以空格连接每个单词,这样,句子就变成了与英文格式类似的样子。每一个单词/字符为一组,举个例子:
LIKE YOU
立刻有 => 立刻 有
第一句是英语,自然就是每个单词一组,而对于中文,在没有标点的情况下,本身是在一起的,通过第三方分词工具,可以分成不同形式,这里举了一个例子,立刻/有 分成了与英文类似的结果。
对于分好词后的句子,如何确定每个词的重要度,这时就有了TF-IDF的方案,可以将词转化为向量。具体对于不同的方案的含义,在之后的文章将会详细叙说,这里先主观的去感受一下,文本处理的传统方法是如何工作和处理。
这里贴上代码,数据来源于上面提及的网站。
#coding:utf-8import pandas as pdimport matplotlib.pyplot as pltimport jiebaimport jieba.analysefrom sklearn.feature_extraction.text import CountVectorizer, HashingVectorizer, TfidfTransformer,TfidfVectorizerfrom sklearn.linear_model import Ridgefrom sklearn.metrics import mean_squared_errorfrom sklearn.preprocessing import OneHotEncoderimport scipyfrom sklearn.model_selection import KFold# from scipy.sparse import csr_matrixfrom scipy.sparse import csr_matrix, hstackdef get_data(): train = pd.read_csv('../data/train_first.csv') test = pd.read_csv('../data/predict_first.csv') data = pd.concat([train, test]) print('train %s test %s'%(train.shape,test.shape)) print('train columns',train.columns) return data,train.shape[0],train['Score'],test['Id']# 分词处理def split_discuss(data): data['length'] = data['Discuss'].apply(lambda x:len(x)) data['Discuss'] = data['Discuss'].apply(lambda x:' '.join(jieba.cut(x))) return data# 预处理def pre_process(): data,nrw_train,y,test_id = get_data() data = split_discuss(data) cv = CountVectorizer(ngram_range=(1,2)) discuss = cv.fit_transform(data['Discuss']) tf = TfidfVectorizer(max_df=10000,ngram_range=(1,2)) discuss_tf = tf.fit_transform(data['Discuss']) # length = csr_matrix(pd.get_dummies(data['length'],sparse=True).values) data = hstack((discuss,discuss_tf)).tocsr() return data[:nrw_train],data[nrw_train:],y,test_iddef xx_mse_s(y_true,y_pre): y_true = y_true y_pre = pd.DataFrame({'res':list(y_pre)}) y_pre['res'] = y_pre['res'].astype(int) return 1 / ( 1 + mean_squared_error(y_true,y_pre['res'].values)**0.5)X,test,y,test_id = pre_process()kf = KFold(n_splits=3,shuffle=True,random_state=42)cv_pred = []kf = kf.split(X)xx_mse = []model_1 = Ridge(solver='auto', fit_intercept=True, alpha=0.4, max_iter=250, normalize=False, tol=0.01)for i ,(train_fold,test_fold) in enumerate(kf): X_train, X_validate, label_train, label_validate = X[train_fold, :], X[test_fold, :], y[train_fold], y[test_fold] model_1.fit(X_train, label_train) val_ = model_1.predict(X=X_validate) print(xx_mse_s(label_validate, val_)) cv_pred.append(model_1.predict(test)) xx_mse.append(xx_mse_s(label_validate, val_))import numpy as npprint('xx_result',np.mean(xx_mse))s = 0for i in cv_pred: s = s + is = s/3res = pd.DataFrame()res['Id'] = list(test_id)res['pre'] = list(s)res.to_csv('../result/t_20180215_1.csv',index=False,header=False)为什么对于评分问题要使用rmse的指标,是由于这个题目的评价指标就是rmse,所以使用回归的方式,这里面还有很多需要的问题需要解决,不过这些坑准备在后续的文章逐步的完善。
转载地址:http://rvxgj.baihongyu.com/