如何增加 CountVectorizer 单词的权重



我有一个我标记的文档,然后我拿另一个文档,通过计算它们的余弦相似性来比较两者。

但是,在我计算它们的相似性之前,我想事先增加其中一个单词的权重。我正在考虑通过将这个词的数量增加一倍来做到这一点,但我不知道该怎么做。

假设我有以下...

text = [
    "This is a test",
    "This is something else",
    "This is also a test"
]
test = ["This is something"]

接下来,我为两组文档定义停用词并调用CountVectorizer

stopWords = set(stopwords.words('english'))
vectorizer = CountVectorizer(stop_words=stopWords)
trainVectorizerArray = vectorizer.fit_transform(text).toarray()
testVectorizerArray = vectorizer.transform(test).toarray()

在下一部分中,我将计算余弦相似性...

cosine_function = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3)
for vector in trainVectorizerArray:
    print(vector)
    for testV in testVectorizerArray:
        print(testV)
        cosine = cosine_function(vector, testV)
        print(cosine)

但是,在我计算相似性之前,我如何增加其中一个单词的权重。假设在这个例子中我想增加something的权重,我该怎么做?我认为你通过增加字数来做到这一点,但我不知道如何增加字数。

我认为最简单的方法是将CountVectorizer get_feature_names函数与scipy.spatial.distance中的cosine函数结合使用。但请注意,这计算的是余弦距离而不是相似性,因此如果您只对相似性感兴趣,则必须使用 similarity = 1-distance 。使用您的示例

from scipy.spatial.distance import cosine
import numpy as np
word_weights = {'something': 2}
feature_names = vectorizer.get_feature_names()
weights = np.ones(len(feature_names))
for key, value in word_weights.items():
    weights[feature_names.index(key)] = value
for vector in trainVectorizerArray:
    print(vector)
    for testV in testVectorizerArray:
        print(testV)
        cosine_unweight = cosine(vector, testV)
        cosine_weighted = cosine(vector, testV, w=weights)
        print(cosine_unweight, cosine_weighted)

根据要求,对word_weights词典进行了更多的解释。这是您分配给其他单词的权重。除非您在word_weights字典中添加一个条目,否则每个权重都设置为 1,因此word_weights = {'test': 0}会从余弦相似性中删除"测试",但与其他单词相比word_weights = {'test': 1.5}会将权重增加 50%。如果需要,您还可以包含多个条目,例如word_weights = {'test': 1.5, 'something': 2}与其他单词相比,这将调整"test"和"something"的权重。

相关内容

最新更新