构建词向量简单的有两种分别是TfidfTransformer和 CountVectorizer,这里探索一下他们的使用方法
第一种使用方法,先使用CountVectorizer对原始文本数据进行处理,转换成各个词的频率,没有出现的就是0(这里需要注意的是,直接忽略词汇的长度小于2的,这里的"我"直接被删除了), 然后再使用对产生的数字矩阵进行处理,从而产生tf-idf的矩阵,实例代码如下:
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
vectorizer = CountVectorizer()
corpus = ["我, 中国, 中国, 黄河",
"富强, 民主"]
corpus_vector = vectorizer.fit_transform(corpus)
words = vectorizer.get_feature_names()
print("模型中的词汇:", words) # 单词长度小于2的直接删除,不进入统计范围
print("原文转换为的向量:\n", corpus_vector) # 由于矩阵比较稀疏,所以只显示有数据的元素
print("原文转换为的向量:\n", corpus_vector.toarray())
transformer = TfidfTransformer()
tf_idf = transformer.fit_transform(corpus_vector)
weight = tf_idf.toarray()
print("文本数据的tf-idf的值:\n", weight)
产生的输出是:
模型中的词汇: ['中国', '富强', '民主', '黄河']
原文转换为的向量:
(0, 0) 2
(0, 3) 1
(1, 1) 1
(1, 2) 1
原文转换为的向量:
[[2 0 0 1]
[0 1 1 0]]
文本数据的tf-idf的值:
[[0.89442719 0. 0. 0.4472136 ]
[0. 0.70710678 0.70710678 0. ]]
这里需要指出的是,如果我们只想要特定的词汇, 而忽略其他的词汇,则可以在CountVectorizer()指定词汇,如下代码,这里忽略上面词汇中的"黄河":
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
vocabulary = [ "中国","富强", "民主"]
vectorizer = CountVectorizer(vocabulary=vocabulary)
corpus = ["我, 中国, 中国, 黄河",
"富强, 民主"]
corpus_vector = vectorizer.fit_transform(corpus)
words = vectorizer.get_feature_names()
print("模型中的词汇:\n", words) # 单词长度小于2的直接删除,不进入统计范围
print("原文转换为的向量:\n", corpus_vector.toarray())
transformer = TfidfTransformer()
tf_idf = transformer.fit_transform(corpus_vector)
weight = tf_idf.toarray()
print("文本数据的tf-idf的值:\n", weight)
产生的结果是,从这里可以看出,少了黄河的频率和tf-idf的数值
模型中的词汇:
['中国', '富强', '民主']
原文转换为的向量:
[[2 0 0]
[0 1 1]]
文本数据的tf-idf的值:
[[1. 0. 0. ]
[0. 0.70710678 0.70710678]]
第二种方法: TfidfTransformer也可以直接对原始的文本数据进行处理,但是他不会删除长度小于2 的词汇,为了测试与上面的数据得到的tf-idf结果一致,这里删除了"我"这个单字
from sklearn.feature_extraction.text import TfidfVectorizer
tfidfvector = TfidfVectorizer()
text = ["中国, 中国, 黄河",
"富强, 民主"]
tf_idf = tfidfvector.fit_transform(text)
weight = tf_idf.toarray()
print("每个单词的tf-idf的值:\n", weight)
结果如下,与上面的结果一致:
每个单词的tf-idf的值:
[[0.89442719 0. 0. 0.4472136 ]
[0. 0.70710678 0.70710678 0. ]]