当前位置:   article > 正文

TF-IDF关键词提取算法_tf-idf算法去除停用词

tf-idf算法去除停用词

1.基于统计特征的关键词提取算法

2.评估词的重要性的常见指标

3.TF-IDF算法

(1)概述

 (2)基本原理——①计算词频TF

(2)基本原理——②计算逆文档频率 IDF

 (2)基本原理——③计算TF-IDF

(3)算法流程

 (4)算法举例

(5)算法特点

TF-IDF关键词提取案例——用 TF-IDF 算法实现关键词提取。

1、数据预处理。对读取到的数据进行预处理,包括分词、去停用词和词性筛选, 处理完成后生成标记文件表示预处理部分完成

  1. # 停用词表
  2. stopWord = './data/stopWord.txt'
  3. stopkey = [w.strip() for w in codecs.open(stopWord, 'rb').readlines()]
  4. # 数据预处理操作:分词,去停用词,词性筛选
  5. def dataPrepos(text,stopkey):
  6. l = []
  7. pos = ['n','nz','v', 'vd', 'vn', 'l', 'a', 'd'] # 定义选取的词性
  8. seg = jieba.posseg.cut(text) #分词
  9. for i in seg:
  10. if i.word not in stopkey and i.flag in pos:# 去停用词 + 词性筛选
  11. l.append(i.word)
  12. return l

2构建TF-IDF模型,计算TF-IDF矩阵。

● 构建词频矩阵

 ● 计算语料中每个词语的TF-IDF权值

 ● 获取词袋模型中的关键词

 ● 获取TF-IDF矩阵

● 完成后生成标记文件 

  1. def get_tfidf(data):
  2. # 1、构建词频矩阵
  3. vectorizer = CountVectorizer()
  4. X = vectorizer.fit_transform(data) # 词频矩阵,a[i][j]:表示j词在第i个文本中的词频
  5. # 2、统计每个词的TF-IDF权值
  6. transformer = TfidfTransformer()
  7. tfidf = transformer.fit_transform(X)
  8. # 3、获取词袋模型中的关键词
  9. word = vectorizer.get_feature_names()
  10. # 4、获取TF-IDF矩阵,a[i][j]表示j词在i篇文本中的TF-IDF权重
  11. weight = tfidf.toarray()
  12. create__file('./data/flag3')

3、 排序输出关键词,将结果写入文件。 计算好每个词的 TF-IDF 权值之后,对权值进行排序,并以“词语,TF-IDF”的格式依次输出。 全部输出完毕后生成标记文件 表示环节完成,然后将结果写入文件 中。

  1. def getKeywords_tfidf(data, stopkey, topk):
  2. idList, titleList, abstractList = data['id'], data['title'], data['abstract']
  3. corpus = [] # 将所有文档输出到一个list中,一行就是一个文档
  4. for index in range(len(idList)):
  5. text = '%s。%s' % (titleList[index], abstractList[index]) # 拼接标题和摘要
  6. text = dataPrepos(text, stopkey) # 文本预处理
  7. text = " ".join(text) # 连接成字符串,空格分隔
  8. corpus.append(text)
  9. # 1、构建词频矩阵
  10. vectorizer = CountVectorizer()
  11. X = vectorizer.fit_transform(corpus) # 词频矩阵,a[i][j]:表示j词在第i个文本中的词频
  12. # 2、统计每个词的TF-IDF权值
  13. transformer = TfidfTransformer()
  14. tfidf = transformer.fit_transform(X)
  15. # 3、获取词袋模型中的关键词
  16. word = vectorizer.get_feature_names()
  17. # 4、获取TF-IDF矩阵,a[i][j]表示j词在i篇文本中的TF-IDF权重
  18. weight = tfidf.toarray()
  19. create__file('./data/flag3')
  20. # 5、打印词语权重
  21. ids, titles, keys = [], [], []
  22. for i in range(len(weight)):
  23. print(u"-------这里输出第", i + 1, u"篇文本的词语tf-idf------")
  24. ids.append(idList[i])
  25. titles.append(titleList[i])
  26. df_word, df_weight = [], [] # 当前文章的所有词汇列表、词汇对应权重列表
  27. for j in range(len(word)):
  28. print(word[j], weight[i][j])
  29. df_word.append(word[j])
  30. df_weight.append(weight[i][j])
  31. df_word = pd.DataFrame(df_word, columns=['word'])
  32. df_weight = pd.DataFrame(df_weight, columns=['weight'])
  33. word_weight = pd.concat([df_word, df_weight], axis=1) # 拼接词汇列表和权重列表
  34. word_weight = word_weight.sort_values(by='weight', ascending=False) # 按照权重值降序排列
  35. keyword = np.array(word_weight['word']) # 选择词汇列并转成数组格式
  36. word_split = [keyword[x] for x in range(0, topk)] # 抽取前topK个词汇作为关键词
  37. word_split = " ".join(word_split)
  38. keys.append(word_split)
  39. result = pd.DataFrame({"id": ids, "title": titles, "key": keys}, columns=['id', 'title', 'key'])
  40. create__file('./data/flag4')
  41. return result
  42. result = getKeywords_tfidf(data, stopkey, 10)
  43. # result.to_csv("./data/keys_TFIDF.csv", index=False)

5、完整代码

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

运行结果:

参考链接:自然语言处理 - 飞桨AI Studio星河社区-人工智能学习与实训社区 

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

闽ICP备14008679号