本篇博客将基于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)) #前三条数据

python 使用现成语料库进行中文语义相似度 python 中文语义分析_自然语言处理(NLP)

该数据集包含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)

python 使用现成语料库进行中文语义相似度 python 中文语义分析_自然语言处理(NLP)_02

4.总结

  • 综合所有的文本组成一个语料库,对语料库进行分词,去重,调整顺序得到词典(代码中的方法自动实现)。
  • 每段文本都被表示成了一个237维的向量,237是词典的大小。
  • 对于某个文本中出现的词,计算它的tf-idf值,并把该值填入该文本向量中对应的位置(对应该词在词典中的位置/索引)。
  • 基于TF-IDF不仅可以得到文本的向量表示;还可以得到文本的关键词,在上述代码基础上,可以对文本中词语的TF-IDF值进行排序,选取前K个作为文本关键词,也可以像之前博客中介绍的那样,直接调包得到文本的关键词。

5. 拓展阅读

  • python实现tfidf