自然语言处理简单应用---预测文章获得的赞同数量

Hacker News(http://news.ycombinator.com/) 是一个国外新闻社区,用户创造的内容质量远远超出其他创业者主题的网站。

数据下载地址:https://github.com/arnauddri/hn

数据集中存储了从HackerNews上爬取的内容,我们的目的是通过对每篇文章的headline进行分析,预测文章获得的赞同数量,数据样例为:


自然语言处理简单应用---预测文章获得的赞同数量_第1张图片

读取文件

import pandas as pd
submissions=pd.read_csv('./data/sel_hn_stories.csv')
submissions.columns=["submission_time", "upvotes", "url", "headline"]
submissions = submissions.dropna()
submissions.head()

对headline进行分词处理:

tokenized_headlines=[]
for headline in submissions['headline']:
    tokenized_headlines.append(headline.split(" "))

# 处理tokens:大小写转换、去标点符号,生成unique_words
punctuation = [",", ":", ";", ".", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")"]
clean_tokenized = []
for item in tokenized_headlines:
    tokens=[]
    for token in item:
        token=token.lower()
        for punc in punctuation:
            token.replace(punc,"")
        tokens.append(token)
    clean_tokenized.append(tokens)
clean_tokenized

清理完以后的样式:

自然语言处理简单应用---预测文章获得的赞同数量_第2张图片

生成单词矩阵:

#生成单词矩阵,并对每个headline进行词频统计
import numpy as np

unique_words=[]
sigle_words=[]
for item in clean_tokenized:
    for token in item:
        if token not in sigle_words:
            sigle_words.append(token)
        elif token not in unique_words:
            unique_words.append(token)
counts=pd.DataFrame(0,index=np.arange(len(clean_tokenized)),columns=unique_words)
counts.head()

#词频统计
for i,item in enumerate(clean_tokenized):
    for word in item:
        if word in unique_words:
            counts.iloc[i][word]+=1
counts.head()
自然语言处理简单应用---预测文章获得的赞同数量_第3张图片

为了提高预测的准确性,我们需要过滤掉出现次数较少的单词、次数较多的单词(如a、an等),这类词对提高预测准确率没有什么帮助。

# Cleaning dataframe:删除出现频率过多、过少columns
word_counts=counts.sum(axis=0)
counts=counts.loc[:,(word_counts>=5)&(word_counts<=100)]
counts.head()

接下来为预测过程:
产生训练集、测试集--训练模型--做出预测

# Split dataset to train and test set
from sklearn.cross_validation import train_test_split

x_train,x_test,y_train,y_test=train_test_split(counts,submissions['upvotes'],test_size=.2,random_state=1)
from sklearn.linear_model import LinearRegression

lr=LinearRegression()
lr.fit(x_train,y_train)
predictions=lr.predict(x_test)

mse=sum((y_test-predictions)**2)/len(predictions)
mse

得到mse为:2558.0535509833271
在我们的数据中,平均赞数为10,标准差为39.5。即便对mse开方,得到的值为46.7,依然偏大。这意味着我们的平均错误为46.7,远远大于标准差,与真实值偏差太大了。
之所以偏差这么大是因为以下几个原因:

  • 为了方便操作,我使用的数据集仅仅为爬取的文件中的很小一部分,可以尝试使用更多的数据来提高预测性。
  • 尝试增加一些特征:比如标题长度、单词平均长度
  • 尝试使用其他模式,如RandomForest、Ensemble等进行预测,观察模型的性能变化。

你可能感兴趣的:(自然语言处理简单应用---预测文章获得的赞同数量)