赞
踩
目录
1 概述 1
2 开发环境准备 2
2.1 Python环境 2
2.2 第三方模块 2
3 数据准备 3
3.1 样本语料 3
3.2 停用词词典 4
4 基于TF-IDF的文本关键词提取方法 4
4.1 TF-IDF算法思想 4
4.2 TF-IDF文本关键词提取方法流程 5
4.3 代码实现 5
5 基于TextRank的文本关键词提取方法 6
5.1 PageRank算法思想 6
5.2 TextRank算法思想 7
5.3 代码实现 8
6 基于Word2Vec词聚类的文本关键词提取方法 8
6.1 Word2Vec词向量表示 9
6.2 K-means聚类算法 9
6.3 Word2Vec词聚类文本关键词提取方法流程 10
6.4 代码实现 11
7 结语 11
3 数据准备
3.1 样本语料
文本将汽车行业的10篇专利作为样本数据集,见文件“data/sample_data.csv”。文件中依顺序包含编号(id)、标题(title)和摘要(abstract)三个字段,其中标题和摘要都要参与到关键词的提取。各位可根据自己的样本数据进行数据读取相关代码的调整。
3.2 停用词词典
本文使用中科院计算所中文自然语言处理开放平台发布的中文停用词表,包含了1208个停用词。下载地址:http://www.hicode.cc/download/view-software-13784.html
另外,由于本实例的样本是专利文本,词汇专业性较高,需要人工新增停用词,可直接在上述停用词表中添加,一行为一个停用词,见文件“data/stopWord.txt”。在本例中,笔者在文件最前面人工新增了“包括、相对、免受、用于、本发明、结合”这六个停用词,用于示范,各位可根据实际情况自行删减或新增停用词。
4 基于TF-IDF的文本关键词提取方法
4.1 TF-IDF算法思想
词频(Term Frequency,TF)指某一给定词语在当前文件中出现的频率。由于同一个词语在长文件中可能比短文件有更高的词频,因此根据文件的长度,需要对给定词语进行归一化,即用给定词语的次数除以当前文件的总词数。
逆向文件频率(Inverse Document Frequency,IDF)是一个词语普遍重要性的度量。即如果一个词语只在很少的文件中出现,表示更能代表文件的主旨,它的权重也就越大;如果一个词在大量文件中都出现,表示不清楚代表什么内容,它的权重就应该小。
TF-IDF的主要思想是,如果某个词语在一篇文章中出现的频率高,并且在其他文章中较少出现,则认为该词语能较好的代表当前文章的含义。即一个词语的重要性与它在文档中出现的次数成正比,与它在语料库中文档出现的频率成反比。
计算公式如下:
#!/usr/bin/python # coding=utf-8 # 采用Word2Vec词聚类方法抽取关键词2——根据候选关键词的词向量进行聚类分析 import sys,os from sklearn.cluster import KMeans from sklearn.decomposition import PCA import pandas as pd import numpy as np import matplotlib.pyplot as plt import math # 对词向量采用K-means聚类抽取TopK关键词 def getkeywords_kmeans(data,topK): words = data["word"] # 词汇 vecs = data.ix[:,1:] # 向量表示 kmeans = KMeans(n_clusters=1,random_state=10).fit(vecs) labels = kmeans.labels_ #类别结果标签 labels = pd.DataFrame(labels,columns=['label']) new_df = pd.concat([labels,vecs],axis=1) df_count_type = new_df.groupby('label').size() #各类别统计个数 # print df_count_type vec_center = kmeans.cluster_centers_ #聚类中心 # 计算距离(相似性) 采用欧几里得距离(欧式距离) distances = [] vec_words = np.array(vecs) # 候选关键词向量,dataFrame转array vec_center = vec_center[0] # 第一个类别聚类中心,本例只有一个类别 length = len(vec_center) # 向量维度 for index in range(len(vec_words)): # 候选关键词个数 cur_wordvec = vec_words[index] # 当前词语的词向量 dis = 0 # 向量距离 for index2 in range(length): dis += (vec_center[index2]-cur_wordvec[index2])*(vec_center[index2]-cur_wordvec[index2]) dis = math.sqrt(dis) distances.append(dis) distances = pd.DataFrame(distances,columns=['dis']) result = pd.concat([words, labels ,distances], axis=1) # 拼接词语与其对应中心点的距离 result = result.sort_values(by="dis",ascending = True) # 按照距离大小进行升序排序 # 将用于聚类的数据的特征维度降到2维 # pca = PCA(n_components=2) # new_pca = pd.DataFrame(pca.fit_transform(new_df)) # print new_pca # 可视化 # d = new_pca[new_df['label'] == 0] # plt.plot(d[0],d[1],'r.') # d = new_pca[new_df['label'] == 1] # plt.plot(d[0], d[1], 'go') # d = new_pca[new_df['label'] == 2] # plt.plot(d[0], d[1], 'b*') # # plt.gcf().savefig('kmeans.png') # plt.show() # 抽取排名前topK个词语作为文本关键词 wordlist = np.array(result['word']) # 选择词汇列并转成数组格式 word_split = [wordlist[x] for x in range(0,topK)] # 抽取前topK个词汇 word_split = " ".join(word_split) return word_split def main(): # 读取数据集 dataFile = 'data/sample_data.csv' articleData = pd.read_csv(dataFile) ids, titles, keys = [], [], [] rootdir = "result/vecs" # 词向量文件根目录 fileList = os.listdir(rootdir) #列出文件夹下所有的目录与文件 # 遍历文件 for i in range(len(fileList)): filename = fileList[i] path = os.path.join(rootdir,filename) if os.path.isfile(path): data = pd.read_csv(path, encoding='utf-8') # 读取词向量文件数据 artile_keys = getkeywords_kmeans(data,10) # 聚类算法得到当前文件的关键词 # 根据文件名获得文章id以及标题 (shortname, extension) = os.path.splitext(filename) # 得到文件名和文件扩展名 t = shortname.split("_") article_id = int(t[len(t)-1]) # 获得文章id artile_tit = articleData[articleData.id==article_id]['title'] # 获得文章标题 artile_tit = list(artile_tit)[0] # series转成字符串 ids.append(article_id) titles.append(artile_tit) keys.append(artile_keys.encode("utf-8")) # 所有结果写入文件 result = pd.DataFrame({"id": ids, "title": titles, "key": keys}, columns=['id', 'title', 'key']) result = result.sort_values(by="id",ascending=True) # 排序 result.to_csv("result/keys_word2vec.csv", index=False) if __name__ == '__main__': main()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。