当前位置:   article > 正文

关键词提取_关键词提取数据集

关键词提取数据集

关键词提取使用的是人民网的粤经济新闻数据,分别实现基于TF-IDF、TextRank和Word2vec词聚类的关键词提取算法。该数据集共包含558个文本文件,每个文件的内容均为标题和摘要。

关键词提取的实现流程

(1)将原始数据处理成result.csv文本,具体编号、标题和摘要,Text.csv数据格式如图所示。

(2)获取每行记录的标题和摘要字段,并拼接这两个字段。

(3)加载自定义停用词表stopWord.txt,然后对拼接的文本进行数据预处理操作,包括分词、去除停用词、用空格分隔文本等。

(4)编写相应算法提取关键词。

(5)将最终结果写进文件进行保存。

项目地址:zz-zik/NLP-Application-and-Practice: 本项目将《自然语言处理与应用实战》原书中代码进行了实现,并在此基础上进行了改进。原书作者:韩少云、裴广战、吴飞等。 (github.com)

数据预处理

基于TF-IDF的关键词提取算法

data_prepare.py:数据预处理,合并文本文件,在data文件夹下生成text.csv文件,内容包括,id、title、key

  1. import os
  2. import csv
  3. # 文本文件合并
  4. def text_combine(path):
  5. # 1.获取文件列表
  6. files = []
  7. for file in os.listdir(path):
  8. if file.endswith(".txt"):
  9. files.append(path+"/"+file)
  10. # 2.创建text.csv文件,保存结果
  11. with open('data/text.csv','w',newline = '',encoding= 'utf-8') as csvfile:
  12. writer = csv.writer(csvfile)
  13. writer.writerow(['id','title','abstract'])
  14. # 3.遍历txt文件,获取文件编号
  15. for file_name in files:
  16. number = (file_name.split('/')[1].split('_')[0])
  17. title,text = '',''
  18. count = 0
  19. # 4.读取标题和内容
  20. with open(file_name,encoding='utf-8-sig') as f:
  21. for line in f:
  22. if count == 0:
  23. title += line.strip()
  24. else:
  25. text += line.strip()
  26. count += 1
  27. res = [number,title,text]
  28. writer.writerow(res)
  29. # 主函数处理
  30. def main():
  31. path = 'text_file'
  32. text_combine(path)
  33. if __name__ == '__main__':
  34. main()

基于TextRank的关键词提取算法

tfidf.py实现基于TextRank的关键词提取算法

  1. # coding=utf-8
  2. import codecs
  3. import pandas as pd
  4. import numpy as np
  5. # 导入jieba分词
  6. import jieba.posseg
  7. import jieba.analyse
  8. # 导入文本向量化函数
  9. from sklearn.feature_extraction.text import TfidfTransformer
  10. # 导入词频统计函数
  11. from sklearn.feature_extraction.text import CountVectorizer
  12. # 读取text.csv文件:分词,去停用词,词性筛选
  13. def data_read(text, stopkey):
  14. l = []
  15. pos = ['n', 'nz', 'v', 'vd', 'vn', 'l', 'a', 'd'] # 定义选取的词性
  16. seg = jieba.posseg.cut(text) # 分词
  17. for i in seg:
  18. if i.word not in stopkey and i.flag in pos: # 去停用词 + 词性筛选
  19. l.append(i.word)
  20. return l
  21. # tf-idf获取文本top10关键词
  22. def words_tfidf(data, stopkey, topK):
  23. idList, titleList, abstractList = \
  24. data['id'], data['title'], data['abstract']
  25. corpus = [] # 将所有文档输出到一个list中,一行就是一个文档
  26. for index in range(len(idList)):
  27. # 拼接标题和摘要
  28. text = '%s。%s' % (titleList[index], abstractList[index])
  29. text = data_read(text, stopkey) # 文本预处理
  30. text = " ".join(text) # 连接成字符串,空格分隔
  31. corpus.append(text)
  32. # 1、构建词频矩阵,将文本中的词语转换成词频矩阵
  33. vectorizer = CountVectorizer()
  34. # 词频矩阵,a[i][j]:表示j词在第i个文本中的词频
  35. X = vectorizer.fit_transform(corpus)
  36. # 2、统计每个词的tf-idf权值
  37. transformer = TfidfTransformer()
  38. tfidf = transformer.fit_transform(X)
  39. # 3、获取词袋模型中的关键词
  40. word = vectorizer.get_feature_names()
  41. # 4、获取tf-idf矩阵,a[i][j]表示j词在i篇文本中的tf-idf权重
  42. weight = tfidf.toarray()
  43. # 5、打印词语权重
  44. ids, titles, keys = [], [], []
  45. for i in range(len(weight)):
  46. print(u"-------这里输出第", i + 1, u"篇文本的词语tf-idf------")
  47. ids.append(idList[i])
  48. titles.append(titleList[i])
  49. df_word, df_weight = [], [] # 当前文章的所有词汇列表、词汇对应权重列表
  50. for j in range(len(word)):
  51. print(word[j], weight[i][j])
  52. df_word.append(word[j])
  53. df_weight.append(weight[i][j])
  54. df_word = pd.DataFrame(df_word, columns=['word'])
  55. df_weight = pd.DataFrame(df_weight, columns=['weight'])
  56. word_weight = pd.concat([df_word, df_weight], axis=1) # 拼接词汇列表和权重列表
  57. word_weight = word_weight.sort_values(by="weight", ascending=False) # 按照权重值降序排列
  58. keyword = np.array(word_weight['word']) # 选择词汇列并转成数组格式
  59. word_split = [keyword[x] for x in range(0, topK)] # 抽取前topK个词汇作为关键词
  60. word_split = " ".join(word_split)
  61. keys.append(word_split.encode("utf-8").decode("utf-8"))
  62. result = pd.DataFrame({"id": ids, "title": titles, "key": keys},
  63. columns=['id', 'title', 'key'])
  64. return result
  65. def main():
  66. # 读取数据集
  67. dataFile = 'data/text.csv'
  68. data = pd.read_csv(dataFile)
  69. # 停用词表
  70. stopkey = [w.strip() for w in codecs.open('data/stopWord.txt', 'r', encoding="utf-8").readlines()]
  71. # tf-idf关键词抽取
  72. result = words_tfidf(data, stopkey, 10)
  73. result.to_csv("result/tfidf.csv", index=False)
  74. if __name__ == '__main__':
  75. main()

构建文本数据的词向量

textrank.py:根据wiki.zh.text.vector词向量模型构建文本数据的词向量,并获取候选词语的词向量。

  1. # coding=utf-8
  2. import pandas as pd
  3. import jieba.analyse
  4. # 处理标题和摘要,提取关键词
  5. def words_textrank(data, topK):
  6. idList, titleList, abstractList = data['id'], data['title'], data['abstract']
  7. ids, titles, keys = [], [], []
  8. for index in range(len(idList)):
  9. # 拼接标题和摘要
  10. text = '%s。%s' % (titleList[index], abstractList[index])
  11. jieba.analyse.set_stop_words("data/stopWord.txt") # 加载自定义停用词表
  12. print("\"", titleList[index], "\"", " 10 Keywords - TextRank :")
  13. # TextRank关键词提取,词性筛选
  14. keywords = jieba.analyse.textrank(text, topK=topK,
  15. allowPOS=('n', 'nz', 'v','vd', 'vn','l', 'a', 'd'))
  16. word_split = " ".join(keywords)
  17. keys.append(word_split.encode("utf-8").decode("utf-8"))
  18. ids.append(idList[index])
  19. titles.append(titleList[index])
  20. result = pd.DataFrame({"id": ids, "title": titles,
  21. "key": keys},
  22. columns=['id', 'title', 'key'])
  23. return result
  24. def main():
  25. dataFile = 'data/text.csv'
  26. data = pd.read_csv(dataFile)
  27. result = words_textrank(data, 10)
  28. result.to_csv("result/textrank.csv", index=False)
  29. if __name__ == '__main__':
  30. main()

基于Word2vec词聚类的关键词提取算法

实现基于Word2vec词聚类的关键词提取算法

(1)编写word2vec_prepare.py,构建候选词向量

  1. # coding=utf-8
  2. import warnings
  3. warnings.filterwarnings(action='ignore',
  4. category=UserWarning,
  5. module='gensim') # 忽略警告
  6. import codecs
  7. import pandas as pd
  8. import numpy as np
  9. import jieba # 分词
  10. import jieba.posseg
  11. import gensim # 加载词向量模型
  12. # 返回特征词向量bai
  13. def word_vecs(wordList, model):
  14. name = []
  15. vecs = []
  16. for word in wordList:
  17. word = word.replace('\n', '')
  18. try:
  19. if word in model: # 模型中存在该词的向量表示
  20. name.append(word.encode('utf8').decode("utf-8"))
  21. vecs.append(model[word])
  22. except KeyError:
  23. continue
  24. a = pd.DataFrame(name, columns=['word'])
  25. b = pd.DataFrame(np.array(vecs, dtype='float'))
  26. return pd.concat([a, b], axis=1)
  27. # 数据预处理操作:分词,去停用词,词性筛选
  28. def data_prepare(text, stopkey):
  29. l = []
  30. # 定义选取的词性
  31. pos = ['n', 'nz', 'v', 'vd', 'vn', 'l', 'a', 'd']
  32. seg = jieba.posseg.cut(text) # 分词
  33. for i in seg:
  34. # 去重 + 去停用词 + 词性筛选
  35. if i.word not in l and i.word\
  36. not in stopkey and i.flag in pos:
  37. # print i.word
  38. l.append(i.word)
  39. return l
  40. # 根据数据获取候选关键词词向量
  41. def build_words_vecs(data, stopkey, model):
  42. idList, titleList, abstractList = data['id'], data['title'], data['abstract']
  43. for index in range(len(idList)):
  44. id = idList[index]
  45. title = titleList[index]
  46. abstract = abstractList[index]
  47. l_ti = data_prepare(title, stopkey) # 处理标题
  48. l_ab = data_prepare(abstract, stopkey) # 处理摘要
  49. # 获取候选关键词的词向量
  50. words = np.append(l_ti, l_ab) # 拼接数组元素
  51. words = list(set(words)) # 数组元素去重,得到候选关键词列表
  52. wordvecs = word_vecs(words, model) # 获取候选关键词的词向量表示
  53. # 词向量写入csv文件,每个词400维
  54. data_vecs = pd.DataFrame(wordvecs)
  55. data_vecs.to_csv('result/vecs/wordvecs_' + str(id) + '.csv', index=False)
  56. print ("document ", id, " well done.")
  57. def main():
  58. # 读取数据集
  59. dataFile = 'data/text.csv'
  60. data = pd.read_csv(dataFile)
  61. # 停用词表
  62. stopkey = [w.strip() for w in codecs.open('data/stopWord.txt', 'r', encoding='utf-8').readlines()]
  63. # 词向量模型
  64. inp = 'wiki.zh.text.vector'
  65. model = gensim.models.KeyedVectors.load_word2vec_format(inp, binary=False)
  66. build_words_vecs(data, stopkey, model)
  67. if __name__ == '__main__':
  68. main()

(2)编写word2vec_result.py,实现基于WordsVec词聚类的关键词提取算法

  1. # coding=utf-8
  2. import os
  3. # 导入kmeans聚类算法
  4. from sklearn.cluster import KMeans
  5. import pandas as pd
  6. import numpy as np
  7. import math
  8. # 对词向量采用K-means聚类抽取TopK关键词
  9. def words_kmeans(data, topK):
  10. words = data["word"] # 词汇
  11. vecs = data.iloc[:, 1:] # 向量表示
  12. kmeans = KMeans(n_clusters=1, random_state=10).fit(vecs)
  13. labels = kmeans.labels_ # 类别结果标签
  14. labels = pd.DataFrame(labels, columns=['label'])
  15. new_df = pd.concat([labels, vecs], axis=1)
  16. vec_center = kmeans.cluster_centers_ # 聚类中心
  17. # 计算距离(相似性) 采用欧几里得距离(欧式距离)
  18. distances = []
  19. vec_words = np.array(vecs) # 候选关键词向量,dataFrame转array
  20. vec_center = vec_center[0] # 第一个类别聚类中心,本例只有一个类别
  21. length = len(vec_center) # 向量维度
  22. for index in range(len(vec_words)): # 候选关键词个数
  23. cur_wordvec = vec_words[index] # 当前词语的词向量
  24. dis = 0 # 向量距离
  25. for index2 in range(length):
  26. dis += (vec_center[index2] - cur_wordvec[index2]) * \
  27. (vec_center[index2] - cur_wordvec[index2])
  28. dis = math.sqrt(dis)
  29. distances.append(dis)
  30. distances = pd.DataFrame(distances, columns=['dis'])
  31. # 拼接词语与其对应中心点的距离
  32. result = pd.concat([words, labels, distances], axis=1)
  33. # 按照距离大小进行升序排序
  34. result = result.sort_values(by="dis", ascending=True)
  35. # 抽取排名前topK个词语作为文本关键词
  36. wordlist = np.array(result['word'])
  37. # 抽取前topK个词汇
  38. word_split = [wordlist[x] for x in range(0, topK)]
  39. word_split = " ".join(word_split)
  40. return word_split
  41. def main():
  42. # 读取数据集
  43. dataFile = 'data/text.csv'
  44. articleData = pd.read_csv(dataFile)
  45. ids, titles, keys = [], [], []
  46. rootdir = "result/vecs" # 词向量文件根目录
  47. fileList = os.listdir(rootdir) # 列出文件夹下所有的目录与文件
  48. # 遍历文件
  49. for i in range(len(fileList)):
  50. filename = fileList[i]
  51. path = os.path.join(rootdir, filename)
  52. if os.path.isfile(path):
  53. # 读取词向量文件数据
  54. data = pd.read_csv(path, encoding='utf-8')
  55. # 聚类算法得到当前文件的关键词
  56. artile_keys = words_kmeans(data, 5)
  57. # 根据文件名获得文章id以及标题
  58. (shortname, extension) = os.path.splitext(filename)
  59. t = shortname.split("_")
  60. article_id = int(t[len(t) - 1]) # 获得文章id
  61. # 获得文章标题
  62. artile_tit = articleData[articleData.id ==
  63. article_id]['title']
  64. print(artile_tit)
  65. print(list(artile_tit))
  66. artile_tit = list(artile_tit)[0] # series转成字符串
  67. ids.append(article_id)
  68. titles.append(artile_tit)
  69. keys.append(artile_keys.encode("utf-8").decode("utf-8"))
  70. # 所有结果写入文件
  71. result = pd.DataFrame({"id": ids, "title": titles, "key": keys},
  72. columns=['id', 'title', 'key'])
  73. result = result.sort_values(by="id", ascending=True) # 排序
  74. result.to_csv("result/word2vec.csv", index=False,
  75. encoding='utf_8_sig')
  76. if __name__ == '__main__':
  77. main()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/424276
推荐阅读
相关标签
  

闽ICP备14008679号