def compare(text1, text2): similarities = [] text1 = ("text_new:\n", text_new) text2 = ("text_old:\n", text_old) for i in range(len(text1)): for j in range(len(text2)): tf_idf_vectorizer = TfidfVectorizer() tf_idf_vectors = tf_idf_vectorizer.fit_transform([text1[i], text2[j]]) cosine_similarities = cosine_similarity(tf_idf_vectors) similarities.append(cosine_similarities[0, 1]) print (similarities)这段代码可以比较出结果,但结果会随着文本的增多而变小,怎么修改?
时间: 2024-02-19 10:58:49 浏览: 161
这段代码的问题在于每个文本都会与其他所有文本进行比较,并且每一次比较都会使用新的 TfidfVectorizer 对象进行计算。这样会导致计算出的相似度值被稀释,因为每个文本都会有很多与其他文本不相关的词汇。
为了解决这个问题,可以考虑以下几点:
1. 只比较最新的文本和之前的最后一个文本,而不是每个新文本都与之前的所有文本进行比较。
2. 保持一个全局的 TfidfVectorizer 对象,而不是每一次比较都创建一个新的对象。
3. 可以考虑使用其他的相似度算法,例如余弦相似度的变种。
下面是修改后的代码示例:
``` python
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 定义一个全局的 TfidfVectorizer 对象
tf_idf_vectorizer = TfidfVectorizer()
# 存储之前的文本
text_old = ""
def compare(text_new):
global text_old
similarities = []
# 比较最新的文本和之前的最后一个文本
tf_idf_vectors = tf_idf_vectorizer.fit_transform([text_old, text_new])
cosine_similarities = cosine_similarity(tf_idf_vectors)
similarities.append(cosine_similarities[0, 1])
# 更新之前的文本
text_old = text_new
return similarities
```
这个修改后的代码只会比较最新的文本和之前的最后一个文本,而不是每个新文本都与之前的所有文本进行比较。同时,我们使用了一个全局的 TfidfVectorizer 对象来计算相似度,保证了每次比较使用的都是同一个对象,避免了相似度被稀释的问题。
阅读全文