使用scikit-learn预测有趣的文章

摩根大通

我正在尝试根据以前喜欢的文章来构建一种算法,该算法能够预测我是否会喜欢该文章。

例子:

  • 我读了50篇文章,我喜欢10篇。我告诉我的程序我喜欢它们。
  • 然后有20篇新文章。我的程序必须根据我以前喜欢的10篇文章,为每篇新文章给我一个“喜欢的百分比”。

我在这里找到线索:Python:tf-idf-cosine:查找文档相似性

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> from sklearn.datasets import fetch_20newsgroups
>>> twenty = fetch_20newsgroups()
>>> tfidf = TfidfVectorizer().fit_transform(twenty.data)

然后,将数据集中的第一个文档与数据集中的其他文档进行比较:

>>> from sklearn.metrics.pairwise import linear_kernel
>>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten()
>>> cosine_similarities
array([ 1.        ,  0.04405952,  0.11016969, ...,  0.04433602,
    0.04457106,  0.03293218])

就我而言,我想要做的是将我的10篇文章的文本连接起来,运行TfidfVectorizer,然后将新的大向量与即将出现的每篇新文章进行比较。

但我想知道如何进行比较:

  • 大向量(10条)与小向量或
  • 小家伙比大家伙

我不知道您是否理解我的意思,但在第一种情况下,大向量中90%的单词不会出现在小向量中。

所以我的问题是:余弦相似度如何计算?您觉得我的项目有更好的方法吗?

绿色

一个朴素贝叶斯分类器的性能应该更好。您的问题类似于经典的垃圾邮件分类问题。就您而言,您不是要识别垃圾邮件(您不喜欢的东西),而是要识别火腿(您喜欢的文章)。

从前50个带有标签的文章中,可以很容易地计算出以下统计数据:

p(word1|like)   -- among all the articles I like, the probability of word1 appears
p(word2|like)   -- among all the articles I like, the probability of word2 appears
...
p(wordn|like)   -- among all the articles I like, the probability of wordn appears

p(word1|unlike) -- among all the articles I do not like, the prob of word1 appears
...

p(like)  -- the portion of articles I like (should be 0.2 in your example)
p(unlike) -- the portion of articles I do not like. (0.8)

然后给出第51个新示例,您应该在其中找到所有看到的单词,例如,其中仅包含word2和word5。关于朴素贝叶斯的妙处之一是它只关心词汇中的单词大向量中甚至超过90%的词都不会出现在新向量中,这不是问题,因为所有不相关的特征在不影响结果的情况下会相互抵消。

似然比将是

   prob(like|51th article)      p(like) x p(word2|like) x p(word5|like)
 ---------------------------- = -----------------------------------------
   prob(unlike|51th article)    p(unlike)xp(word2|unlike)xp(word5|unlike)

只要比率> 1,就可以将文章预测为“喜欢”。此外,如果要提高识别“喜欢的”商品的精度,可以通过将阈值比率值从1.0增加到更大的值来发挥精确召回平衡。另一方面,如果要增加召回率,可以降低阈值等。

有关文本域中朴素贝叶斯分类的更多信息,请参见此处

可以轻松修改此算法以进行在线学习,即,一旦用户“喜欢”或“不喜欢”新示例,就更新学习的模型。由于上述统计表中的所有内容基本上都是归一化的计数。只要保留每个计数(每个单词)和保存的总数,就可以按实例更新模型。

要将单词的tf-idf权重用于朴素贝叶斯,我们将权重视为单词的计数。即,如果没有tf-idf,则每个文档中的每个单词均计为1;使用tf-idf时,文档中的单词将视为其TF-IDF权重。然后,使用相同的公式即可得出朴素贝叶斯的概率。这个想法可以在本文中找到我认为scikit-learn中多项式朴素贝叶斯分类器应该接受tf-idf权重作为输入数据。

请参阅有关MultinomialNB的注释:

多项式朴素贝叶斯分类器适用于具有离散特征的分类(例如,用于文本分类的字数统计)。多项式分布通常需要整数特征计数。但是,实际上,小数计数(例如tf-idf)也可能起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用scikit-learn预测有趣的文章

来自分类Dev

使用for循环进行有趣的练习

来自分类Dev

如何使用 scikit learn 预测目标标签

来自分类Dev

django-使用'else:'-有趣的情况

来自分类Dev

解析XML:使用ElementTree查找有趣的元素

来自分类Dev

使用 Pandas Styler 着色背景返回有趣的结果

来自分类Dev

有什么办法可以在Python中使用scikit-learn来预测每月的时间序列?

来自分类Dev

如何使用scikit-learn评估预测的置信度得分

来自分类Dev

Scikit-Learn:使用DBSCAN预测新点

来自分类Dev

使用scikit-learn的Imputer模块预测缺失值

来自分类Dev

使用scikit-learn预测电影评论

来自分类Dev

使用scikit-learn预测单个值会导致ValueError

来自分类Dev

使用scikit-learn预测电影评论

来自分类Dev

在循环中对带有空格的字符串使用 scanf 时的有趣行为

来自分类Dev

在Jinja 2中使用正则表达式制作有趣的剧本

来自分类Dev

使用递归的整数除法-以及其他一些有趣的限制

来自分类Dev

使用Java中的BigInteger有趣地生成Lucas系列

来自分类Dev

关于使用RxJ和Typescript进行类型推断的有趣故事

来自分类Dev

使用Google Cloud Winston Logging(Nodejs)记录前后的有趣角色

来自分类Dev

为什么使用eBPF的用户空间版本很有趣?

来自分类Dev

使用动态分配的数组的C ++函数中有趣的语法错误

来自分类Dev

使用API返回哪种日期和时间格式最有趣

来自分类Dev

如何使用scikit的Surprise做出预测?

来自分类Dev

有趣的拼图

来自分类Dev

有趣的classCastException

来自分类Dev

使用scikit-learn训练多维数据

来自分类Dev

使用scikit-learn让熊猫玩得开心

来自分类Dev

使用Scikit Learn进行Unigram分析

来自分类Dev

使用scikit-learn处理分类特征

Related 相关文章

热门标签

归档