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

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

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

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



读取文件

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

清理完以后的样式:

生成单词矩阵:

#生成单词矩阵,并对每个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()

为了提高预测的准确性,我们需要过滤掉出现次数较少的单词、次数较多的单词(如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等进行预测,观察模型的性能变化。
全部评论

相关推荐

会员标识
02-20 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
02-19 19:57
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务