计算 Textacy 中单个单词的 TD-IDF
Calculate TD-IDF for a single word in Textacy
我正在尝试使用 Textacy 计算标准语料库中单个单词的 TF-IDF 分数,但我对收到的结果有点不清楚。
我期待一个代表语料库中单词频率的浮点数。那么,为什么我会收到 7 个结果的列表(?)?
"acculer" 实际上是一个法语单词,所以期望英语语料库的结果为 0。
word = 'acculer'
vectorizer = textacy.Vectorizer(tf_type='linear', apply_idf=True, idf_type='smooth')
tf_idf = vectorizer.fit_transform(word)
logger.info("tf_idf:")
logger.info(tfidf)
输出
tf_idf:
(0, 0) 2.386294361119891
(1, 1) 1.9808292530117262
(2, 1) 1.9808292530117262
(3, 5) 2.386294361119891
(4, 3) 2.386294361119891
(5, 2) 2.386294361119891
(6, 4) 2.386294361119891
问题的第二部分是如何将我自己的语料库提供给 Textacy 中的 TF-IDF 函数,尤其是。一个用不同的语言?
编辑
如@Vishal 所述,我使用此行记录了输出:
logger.info(vectorizer.vocabulary_terms)
似乎提供的单词 acculer
已被拆分为字符。
{'a': 0, 'c': 1, 'u': 5, 'l': 3, 'e': 2, 'r': 4}
(1) 如何获取这个词对语料库的 TF-IDF,而不是每个字符?
(2) 如何提供自己的语料库并将其作为参数指向?
(3) TF-IDF可以在句子级别使用吗?即:这句话的术语相对于语料库的相对频率是多少。
词对语料库可以获得TF-IDF。
docs = ['this is me','this was not that you thought', 'lets test them'] ## create a list of documents
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
vec.fit(docs) ##fit your documents
print(vec.vocabulary_) #print vocabulary, don't run for 2.5 million documents
输出:包含每个单词的 idf,并在输出中分配一个唯一索引
{u'me': 2, u'them': 6, u'that': 5, u'this': 7, u'is': 0, u'thought': 8, u'not': 3, u'lets': 1, u'test': 4, u'you': 10, u'was': 9}
print(vec.idf_)
输出:打印每个词汇的 idf 值
[ 1.69314718 1.69314718 1.69314718 1.69314718 1.69314718 1.69314718 1.69314718 1.28768207 1.69314718 1.69314718 1.69314718]
现在根据你的问题,假设你想为某个词找到 tf-idf,那么你可以得到它:
word = 'thought' #example
index = vec.vocabulary_[word]
>8
print(vec.idf_[index]) #prints idf value
>1.6931471805599454
参考:
1. prepare-text
现在用textacy做同样的操作
import spacy
nlp = spacy.load('en') ## install it by python -m spacy download en (run as administrator)
doc_strings = [
'this is me','this was not that you thought', 'lets test them'
]
docs = [nlp(string.lower()) for string in doc_strings]
corpus = textacy.Corpus(nlp,docs =docs)
vectorizer = textacy.Vectorizer(tf_type='linear', apply_idf=True, idf_type='smooth')
doc_term_matrix = vectorizer.fit_transform((doc.to_terms_list(ngrams=1, normalize='lower',as_strings=True,filter_stops=False) for doc in corpus))
print(vectorizer.terms_list)
print(doc_term_matrix.toarray())
输出
['is', 'lets', 'me', 'not', 'test', 'that', 'them', 'this', 'thought','was', 'you']
[[1.69314718 0. 1.69314718 0. 0. 0.
0. 1.28768207 0. 0. 0. ]
[0. 0. 0. 1.69314718 0. 1.69314718
0. 1.28768207 1.69314718 1.69314718 1.69314718]
[0. 1.69314718 0. 0. 1.69314718 0.
1.69314718 0. 0. 0. 0. ]]
参考:link
基础知识
让我们在研究实际问题之前弄清楚定义。
假设我们的语料库包含 3 个文档(分别为 d1、d2 和 d3):
corpus = ["this is a red apple", "this is a green apple", "this is a cat"]
词频 (tf)
tf(一个词的)定义为一个词在文档中出现的次数。
tf(word, document) = count(word, document) # Number of times word appears in the document
tf 是在文档级别为单词定义的。
tf('a',d1) = 1 tf('a',d2) = 1 tf('a',d3) = 1
tf('apple',d1) = 1 tf('apple',d2) = 1 tf('apple',d3) = 0
tf('cat',d1) = 0 tf('cat',d2) = 0 tf('cat',d3) = 1
tf('green',d1) = 0 tf('green',d2) = 1 tf('green',d3) = 0
tf('is',d1) = 1 tf('is',d2) = 1 tf('is',d3) = 1
tf('red',d1) = 1 tf('red',d2) = 0 tf('red',d3) = 0
tf('this',d1) = 1 tf('this',d2) = 1 tf('this',d3) = 1
使用原始计数存在一个问题,即与较短文档相比,较长文档中单词的 tf
值具有较高的值。这个问题可以通过除以文档长度(相应文档中的单词数)来归一化原始计数值来解决。这称为 l1
规范化。文档 d1
现在可以用 tf vector
表示,其中包含语料库词汇表中所有单词的所有 tf
值。还有另一种标准化称为 l2
,它使文档的 tf 向量的 l2
范数等于 1。
tf(word, document, normalize='l1') = count(word, document)/|document|
tf(word, document, normalize='l2') = count(word, document)/l2_norm(document)
|d1| = 5, |d2| = 5, |d3| = 4
l2_norm(d1) = 0.447, l2_norm(d2) = 0.447, l2_norm(d3) = 0.5,
代码:tf
corpus = ["this is a red apple", "this is a green apple", "this is a cat"]
# Convert docs to textacy format
textacy_docs = [textacy.Doc(doc) for doc in corpus]
for norm in [None, 'l1', 'l2']:
# tokenize the documents
tokenized_docs = [
doc.to_terms_list(ngrams=1, named_entities=True, as_strings=True, filter_stops=False, normalize='lower')
for doc in textacy_docs]
# Fit the tf matrix
vectorizer = textacy.Vectorizer(apply_idf=False, norm=norm)
doc_term_matrix = vectorizer.fit_transform(tokenized_docs)
print ("\nVocabulary: ", vectorizer.vocabulary_terms)
print ("TF with {0} normalize".format(norm))
print (doc_term_matrix.toarray())
输出:
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
TF with None normalize
[[1 1 0 0 1 1 1]
[1 1 0 1 1 0 1]
[1 0 1 0 1 0 1]]
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
TF with l1 normalize
[[0.2 0.2 0. 0. 0.2 0.2 0.2 ]
[0.2 0.2 0. 0.2 0.2 0. 0.2 ]
[0.25 0. 0.25 0. 0.25 0. 0.25]]
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
TF with l2 normalize
[[0.4472136 0.4472136 0. 0. 0.4472136 0.4472136 0.4472136]
[0.4472136 0.4472136 0. 0.4472136 0.4472136 0. 0.4472136]
[0.5 0. 0.5 0. 0.5 0. 0.5 ]]
tf
矩阵中的行对应于文档(因此我们的语料库有 3 行),列对应于词汇表中的每个词(词汇词典中显示的词的索引)
反向文档频率 (idf)
有些词传达的信息比其他词少。例如,像 the、a、an、this 这样的词是非常常见的词,它们传达的信息很少。 idf 是衡量单词重要性的指标。我们认为与出现在少数文档中的单词相比,出现在许多文档中的单词的信息量要少。
idf(word, corpus) = log(|corpus| / No:of documents containing word) + 1 # standard idf
对于我们的语料库直观来说idf(apple, corpus) < idf(cat,corpus)
idf('apple', corpus) = log(3/2) + 1 = 1.405
idf('cat', corpus) = log(3/1) + 1 = 2.098
idf('this', corpus) = log(3/3) + 1 = 1.0
代码:idf
textacy_docs = [textacy.Doc(doc) for doc in corpus]
tokenized_docs = [
doc.to_terms_list(ngrams=1, named_entities=True, as_strings=True, filter_stops=False, normalize='lower')
for doc in textacy_docs]
vectorizer = textacy.Vectorizer(apply_idf=False, norm=None)
doc_term_matrix = vectorizer.fit_transform(tokenized_docs)
print ("\nVocabulary: ", vectorizer.vocabulary_terms)
print ("standard idf: ")
print (textacy.vsm.matrix_utils.get_inverse_doc_freqs(doc_term_matrix, type_='standard'))
输出:
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
standard idf:
[1. 1.405 2.098 2.098 1. 2.098 1.]
Term Frequency–Inverse Document Frequency(tf-idf):tf-idf是衡量一个词在语料库中文档中重要性的指标。用它的 id 加权的词的 tf 给我们这个词的 tf-idf 度量。
tf-idf(word, document, corpus) = tf(word, docuemnt) * idf(word, corpus)
tf-idf('apple', 'd1', corpus) = tf('apple', 'd1') * idf('apple', corpus) = 1 * 1.405 = 1.405
tf-idf('cat', 'd3', corpus) = tf('cat', 'd3') * idf('cat', corpus) = 1 * 2.098 = 2.098
代码:tf-idf
textacy_docs = [textacy.Doc(doc) for doc in corpus]
tokenized_docs = [
doc.to_terms_list(ngrams=1, named_entities=True, as_strings=True, filter_stops=False, normalize='lower')
for doc in textacy_docs]
print ("\nVocabulary: ", vectorizer.vocabulary_terms)
print ("tf-idf: ")
vectorizer = textacy.Vectorizer(apply_idf=True, norm=None, idf_type='standard')
doc_term_matrix = vectorizer.fit_transform(tokenized_docs)
print (doc_term_matrix.toarray())
输出:
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
tf-idf:
[[1. 1.405 0. 0. 1. 2.098 1. ]
[1. 1.405 0. 2.098 1. 0. 1. ]
[1. 0. 2.098 0. 1. 0. 1. ]]
现在开始提问:
(1) How can I get the TF-IDF for this word against the corpus, rather
than each character?
如上所见,没有tf-idf
独立定义,一个词的tf-idf
是相对于语料库中的一篇文档而言的。
(2) How can I provide my own corpus and point to it as a param?
在上面的示例中显示。
- 使用 textacy.Doc api
将文本文档转换为文本文档
- Tokenzie textacy.Doc 使用 to_terms_list 方法。 (使用此方法,您可以在词汇表中添加 unigram、bigram 或 trigram,过滤停用词sm noramalize text 等)
- 使用 textacy.Vectorizer 从标记化的文档创建术语矩阵。返回的术语矩阵是
tf (raw counts): apply_idf=False, norm=None
tf (l1 normalized): apply_idf=False, norm='l1'
tf (l2 normalized): apply_idf=False, norm='l2'
tf-idf (standard): apply_idf=True, idf_type='standard'
(3) Can TF-IDF be used at a sentence level? ie: what is the relative
frequency of this sentence's terms against the corpus.
是的,当且仅当您将每个句子视为单独的文档时。在这种情况下,相应文档的 tf-idf
向量(整行)可以被视为文档的向量表示(在您的情况下是单个句子)。
在我们的语料库(实际上每个文档包含一个句子)的情况下,与向量 d1 和 d3 相比,d1 和 d2 的向量表示应该接近。让我们检查余弦相似度并查看:
cosine_similarity(doc_term_matrix)
输出
array([[1. , 0.53044716, 0.35999211],
[0.53044716, 1. , 0.35999211],
[0.35999211, 0.35999211, 1. ]])
如您所见,cosine_similarity(d1,d2) = 0.53 和 cosine_similarity(d1,d3) = 0.35,所以 d1 和 d2 确实比 d1 和 d3 更相似(1 是完全相似,0 不相似 - 正交向量)。
训练好 Vectorizer
后,您可以将训练好的对象保存到磁盘以备后用。
结论
一个词的 tf
是文档级的,一个词的 idf
是语料库级的,一个词的 tf-idf
是关于语料库的文档级的。它们非常适合文档(或当文档由单个句子组成时的句子)的矢量表示。如果您对单词的向量表示感兴趣,那么可以探索单词嵌入,例如(word2vec、fasttext、glove 等)。
我正在尝试使用 Textacy 计算标准语料库中单个单词的 TF-IDF 分数,但我对收到的结果有点不清楚。
我期待一个代表语料库中单词频率的浮点数。那么,为什么我会收到 7 个结果的列表(?)?
"acculer" 实际上是一个法语单词,所以期望英语语料库的结果为 0。
word = 'acculer'
vectorizer = textacy.Vectorizer(tf_type='linear', apply_idf=True, idf_type='smooth')
tf_idf = vectorizer.fit_transform(word)
logger.info("tf_idf:")
logger.info(tfidf)
输出
tf_idf:
(0, 0) 2.386294361119891
(1, 1) 1.9808292530117262
(2, 1) 1.9808292530117262
(3, 5) 2.386294361119891
(4, 3) 2.386294361119891
(5, 2) 2.386294361119891
(6, 4) 2.386294361119891
问题的第二部分是如何将我自己的语料库提供给 Textacy 中的 TF-IDF 函数,尤其是。一个用不同的语言?
编辑
如@Vishal 所述,我使用此行记录了输出:
logger.info(vectorizer.vocabulary_terms)
似乎提供的单词 acculer
已被拆分为字符。
{'a': 0, 'c': 1, 'u': 5, 'l': 3, 'e': 2, 'r': 4}
(1) 如何获取这个词对语料库的 TF-IDF,而不是每个字符?
(2) 如何提供自己的语料库并将其作为参数指向?
(3) TF-IDF可以在句子级别使用吗?即:这句话的术语相对于语料库的相对频率是多少。
词对语料库可以获得TF-IDF。
docs = ['this is me','this was not that you thought', 'lets test them'] ## create a list of documents
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
vec.fit(docs) ##fit your documents
print(vec.vocabulary_) #print vocabulary, don't run for 2.5 million documents
输出:包含每个单词的 idf,并在输出中分配一个唯一索引
{u'me': 2, u'them': 6, u'that': 5, u'this': 7, u'is': 0, u'thought': 8, u'not': 3, u'lets': 1, u'test': 4, u'you': 10, u'was': 9}
print(vec.idf_)
输出:打印每个词汇的 idf 值
[ 1.69314718 1.69314718 1.69314718 1.69314718 1.69314718 1.69314718 1.69314718 1.28768207 1.69314718 1.69314718 1.69314718]
现在根据你的问题,假设你想为某个词找到 tf-idf,那么你可以得到它:
word = 'thought' #example
index = vec.vocabulary_[word]
>8
print(vec.idf_[index]) #prints idf value
>1.6931471805599454
参考: 1. prepare-text
现在用textacy做同样的操作
import spacy
nlp = spacy.load('en') ## install it by python -m spacy download en (run as administrator)
doc_strings = [
'this is me','this was not that you thought', 'lets test them'
]
docs = [nlp(string.lower()) for string in doc_strings]
corpus = textacy.Corpus(nlp,docs =docs)
vectorizer = textacy.Vectorizer(tf_type='linear', apply_idf=True, idf_type='smooth')
doc_term_matrix = vectorizer.fit_transform((doc.to_terms_list(ngrams=1, normalize='lower',as_strings=True,filter_stops=False) for doc in corpus))
print(vectorizer.terms_list)
print(doc_term_matrix.toarray())
输出
['is', 'lets', 'me', 'not', 'test', 'that', 'them', 'this', 'thought','was', 'you']
[[1.69314718 0. 1.69314718 0. 0. 0.
0. 1.28768207 0. 0. 0. ]
[0. 0. 0. 1.69314718 0. 1.69314718
0. 1.28768207 1.69314718 1.69314718 1.69314718]
[0. 1.69314718 0. 0. 1.69314718 0.
1.69314718 0. 0. 0. 0. ]]
参考:link
基础知识
让我们在研究实际问题之前弄清楚定义。
假设我们的语料库包含 3 个文档(分别为 d1、d2 和 d3):
corpus = ["this is a red apple", "this is a green apple", "this is a cat"]
词频 (tf)
tf(一个词的)定义为一个词在文档中出现的次数。
tf(word, document) = count(word, document) # Number of times word appears in the document
tf 是在文档级别为单词定义的。
tf('a',d1) = 1 tf('a',d2) = 1 tf('a',d3) = 1
tf('apple',d1) = 1 tf('apple',d2) = 1 tf('apple',d3) = 0
tf('cat',d1) = 0 tf('cat',d2) = 0 tf('cat',d3) = 1
tf('green',d1) = 0 tf('green',d2) = 1 tf('green',d3) = 0
tf('is',d1) = 1 tf('is',d2) = 1 tf('is',d3) = 1
tf('red',d1) = 1 tf('red',d2) = 0 tf('red',d3) = 0
tf('this',d1) = 1 tf('this',d2) = 1 tf('this',d3) = 1
使用原始计数存在一个问题,即与较短文档相比,较长文档中单词的 tf
值具有较高的值。这个问题可以通过除以文档长度(相应文档中的单词数)来归一化原始计数值来解决。这称为 l1
规范化。文档 d1
现在可以用 tf vector
表示,其中包含语料库词汇表中所有单词的所有 tf
值。还有另一种标准化称为 l2
,它使文档的 tf 向量的 l2
范数等于 1。
tf(word, document, normalize='l1') = count(word, document)/|document|
tf(word, document, normalize='l2') = count(word, document)/l2_norm(document)
|d1| = 5, |d2| = 5, |d3| = 4
l2_norm(d1) = 0.447, l2_norm(d2) = 0.447, l2_norm(d3) = 0.5,
代码:tf
corpus = ["this is a red apple", "this is a green apple", "this is a cat"]
# Convert docs to textacy format
textacy_docs = [textacy.Doc(doc) for doc in corpus]
for norm in [None, 'l1', 'l2']:
# tokenize the documents
tokenized_docs = [
doc.to_terms_list(ngrams=1, named_entities=True, as_strings=True, filter_stops=False, normalize='lower')
for doc in textacy_docs]
# Fit the tf matrix
vectorizer = textacy.Vectorizer(apply_idf=False, norm=norm)
doc_term_matrix = vectorizer.fit_transform(tokenized_docs)
print ("\nVocabulary: ", vectorizer.vocabulary_terms)
print ("TF with {0} normalize".format(norm))
print (doc_term_matrix.toarray())
输出:
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
TF with None normalize
[[1 1 0 0 1 1 1]
[1 1 0 1 1 0 1]
[1 0 1 0 1 0 1]]
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
TF with l1 normalize
[[0.2 0.2 0. 0. 0.2 0.2 0.2 ]
[0.2 0.2 0. 0.2 0.2 0. 0.2 ]
[0.25 0. 0.25 0. 0.25 0. 0.25]]
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
TF with l2 normalize
[[0.4472136 0.4472136 0. 0. 0.4472136 0.4472136 0.4472136]
[0.4472136 0.4472136 0. 0.4472136 0.4472136 0. 0.4472136]
[0.5 0. 0.5 0. 0.5 0. 0.5 ]]
tf
矩阵中的行对应于文档(因此我们的语料库有 3 行),列对应于词汇表中的每个词(词汇词典中显示的词的索引)
反向文档频率 (idf)
有些词传达的信息比其他词少。例如,像 the、a、an、this 这样的词是非常常见的词,它们传达的信息很少。 idf 是衡量单词重要性的指标。我们认为与出现在少数文档中的单词相比,出现在许多文档中的单词的信息量要少。
idf(word, corpus) = log(|corpus| / No:of documents containing word) + 1 # standard idf
对于我们的语料库直观来说idf(apple, corpus) < idf(cat,corpus)
idf('apple', corpus) = log(3/2) + 1 = 1.405
idf('cat', corpus) = log(3/1) + 1 = 2.098
idf('this', corpus) = log(3/3) + 1 = 1.0
代码:idf
textacy_docs = [textacy.Doc(doc) for doc in corpus]
tokenized_docs = [
doc.to_terms_list(ngrams=1, named_entities=True, as_strings=True, filter_stops=False, normalize='lower')
for doc in textacy_docs]
vectorizer = textacy.Vectorizer(apply_idf=False, norm=None)
doc_term_matrix = vectorizer.fit_transform(tokenized_docs)
print ("\nVocabulary: ", vectorizer.vocabulary_terms)
print ("standard idf: ")
print (textacy.vsm.matrix_utils.get_inverse_doc_freqs(doc_term_matrix, type_='standard'))
输出:
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
standard idf:
[1. 1.405 2.098 2.098 1. 2.098 1.]
Term Frequency–Inverse Document Frequency(tf-idf):tf-idf是衡量一个词在语料库中文档中重要性的指标。用它的 id 加权的词的 tf 给我们这个词的 tf-idf 度量。
tf-idf(word, document, corpus) = tf(word, docuemnt) * idf(word, corpus)
tf-idf('apple', 'd1', corpus) = tf('apple', 'd1') * idf('apple', corpus) = 1 * 1.405 = 1.405
tf-idf('cat', 'd3', corpus) = tf('cat', 'd3') * idf('cat', corpus) = 1 * 2.098 = 2.098
代码:tf-idf
textacy_docs = [textacy.Doc(doc) for doc in corpus]
tokenized_docs = [
doc.to_terms_list(ngrams=1, named_entities=True, as_strings=True, filter_stops=False, normalize='lower')
for doc in textacy_docs]
print ("\nVocabulary: ", vectorizer.vocabulary_terms)
print ("tf-idf: ")
vectorizer = textacy.Vectorizer(apply_idf=True, norm=None, idf_type='standard')
doc_term_matrix = vectorizer.fit_transform(tokenized_docs)
print (doc_term_matrix.toarray())
输出:
Vocabulary: {'this': 6, 'is': 4, 'a': 0, 'red': 5, 'apple': 1, 'green': 3, 'cat': 2}
tf-idf:
[[1. 1.405 0. 0. 1. 2.098 1. ]
[1. 1.405 0. 2.098 1. 0. 1. ]
[1. 0. 2.098 0. 1. 0. 1. ]]
现在开始提问:
(1) How can I get the TF-IDF for this word against the corpus, rather than each character?
如上所见,没有tf-idf
独立定义,一个词的tf-idf
是相对于语料库中的一篇文档而言的。
(2) How can I provide my own corpus and point to it as a param?
在上面的示例中显示。
- 使用 textacy.Doc api 将文本文档转换为文本文档
- Tokenzie textacy.Doc 使用 to_terms_list 方法。 (使用此方法,您可以在词汇表中添加 unigram、bigram 或 trigram,过滤停用词sm noramalize text 等)
- 使用 textacy.Vectorizer 从标记化的文档创建术语矩阵。返回的术语矩阵是
tf (raw counts): apply_idf=False, norm=None
tf (l1 normalized): apply_idf=False, norm='l1'
tf (l2 normalized): apply_idf=False, norm='l2'
tf-idf (standard): apply_idf=True, idf_type='standard'
(3) Can TF-IDF be used at a sentence level? ie: what is the relative frequency of this sentence's terms against the corpus.
是的,当且仅当您将每个句子视为单独的文档时。在这种情况下,相应文档的 tf-idf
向量(整行)可以被视为文档的向量表示(在您的情况下是单个句子)。
在我们的语料库(实际上每个文档包含一个句子)的情况下,与向量 d1 和 d3 相比,d1 和 d2 的向量表示应该接近。让我们检查余弦相似度并查看:
cosine_similarity(doc_term_matrix)
输出
array([[1. , 0.53044716, 0.35999211],
[0.53044716, 1. , 0.35999211],
[0.35999211, 0.35999211, 1. ]])
如您所见,cosine_similarity(d1,d2) = 0.53 和 cosine_similarity(d1,d3) = 0.35,所以 d1 和 d2 确实比 d1 和 d3 更相似(1 是完全相似,0 不相似 - 正交向量)。
训练好 Vectorizer
后,您可以将训练好的对象保存到磁盘以备后用。
结论
一个词的tf
是文档级的,一个词的 idf
是语料库级的,一个词的 tf-idf
是关于语料库的文档级的。它们非常适合文档(或当文档由单个句子组成时的句子)的矢量表示。如果您对单词的向量表示感兴趣,那么可以探索单词嵌入,例如(word2vec、fasttext、glove 等)。