阅读 497

利用朴素贝叶斯为掘金文章自动归类

俗话说:如果你手里握了一把锤子🔨,那么你看什么都像钉子。当我手握朴素贝叶斯之锤时,我看掘金文章的归类就像那颗等着被锤的钉子。

目前,用户在掘金发文章需要手动选择所发文章的类别。如果利用算法自动判断文章属于哪一类,那么就可以免去此步啦(单就此例而言,用户体验改善甚微,不过改造之后可以更好的进行内容分发)。

先说成果

抓了掘金前端类目下的文章标题 192 条,后端类目下的文章标题 969 条,人工智能类目下的文章 692 条。没做任何优化的朴素贝叶斯训练完的模型分类准确率为 0.79。

可以看到朴素贝叶斯在技术文章分类方面是很好的算法,仅利用不到2000条标题就可以做到 0.8 的 正确率,如果再添上文章内容,我猜可以做到准确率 0.9 以上。

怎么做的

数据获取

直接用采集器新建采集任务,比如八爪鱼、后羿之类的。将采集到的文章数据保存到本地。我用的是后羿采集器,每个类别一个采集任务,将抓到的数据保存为 Excel。

分词并计算 TF-IDF

TF—IDF 中 TF 是词频,指的是词 a 在待分类文档中出现的次数与待分类文档总词数之比。IDF 是逆文件频率,指的是在总的文档集合中包含了指定的词 a 的文档占比。

TF*IDF 就等于 TF-IDF 了。

比如文章 A 的标题里共8个词,出现了一次前端,而我抓取的1000条标题里有800条包含前端。那么 TF-IDF 就等于 1/8 * lg(1000/800)。

利用 TF-IDF 可以选出对单条标题重要,但是在所有标题中出现频率低的词。而这种词,正式区分文章类别的关键。

所以,计算 TF-IDF 的第一步是分词,用 jieba 分词来做:

import jieba
def cut_words(title):
    """
    对文本进行切词
    :param title: 文章标题
    :return: 以空格为间隔的词语列表
    """
    #  title 是 DataFrame 格式,强制转换为 string
    title = str(title)
    text_with_space = ''
    text_cutted = jieba.cut(text)
    for i in text_cutted:
        text_with_space += i + ' '
    return text_with_space
复制代码

TF—IDF 直接利用 sklearn 自带的 TfidfVectorizer 就可以计算。

from sklearn.feature_extraction.text import TfidfVectorizer
# stop_words:停止词
# x_train: 分词后的文本列表训练集
# x_test:分词后的文本列表测试集
tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5)
train_features = tf.fit_transform(x_train)
test_features = tf.transform(x_test) 
复制代码

代码中的 stop_words 是一个文本文件,里面保存了比如 的、我、等这些在中文中常见的连接词。因为这些词很普遍而且对文本分类没有帮助,所有在实际计算 TF-IDF 的时候就不算这些词了。

利用朴素贝叶斯训练模型

from sklearn.naive_bayes import MultinomialNB  
# alpha:平滑系数
clf = MultinomialNB(alpha=0.001).fit(train_features, y_train)
predicted_labels=clf.predict(test_features)
复制代码

predicted_labels 就是我利用文本分类模型预测的文章分类。 与实际值做对比:

from sklearn import metrics
metrics.accuracy_score(y_test, predicted_labels)
# output: 0.7931034482758621
复制代码

其它

掘金发展到现在,无数作者已经间接提供了大量准确标记的数据了。利用更多数据进行训练,选择合适的停止词词库并对文章标题进行一些必要的预处理,对一些关键词——比如前端、JavaScript、Android、Java 等增加权重,分类正确率到97%也未尝不可。

完整的代码可以点这里

想自己试试又懒得抓数据的同学可以关注我的微信公众号「数据科学与技术」(read_csv)回复 0720 获取我的数据。

关注下面的标签,发现更多相似文章
评论