数据简介
本案例用到的原始数据是一个简单的数据集,其中包括从国外某网站捞取的每日新闻排序(25条),然后以当日的股票市场涨跌作为Label。从而根据对新闻的挖掘,来判断当日股票涨跌。
数据集大致长这样(部分截图):
Date:日期数据,本案例文本分析就不用这个数据了。
Label:当日股票市场情况,1代表上涨,0代表下跌。
Top*:共25列,表示当日的相关新闻。
下面利用TF-IDF简单的跑一下文本挖掘的基本流程,代码也都比较简单,重点是关注处理流程。
导入数据:
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import pandas as pd
import numpy as np
from sklearn.svm import SVC
from sklearn.metrics import roc_auc_score
from datetime import date
#读入数据
data=pd.read_csv(r'E:\python\news stock\input\Combined_News_DJIA.csv')
#观察数据
data.head()
数据预处理:
#接下来我们把headlines先合并起来。因为我们需要考虑所有的news的。
data['combined_news']=data.filter(regex=('Top.*')).apply(lambda x:''.join(str(x.values)),axis=1)
#分割测试/训练集,保留部分数据测试用
train=data[data['Date']<'2015-01-01']
test=data[data['Date']>'2014-12-31']
#小写 / 分成小tokens,并剔除部分无效字符
X_train=train['combined_news'].str.lower().str.replace('b"','').str.replace("b'",'').str.replace('"','').str.replace("'",'').str.split()
X_test=test['combined_news'].str.lower().str.replace('b"','').str.replace("b'",'').str.replace('"','').str.replace("'",'').str.split()
#Label
y_train=train['Label'].values
y_test=test['Label'].values
#删减停止词
from nltk.corpus import stopwords
stop=stopwords.words('english')
#删除数字
import re
def hasNumbers(inputString):
return bool(re.search(r'\d',inputString))
# 特殊符号
def isSymbol(inputString):
return bool(re.match(r'[^\w]', inputString))
#lemma,词形还原
from nltk.stem import WordNetLemmatizer
wordnet_lemmatizer=WordNetLemmatizer()
#我们把这些元素全都合成一个func
def check(word):
if word in stop:
return False
elif hasNumbers(word) or isSymbol(word):
return False
else:
return True
#然后我们把整个流程放进我们的DF中处理
X_train=X_train.apply(lambda x:[wordnet_lemmatizer.lemmatize(item) for item in x if check(item)])
X_test=X_test.apply(lambda x:[wordnet_lemmatizer.lemmatize(item) for item in x if check(item)])
#因为外部库,比如sklearn 只支持string输入,所以我们把调整后的list再变回string
X_train=X_train.apply(lambda x:' '.join(x))
X_test=X_test.apply(lambda x:' '.join(x))
特征处理:TF-IDF
#TF-IDF,把提取出来的词进行频率统计并进行频率修正
feature_extraction=TfidfVectorizer(lowercase=False)
X_train=feature_extraction.fit_transform(X_train.values)
X_test=feature_extraction.transform(X_test.values)
建立模型
这里随便抓个模型跑的,由于数据集太小,而且并不是非常严谨。重点理解上面的文本处理过程,在文本挖掘中SVM用的比较多,后续也会拿其它案例来进行更严谨的建模。
#建立模型
clf=SVC(probability=True,kernel='rbf')
clf.fit(X_train,y_train)
predictions=clf.predict_proba(X_test)
print('ROC-AUC yields:'+str(roc_auc_score(y_test,predictions[:,1])))