给出一个相关文档语料库(语料库)和一个随机文档语料库( ran_CORPUS ),我想用ran_CORPUS作为基线来计算语料库中所有单词的TF-以色列国防军分数。在我的项目中,ran_CORPUS的文档数量大约是语料库的10倍。
CORPUS = ['this is a relevant document',
'this one is a relevant text too']
ran_CORPUS = ['the sky is blue',
'my cat has a furry tail']我的计划是规范文档,将语料库中的所有文档转换为一个文档(现在,语料库是一个包含一个长字符串元素的列表)。在语料库中,我附加了所有的ran_CORPUS文档。然后,使用sklearn's TfidfTransformer,我将计算语料库(现在由语料库和ran_CORPUS组成)的TF-国防军矩阵。最后,选择该语料库的第一行,为我最初的相关语料库获取TF-以色列国防军的分数。
有谁知道这种方法是否有效,以及是否有一种简单的编码方法?
发布于 2018-11-17 01:19:33
当您说“这种方法是否有效”时,我想您的意思是是否将所有相关文档合并到一起并进行向量化,从而提供了一个有效的模型。我想这取决于你打算用那个模型做什么。
我不是个数学家,但我想这就像把所有文档的分数平均在一个向量空间中,所以你已经失去了空间的一些形状,原始的向量空间被单独的相关文档占据。所以,你试着制作一个“大师”或“原型”文件,这意味着代表一个主题?
如果您随后要做一些类似于测试文档的相似性匹配,或者通过距离比较进行分类,那么您可能已经失去了原始文档矢量化的一些微妙之处。总体主题可能比平均数所代表的方面更多。
更具体地说,假设您的原始“相关语料库”有两组文档,因为实际上有两个主要的子主题由不同的重要特性组所代表。稍后,在进行分类时,测试文档可以单独匹配这些集群中的任何一个,因为它们接近两个子主题中的一个。在这种情况下,通过对整个“相关语料库”进行平均处理,您将得到一个在这两个集群之间半途而废的文档,但两者都不能准确地表示。因此,测试演示文稿可能根本不匹配-取决于分类技术。
我认为,如果不对适当的特定身体进行试验,就很难说了。
不管其有效性如何,下面是如何实现的。
注意,您还可以使用TfidfVectorizer将矢量法和Tfidf‘’ing步骤结合在一起。结果并不总是完全相同,但在这种情况下它们是相同的。
此外,您还说对文档进行规范化--通常在输入需要标准化分布(如SVM)的分类算法之前,您可能会对向量表示进行规范化。然而,我认为TF国防军自然会正常化,因此它似乎不会有任何进一步的影响(我可能错了)。
import logging
from sklearn import preprocessing
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer, TfidfTransformer
CORPUS = ['this is a relevant document',
'this one is a relevant text too']
ran_CORPUS = ['the sky is blue',
'my cat has a furry tail']
doc_CORPUS = ' '.join([str(x) for x in CORPUS])
ran_CORPUS.append(doc_CORPUS)
count_vect = CountVectorizer()
X_counts = count_vect.fit_transform(ran_CORPUS)
tfidf_transformer = TfidfTransformer()
X_tfidf = tfidf_transformer.fit_transform(X_counts)
logging.debug("\nCount + TdidfTransform \n%s" % X_tfidf.toarray())
# or do it in one pass with TfidfVectorizer
vectorizer = TfidfVectorizer()
X_tfidf = vectorizer.fit_transform(ran_CORPUS)
logging.debug("\nTdidfVectoriser \n%s" % X_tfidf.toarray())
# normalising doesn't achieve much as tfidf is already normalised.
normalizer = preprocessing.Normalizer()
X_tfidf = normalizer.transform(X_tfidf)
logging.debug("\nNormalised:\n%s" % X_tfidf.toarray())
Count + TdidfTransform
[[0.52863461 0. 0. 0. 0. 0.40204024
0. 0. 0. 0.52863461 0. 0.
0.52863461 0. 0. ]
[0. 0.4472136 0. 0.4472136 0.4472136 0.
0.4472136 0. 0. 0. 0.4472136 0.
0. 0. 0. ]
[0. 0. 0.2643173 0. 0. 0.40204024
0. 0.2643173 0.52863461 0. 0. 0.2643173
0. 0.52863461 0.2643173 ]]
TdidfVectoriser
[[0.52863461 0. 0. 0. 0. 0.40204024
0. 0. 0. 0.52863461 0. 0.
0.52863461 0. 0. ]
[0. 0.4472136 0. 0.4472136 0.4472136 0.
0.4472136 0. 0. 0. 0.4472136 0.
0. 0. 0. ]
[0. 0. 0.2643173 0. 0. 0.40204024
0. 0.2643173 0.52863461 0. 0. 0.2643173
0. 0.52863461 0.2643173 ]]
Normalised:
[[0.52863461 0. 0. 0. 0. 0.40204024
0. 0. 0. 0.52863461 0. 0.
0.52863461 0. 0. ]
[0. 0.4472136 0. 0.4472136 0.4472136 0.
0.4472136 0. 0. 0. 0.4472136 0.
0. 0. 0. ]
[0. 0. 0.2643173 0. 0. 0.40204024
0. 0.2643173 0.52863461 0. 0. 0.2643173
0. 0.52863461 0.2643173 ]]https://stackoverflow.com/questions/53258578
复制相似问题