本文将学习自然语言处理,当给予计算机一篇文章,它并不知道这篇文章的含义。为了让计算机可以从文章中做出推断,我们需要将文章转化为数值表示。这个过程使得计算机能够凭语法规则去识别它。那么首先就要学会如何将文章变为数值表示。
Hacker News网站是一个可以提交文章的社区网站,并且其他的人可以对文章进行投票。投票最高的文章会被放到首页,这样就有更多的人可以看到它。我们的数据集就是 Hacker News网站2006年到2015年提交的文章集合。Arnaud Drizard利用Hacker News API爬取到了这些数据。我们从中随机抽取了3000个样本,删除了所有多余的列,最终数据的属性如下:
- submission_time – when the article was submitted.
- upvotes – number of upvotes the article got.
- url – the base url of the article.
- headline – the headline of the article.
import pandas as pd
submissions = pd.read_csv("sel_hn_stories.csv")
submissions.columns = ["submission_time", "upvotes", "url", "headline"]
submissions = submissions.dropna()
tokenized_headlines = []
for item in submissions["headline"]:
tokenized_headlines.append(item.split(" "))
punctuation = [",", ":", ";", ".", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")"]
clean_tokenized = []
for item in tokenized_headlines:
tokens = []
for token in item:
token = token.lower()
for punc in punctuation:
token = token.replace(punc, "")
tokens.append(token)
clean_tokenized.append(tokens)
import numpy as np
unique_tokens = []
single_tokens = []
for tokens in clean_tokenized:
for token in tokens:
if token not in single_tokens:
single_tokens.append(token)
elif token in single_tokens and token not in unique_tokens:
unique_tokens.append(token)
counts = pd.DataFrame(0, index=np.arange(len(clean_tokenized)), columns=unique_tokens)
for i, item in enumerate(clean_tokenized):
for token in item:
if token in unique_tokens:
counts.iloc[i][token] += 1
print(len(unique_tokens))
'''
2309
'''
有两类特征会降低模型的精度
- 第一种:只出现过几次,这样的特征会导致过拟合。因为模型没有更多的信息来精确的确定这个特征是否重要,因为它就只出现了几次。并且它们在训练集和测试集中对于目标变量的影响也会有很大的差异,因为出现太少,因此属性分布不平衡。
- 第二种:出现的次数太多,比如像and和to这样的特征根本不能给模型带来任何有意义的信息,这些词被称为停顿词,应当剔除掉。
word_counts = counts.sum(axis=0)
'''
word_counts
Series ()
418
and 289
for 298
as 47
you 100
is 158
'''
counts = counts.loc[:,(word_counts >= 5) & (word_counts <= 100)]
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(counts, submissions["upvotes"], test_size=0.2, random_state=1)
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)
mse = sum((y_test - predictions) ** 2) / len(predictions)
print(mse)
'''
2652.6082512522867
'''
可以采取以下措施来降低预测的偏差问题:
- 利用整个数据集进行模型的创建,因为在这个实验中我们只是抽样了3000个文章。如果利用全部的数据集将大大减少出错率。
- 添加元特征( “meta” features),比如标题的长度,单词的平均长度等等。
- 利用随机森林或者其它更强大的机器学习算法。
- 在剔除那些少见或者常见单词的时候,要尝试不同的阈值,找到最佳的为止。