我正在尝试根据以前喜欢的文章来构建一种算法,该算法能够预测我是否会喜欢该文章。
例子:
我在这里找到线索: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,然后将新的大向量与即将出现的每篇新文章进行比较。
但我想知道如何进行比较:
我不知道您是否理解我的意思,但在第一种情况下,大向量中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] 删除。
我来说两句