我有大量已经计算了 TF-IDF 的文档。我正准备向集合中添加更多文档,我想知道是否有一种方法可以在不重新处理整个数据库的情况下将 TF-IDF 分数添加到新文档中?
我正在使用LETOR来建立一个信息检索系统.他们使用TF和IDF.我确信TF依赖于查询.但以色列国防军应该这样做,但是:
"请注意,IDF与文档无关,因此查询下的所有文档都具有相同的IDF值."
但这没有意义,因为IDF是功能列表的一部分.如何计算每份文件的IDF?
任何人都可以指导我阅读有关PageRank和Term Frequency - Inverse Document Frequency的比较的任何学术论文.我一直在寻找,我只是找到两者结合的论文.
我需要找到Page Rank相对于TF-IDF的优势
我正在使用朴素贝叶斯分类器.遵循本教程.对于训练好的数据,我使用308个问题并将它们分类为26个手动标记的类别.在发送数据之前,我正在执行NLP.在NLP我正在执行(标点符号删除,标记化,删除词和词干)这个过滤后的数据,用作mahout的输入.使用mahout NBC我训练这些数据并获得模型文件.现在,当我跑
mahout testnb
Run Code Online (Sandbox Code Playgroud)
命令我得到正确的分类实例为96%.
现在,对于我的测试数据,我使用了100个问题,我手动标记了这些问题.当我使用经过训练的模型和测试数据时,我得到的正确分类实例为1%.这让我感到沮丧.
任何人都可以告诉我我做错了什么或建议我一些方法来提高NBC的表现.
另外,理想情况下,我应该使用多少问题数据来训练和测试?
我有一些代码在文档集合上运行基本的TF-IDF矢量化器,返回DXF的稀疏矩阵,其中D是文档数,F是术语数.没问题.
但是如何在文档中找到特定术语的TF-IDF分数?即在术语(在他们的文本表示中)和它们在结果稀疏矩阵中的位置之间是否存在某种字典?
我有一段简单的代码,我正在尝试将其用作训练模型的基础.我试图从矢量化器中删除一个停用词列表,但似乎它不起作用.
或者也许是我,我并没有把它传递给它.
下面是我的代码,如果你安装了sklearn,你可以直接复制粘贴并运行它.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import GaussianNB
l_stop_words = ['is', 'me', 'i']
print type(l_stop_words)
tfvect = TfidfVectorizer(analyzer='word', token_pattern='[a-zA-Z.0-9+#-/]+[^.]', stop_words=l_stop_words)
tfvect2 = TfidfVectorizer(analyzer='word', token_pattern='[a-zA-Z.0-9+#-/]+[^.]')
corpus = [
'I know SQL and Java.',
'I like C# and NoSQL. SQL is fun also.',
'Teach me ASP.NET and Javascript.',
'C++ sounds cool and PL/SQL is amazing.']
X = tfvect.fit_transform(corpus)
Y = ['java developer', 'C# developer', 'web developer', 'C++ developer']
X2 = tfvect2.fit_transform(corpus)
print len(tfvect.get_feature_names()), tfvect.get_feature_names()
print len(tfvect2.get_feature_names()), tfvect2.get_feature_names()
Run Code Online (Sandbox Code Playgroud)
当两个特征向量相同时(下面是我的输出),您将看到.
<type …Run Code Online (Sandbox Code Playgroud) 我试着用俄语停止词来应用TfidfVectorizer
Tfidf = sklearn.feature_extraction.text.TfidfVectorizer(stop_words='russian' )
Z = Tfidf.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)
我明白了
ValueError: not a built-in stop list: russian
Run Code Online (Sandbox Code Playgroud)
当我使用英语停止词是正确的
Tfidf = sklearn.feature_extraction.text.TfidfVectorizer(stop_words='english' )
Z = Tfidf.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)
怎么改进呢?完全追溯
<ipython-input-118-e787bf15d612> in <module>()
1 Tfidf = sklearn.feature_extraction.text.TfidfVectorizer(stop_words='russian' )
----> 2 Z = Tfidf.fit_transform(X)
C:\Program Files\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in fit_transform(self, raw_documents, y)
1303 Tf-idf-weighted document-term matrix.
1304 """
-> 1305 X = super(TfidfVectorizer, self).fit_transform(raw_documents)
1306 self._tfidf.fit(X)
1307 # X is already a transformed view of raw_documents so
C:\Program Files\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in fit_transform(self, raw_documents, y)
815
816 vocabulary, X = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Apache Spark在TFIDF上计算余弦相似度矩阵。这是我的代码:
def cosSim(input: RDD[Seq[String]]) = {
val hashingTF = new HashingTF()
val tf = hashingTF.transform(input)
tf.cache()
val idf = new IDF().fit(tf)
val tfidf = idf.transform(tf)
val mat = new RowMatrix(tfidf)
val sim = mat.columnSimilarities
sim
}
Run Code Online (Sandbox Code Playgroud)
我在输入中大约有3000行,但是如果我执行sim.numRows()或sim.numCols(),我会看到1048576而不是3K,据我了解,这是因为val tfidf和val mat的大小均为3K * 1048576其中1048576是tf功能的数量。也许要解决这个问题,我必须移调垫子,但是我不知道该怎么做。
scala tf-idf cosine-similarity apache-spark apache-spark-mllib
我想在一组文档中找到最相关的词。
我想对3个文档调用Tf Idf算法,并返回包含每个单词及其频率的csv文件。
在那之后,我将只使用数量较大的那些,然后使用它们。
我发现此实现可以实现我所需的https://github.com/mccurdyc/tf-idf/。
我用subprocess图书馆叫那个罐子。但是该代码存在一个巨大的问题:它在分析单词时犯了很多错误。它混入了一些单词,并且与'and -(我认为)存在问题。我正在3本书(哈利·波特)的文本上使用它,例如,我正在获取诸如此类的单词,hermiones, hermionell, riddlehermione, thinghermione而不仅仅是hermione在csv文件中。
我做错什么了吗?您能给我Tf idf算法的有效实现吗?有没有这样做的python库?
我正在对来自葡萄牙历史的维基百科页面上的句子尝试TfidfVectorizer。但是我注意到该TfidfVec.fit_transform方法忽略了某些单词。这是我尝试过的句子:
sentence = "The oldest human fossil is the skull discovered in the Cave of Aroeira in Almonda."
TfidfVec = TfidfVectorizer()
tfidf = TfidfVec.fit_transform([sentence])
cols = [words[idx] for idx in tfidf.indices]
matrix = tfidf.todense()
pd.DataFrame(matrix,columns = cols,index=["Tf-Idf"])
Run Code Online (Sandbox Code Playgroud)
数据帧的输出:
本质上,它忽略了“ Aroeira”和“ Almonda”两个词。
但是我不想让它忽略那些话,那我该怎么办?我在文档中找不到他们谈论此内容的任何地方。
另一个问题是为什么“ the”一词会重复出现?该算法应该只考虑一个“ the”并计算其tf-idf吗?
tf-idf ×10
python ×5
scikit-learn ×3
nlp ×2
apache-spark ×1
hadoop ×1
mahout ×1
pagerank ×1
performance ×1
scala ×1
similarity ×1
words ×1