本篇博客将基于TF-IDF获取一段中文文本的嵌入/向量表示,文本是指包含一句或多句话的短文本。
完整代码
目录
1.导入必要的包
2. 数据集
3.基于TF-IDF获取文本嵌入表示
4.总结
5. 拓展阅读
1.导入必要的包
import sys,codecs
import pandas as pd
import numpy as np
import jieba.posseg
import jieba.analyse
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
2. 数据集
#读取数据集
dataFile = './data/sample_data.csv' #数据集路径
data = pd.read_csv(dataFile)
print(len(data)) #数据量
print(data.head(3)) #前三条数据
该数据集包含10条数据,每条数组有id,标题,摘要三个字段。
3.基于TF-IDF获取文本嵌入表示
#数据预处理
def dataPrepos(text):
l = []
pos = ['n','nz','v','vd','vn','l','a','d'] #定义选取的词性
seg = jieba.posseg.cut(text) #对文本进行分词和词性标注
for i in seg: #形式 [pair(word,flag),...]
if i.word and i.flag in pos: #词性筛选
l.append(i.word)
return l
#基于TF-IDF获取文本的嵌入表示
def getTfidfTextEmbedding(data):
#每条数据包含id title 和 abstract三个部分
idList, titleList, abstractList = data['id'], data['title'], data['abstract']
corpus = [] #将所有文本放在一个列表中,列表中的每一个元素代表一段文本
for index in range(len(idList)):#通过索引 遍历每条数据
text = '%s。%s' % (titleList[index],abstractList[index])#拼接标题和摘要
text = dataPrepos(text) #对拼接后的文本进行预处理 返回处理后的单词列表
text = " ".join(text) #用" "把列表中的单词连接起来 构成一个字符串
corpus.append(text)
#Step1:构建词频矩阵,将文本中的词语转换为词频矩阵
vectorizer = CountVectorizer()
'''
X是词频矩阵,X[i][j]表示第j个词在第i个文本中出现的次数
X的各个列对应词典中的各个单词
X的各个行对应各个文本
'''
X = vectorizer.fit_transform(corpus)
#Step2:统计每个词的tf-idf值
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
#Step3:获取词袋模型中的关键词 word为词典
word = vectorizer.get_feature_names()
print(len(word)) #词典大小
#Step4:获取tf-idf矩阵,weight[i][j]代表第j个词在第i个文本中的tf-idf值
'''
weight矩阵的每一行对应一段文本,为该文本的向量表示,维度与词典大小相同
向量中的值为该文本中词语的tf-idf值,0值表示该文本中没有出现该词
'''
weight = tfidf.toarray()
ids,titles,keys = [],[],[]
for i in range(len(weight)):#遍历每段文本
print(u"-------这里输出第", i+1 , u"篇文本中词语的tf-idf值(向量表示)------")
ids.append(idList[i])
titles.append(titleList[i])
df_word,df_weight = [],[] # 当前文章的所有词汇列表、词汇对应权重列表
for j in range(len(word)):
print (word[j],weight[i][j])
getTfidfTextEmbedding(data)
4.总结
- 综合所有的文本组成一个语料库,对语料库进行分词,去重,调整顺序得到词典(代码中的方法自动实现)。
- 每段文本都被表示成了一个237维的向量,237是词典的大小。
- 对于某个文本中出现的词,计算它的tf-idf值,并把该值填入该文本向量中对应的位置(对应该词在词典中的位置/索引)。
- 基于TF-IDF不仅可以得到文本的向量表示;还可以得到文本的关键词,在上述代码基础上,可以对文本中词语的TF-IDF值进行排序,选取前K个作为文本关键词,也可以像之前博客中介绍的那样,直接调包得到文本的关键词。
5. 拓展阅读
- python实现tfidf