我正在学习第1 部分和第2 部分提供的教程.不幸的是,作者没有时间进行涉及使用余弦相似性的最后一节实际找到两个文档之间的距离.我在文章的示例中借助stackoverflow中的以下链接,包括上面链接中提到的代码(只是为了让生活更轻松)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords
import numpy as np
import numpy.linalg as LA
train_set = ["The sky is blue.", "The sun is bright."] # Documents
test_set = ["The sun in the sky is bright."] # Query
stopWords = stopwords.words('english')
vectorizer = CountVectorizer(stop_words = stopWords)
#print vectorizer
transformer = TfidfTransformer()
#print transformer
trainVectorizerArray = vectorizer.fit_transform(train_set).toarray()
testVectorizerArray = vectorizer.transform(test_set).toarray()
print 'Fit Vectorizer to train set', trainVectorizerArray …Run Code Online (Sandbox Code Playgroud) 我需要比较存储在数据库中的文档,并得出0到1之间的相似性得分.
我需要使用的方法必须非常简单.实现n-gram的vanilla版本(可以定义要使用的克数),以及tf-idf和余弦相似度的简单实现.
有没有可以做到这一点的程序?或者我应该从头开始写这个?
我一直在和CountVectorizerscikit-learn 一起上课.
据我所知,如果以下面显示的方式使用,最终输出将包含一个包含要素计数或标记的数组.
这些令牌是从一组关键字中提取的,即
tags = [
"python, tools",
"linux, tools, ubuntu",
"distributed systems, linux, networking, tools",
]
Run Code Online (Sandbox Code Playgroud)
下一步是:
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(tokenizer=tokenize)
data = vec.fit_transform(tags).toarray()
print data
Run Code Online (Sandbox Code Playgroud)
我们得到的地方
[[0 0 0 1 1 0]
[0 1 0 0 1 1]
[1 1 1 0 1 0]]
Run Code Online (Sandbox Code Playgroud)
这很好,但我的情况有点不同.
我想以与上面相同的方式提取功能,但我不希望这些行data与从中提取功能的文档相同.
换句话说,我怎样才能得到另一组文件的计数,比方说,
list_of_new_documents = [
["python, chicken"],
["linux, cow, ubuntu"],
["machine learning, bird, fish, pig"]
]
Run Code Online (Sandbox Code Playgroud)
得到:
[[0 0 0 1 0 0]
[0 1 …Run Code Online (Sandbox Code Playgroud) 我是scikit-learn的新手,我TfidfVectorizer用来在一组文档中找到术语的tfidf值.我用下面的代码来获得相同的代码.
vectorizer = TfidfVectorizer(stop_words=u'english',ngram_range=(1,5),lowercase=True)
X = vectorizer.fit_transform(lectures)
Run Code Online (Sandbox Code Playgroud)
现在如果我打印X,我能够看到矩阵中的所有条目,但我如何根据tfidf分数找到前n个条目.除此之外,是否有任何方法可以帮助我找到基于每个ngram的tfidf得分的前n个条目,即unigram,bigram,trigram等中的顶级条目?
我正在尝试使用Sklearn的TfidfVectorizer对象获取单个文档的tf-idf向量.我根据一些训练文档创建词汇表,并使用fit_transform训练TfidfVectorizer.然后,我想找到任何给定测试文档的tf-idf向量.
from sklearn.feature_extraction.text import TfidfVectorizer
self.vocabulary = "a list of words I want to look for in the documents".split()
self.vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word',
stop_words='english')
self.vect.fit_transform(self.vocabulary)
...
doc = "some string I want to get tf-idf vector for"
tfidf = self.vect.transform(doc)
Run Code Online (Sandbox Code Playgroud)
问题是这会返回一个包含n行的矩阵,其中n是我的doc字符串的大小.我希望它只返回一个代表整个字符串的tf-idf的向量.我怎样才能将字符串视为单个文档,而不是每个字符都是文档?另外,我对文本挖掘很新,所以如果我在概念上做错了,那就太棒了.任何帮助表示赞赏.
我正在使用scikit中的TfidfVectorizer学习从文本数据中提取一些特征.我有一个带有分数的CSV文件(可以是+1或-1)和一个评论(文本).我将这些数据导入DataFrame,以便运行Vectorizer.
这是我的代码:
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
df = pd.read_csv("train_new.csv",
names = ['Score', 'Review'], sep=',')
# x = df['Review'] == np.nan
#
# print x.to_csv(path='FindNaN.csv', sep=',', na_rep = 'string', index=True)
#
# print df.isnull().values.any()
v = TfidfVectorizer(decode_error='replace', encoding='utf-8')
x = v.fit_transform(df['Review'])
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误的追溯:
Traceback (most recent call last):
File "/home/PycharmProjects/Review/src/feature_extraction.py", line 16, in <module>
x = v.fit_transform(df['Review'])
File "/home/b/hw1/local/lib/python2.7/site- packages/sklearn/feature_extraction/text.py", line 1305, in fit_transform
X = super(TfidfVectorizer, self).fit_transform(raw_documents)
File "/home/b/work/local/lib/python2.7/site-packages/sklearn/feature_extraction/text.py", line 817, in fit_transform …Run Code Online (Sandbox Code Playgroud) 我有一个包含大约800万条新闻文章的语料库,我需要将它们的TFIDF表示为稀疏矩阵.我已经能够使用scikit-learn来获得相对较少数量的样本,但我相信它不能用于如此庞大的数据集,因为它首先将输入矩阵加载到内存中,这是一个昂贵的过程.
有谁知道,提取大型数据集的TFIDF向量的最佳方法是什么?
如何找到矢量之间的余弦相似度?
我需要找到相似度来衡量两行文本之间的相关性.
例如,我有两个句子,如:
用户界面系统
用户界面机器
...和tF-idf之后的各自向量,然后使用LSI进行归一化,例如
[1,0.5]和[0.5,1].
如何衡量这些向量之间的熟悉程度?
我对以下关于TF-IDF和Cosine Similarity的评论感到困惑.
我正在读取两个,然后在维基相似性下的维基上我发现这句话"在信息检索的情况下,两个文档的余弦相似度将在0到1的范围内,因为术语频率(tf-idf权重)不能两个术语频率向量之间的角度不能大于90."
现在我想知道......他们不是两件不同的东西吗?
tf-idf已经在余弦相似之内吗?如果是,那么到底是什么 - 我只能看到内点产品和欧几里德长度.
我认为tf-idf是你在文本上运行余弦相似之前可以做的事情.我错过了什么?
IDF的公式是log(N/df t)而不是N/df t.
其中N =集合中的总文档,df t =术语t的文档频率.
据说使用日志是因为它"抑制"了IDF的影响.这是什么意思?
另外,为什么我们使用对数频率的对数频率称量,如下所示:
