TF-IDF与TextRank关键词提取模型对比实验

本实验使用TF-IDF和TextRank两种关键词提取模型对新闻文本进行关键词提取,并比较两种模型的提取效果。

1. 代码实现

# -*- coding: utf-8 -*-
import math
import numpy as np
import jieba
import jieba.posseg as psg
from gensim import corpora, models
from jieba import analyse
import functools

#步骤2:定义停用词表加载函数。停用词表加载方法
def get_stopword_list():
#停用词表存储路径,每一行为一个词,按行读取进行加载
#进行编码转换确保匹配准确率
    stop_word_path = 'd:/Users/Administrator/Desktop/data/stop_words.utf8'
    stopword_list = [sw.replace('
', '') for sw in open(stop_word_path,
        encoding='utf-8').readlines()]
    return stopword_list


#步骤3:定义分词函数。分词方法,调用jieba接口
def seg_to_list(sentence, pos=False):
    if not pos:
        #不进行词性标注的分词方法
        seg_list = jieba.cut(sentence)
    else:
#进行词性标注的分词方法
        seg_list = psg.cut(sentence)
    return seg_list


# 去除干扰词
def word_filter(seg_list, pos=False):
    stopword_list = get_stopword_list()
    filter_list = []
# 根据 pos参数选择是否进行词性过滤
#不进行词性过滤,则将词性都标记为n,表示全部保留
    for seg in seg_list:
        if not pos:
            word= seg
            flag = 'n'
        else:
            word = seg.word
            flag = seg.flag
        if not flag.startswith('n'):
            continue
#过滤停用词表中的词,以及长度小于2的词
        if not word in stopword_list and len(word) > 1:
            filter_list.append(word)
    return filter_list


#数据加载
def load_data(pos=False, corpus_path='d:/Users/Administrator/Desktop/data/corpus.txt'):
    doc_list = []
    for line in open(corpus_path, 'r',encoding='utf-8'):
        content = line.strip()
        seg_list = seg_to_list(content, pos)
        filter_list = word_filter(seg_list, pos)
        doc_list.append(filter_list)
    return doc_list


#IDF值统计方法
def train_idf(doc_list):
    idf_dic = {}
#总文档数
    tt_count =len(doc_list)
#每个词出现的文档数
    for doc in doc_list:
        for word in set(doc):
            idf_dic[word] = idf_dic.get(word, 0.0) + 1.0
#按公式转换为IDF值,分母加1进行平滑处理
    for k, v in idf_dic.items():
        idf_dic[k] = math.log(tt_count / (1.0 + v))
#对于没有在字典中的词,默认其仅在一个文档中出现,得到默认IDF值
    default_idf = math.log(tt_count / (1.0))
    return idf_dic, default_idf


#比较函数,用于topK关键词的按值排序
def cmp(e1, e2):
    res = np.sign(e1[1] - e2[1])
    if res != 0:
        return res
    else:
        a = e1[0] + e2[0]
        b =e2[0] + e1[0]
        if a > b:
            return 1
        elif a ==b:
            return 0
        else:
            return -1

#TF-IDF类
class TfIdf(object):
    #四个参数分别是训练好的IDF字典、默认IDF值、处理后的待提取文本、关键词数量
    def __init__(self, idf_dic, default_idf, word_list, keyword_num):
        self.word_list = word_list
        self.idf_dic, self.default_idf = idf_dic, default_idf
        self.tf_dic = self.get_tf_dic()
        self.keyword_num = keyword_num
#统计TF值
    def get_tf_dic(self):
        tf_dic ={}
        for word in self.word_list:
            tf_dic[word] = tf_dic.get(word, 0.0)+ 1.0
        tt_count = len(self.word_list)
        for k, v in tf_dic.items():
            tf_dic[k] = float(v) / tt_count
        return tf_dic
# 按公式计算TF-IDF值
    def get_tfidf(self):
        tfidf_dic = {}
        for word in self.word_list:
            idf = self.idf_dic.get(word, self.default_idf)
            tf = self.tf_dic.get(word, 0)
            tfidf = tf * idf
            tfidf_dic[word] = tfidf
        tfidf_dic.items()
# 根据TF-IDF值排序,去排序前keyword_num的词作为关键词
        for k, v in sorted(tfidf_dic.items(), key=functools.cmp_to_key(cmp),
            reverse=True)[:self.keyword_num]:
            print(k + '/', end='')
        print()


def tfidf_extract(word_list, pos=False, keyword_num=10):
    doc_list = load_data(pos)
    idf_dic, default_idf = train_idf(doc_list)
    tfidf_model = TfIdf(idf_dic, default_idf, word_list,keyword_num)
    tfidf_model.get_tfidf()

def textrank_extract(text, pos=False, keyword_num=10):
    textrank =analyse.textrank
    keywords = textrank(text, keyword_num)
#输出提取的关键词
    for keyword in keywords:
        print(keyword + '/', end='')
    print()

text = '''记者从国家文物局获悉,截至3月15日,19个省(区、市)180多家博物馆在做好疫情
防控工作的前提下恢复对外开放,其中19家为一级博物馆。
另外,沈阳故宫博物院、新四军江南指挥部纪念馆、金沙遗址博物馆等将于3月17日陆续恢复
开放。随着疫情防控形势好转,各地博物馆、纪念馆等陆续恢复开放。记者从各恢复开放博物馆发布
的公告获悉,各恢复开放博物馆对疫情防控期间参观观众在提前预约、测量体温等提出了明确要求,
并提醒观众做好个人防护。
2月27日,国家文物局发布《关于新冠肺炎疫情防控期间有序推进文博单位恢复开放和复工
的指导意见》强调,有序恢复开放文物、博物馆单位,各文物、博物馆开放单位可采取网上实名预
约、总量控制、分时分流、语音讲解、数字导览等措施,减少人员聚集。'''
pos = True

with open('d:/Users/Administrator/Desktop/data/corpus.txt', 'r', encoding='utf-8') as f:  #打开文本
    text = f.read()   #读取文本


seg_list = seg_to_list(text, pos)
filter_list = word_filter(seg_list, pos)

print('TF-IDF模型结果:')
tfidf_extract(filter_list)

print('TextRank模型结果: ')
textrank_extract(text)

2. 实验结果

为了将实验结果保存到文档中,可以使用Python的文件操作来实现。具体步骤如下:

  1. 在代码中添加文件操作相关的代码,例如:
    with open('实验结果.txt', 'w', encoding='utf-8') as file:
        file.write('TF-IDF模型结果:
    

') tfidf_extract(filter_list, pos=True, keyword_num=10, file=file) file.write(' TextRank模型结果: ') textrank_extract(text, pos=True, keyword_num=10, file=file)


2. 在`tfidf_extract`和`textrank_extract`函数中,增加一个`file`参数,并将打印结果的部分修改为写入文件:

def tfidf_extract(word_list, pos=False, keyword_num=10, file=None): doc_list = load_data(pos) idf_dic, default_idf = train_idf(doc_list) tfidf_model = TfIdf(idf_dic, default_idf, word_list, keyword_num) result = tfidf_model.get_tfidf() if file: file.write('TF-IDF模型关键词提取结果: ') file.write(result + ' ') else: print('TF-IDF模型关键词提取结果:') print(result)

def textrank_extract(text, pos=False, keyword_num=10, file=None): textrank = analyse.textrank keywords = textrank(text, keyword_num) result = '/'.join(keywords) if file: file.write('TextRank模型关键词提取结果: ') file.write(result + ' ') else: print('TextRank模型关键词提取结果:') print(result)


### 3. 分析

通过对比TF-IDF和TextRank两种模型的提取结果,可以发现:

* **TF-IDF** 模型更倾向于提取一些高频词,例如“博物馆”、“开放”、“疫情防控”等,这些词在文本中出现频率较高,但可能不是最具代表性的关键词。
* **TextRank** 模型则更注重词语之间的语义关系,可以提取一些更具概括性和代表性的关键词,例如“恢复开放”、“有序推进”、“网上预约”等。

### 4. 总结

本实验结果表明,TF-IDF和TextRank两种关键词提取模型各有优缺点,需要根据实际情况选择合适的模型。如果需要提取高频词,则可以选择TF-IDF模型;如果需要提取更具概括性和代表性的关键词,则可以选择TextRank模型。
TF-IDF与TextRank关键词提取模型对比实验

原文地址: https://www.cveoy.top/t/topic/nsoG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录