关键词提取

一、关键词提取技术概述

在信息爆炸的时代,很多信息我们无法全面接收,我们需要从中筛选出一些我们感兴趣的或者说对我们有用的信息进行接收。怎么选择呢,关键词提取就是其中一个很好的方法。如果我们可以准确地将所有文档都用几个简单的关键词描述出来,单看几个关键词就可以了解一篇文章,这样会大大提高我们的信息获取效率。

类似于其他的机器学习方法,关键词提取算法一般也可以分为有监督和无监督两类:

  1.有监督

主要通过分类的方式进行,通过构建一个丰富和完善的词表,然后通过判断每个文档与词表中每个词的匹配程度,以类似打标签的方式,从而达到关键词提取的效果。能够获得较高精度,但是需要大批量的标注数据,人工成本较高;

  2.无监督

这种方式无需人工生成、维护的词表,同时也不需要人工标注语料辅助进行训练,这类方法目前主要有 TF-IDF 算法、 TextRank 算法和主题模型算法( LSA 、 LSI 、 LDA 等);

二、去除停用词

 停用词简介

停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为 Stop Words(停用词)。这些停用词都是人工输入、非自动化生成的,生成后的停用词会形成一个停用词表。

但是,并没有一个明确的停用词表能够适用于所有的工具。甚至有一些工具是明确地避免使用停用词来支持短语搜索的。

 停用词的类别

对于一个给定的目的,任何一类的词语都可以被选作停用词。通常意义上,停用词大致分为两类:

1、人类语言中包含的功能词:这些功能词极其普遍,与其他词相比,功能词没有什么实际含义,比如 the、is、at、which、on 等。但是对于搜索引擎来说,当所要搜索的短语包含功能词,特别是像 The Who、Take That 等复合名词时,停用词的使用就会导致问题。

2、词汇词:比如 want 等,这些词应用十分广泛,但是对这样的词搜索引擎无法保证能够给出真正相关的搜索结果,难以帮助缩小搜索范围,同时还会降低搜索的效率,所以通常会把这些词从问题中移去,从而提高搜索性能。

 停用词的功能

文档中如果大量使用 Stop words 容易对页面中的有效信息造成噪音干扰,所以搜索引擎在运算之前都要对所索引的信息进行消除噪音的处理。了解了 Stop Words ,在网页内容中适当地减少停用词出现的频率,可以有效地帮助我们提高关键词密度,在网页标题标签中避免出现停用词能够让所优化的关键词更集中、更突出。

因此,我们在进行自然语言处理的过程中,经常会使用停用词表去除文本中的停用词,以提高文本处理效率。常见步骤有:

  1. 找到一个合适的停用词表;

  2. 对文本内容进行遍历,去除文本中的停用词并保存。  

 代码参考

# 停用词表加载方法
def get_stopword_list():
    # 停用词表存储路径,每一行为一个词,按行读取进行加载
    # 进行编码转换确保匹配准确率
    stop_word_path = './stopword.txt'
    stopword_list = [sw.replace('\n', '') for sw in open(stop_word_path,encoding='utf-8').readlines()]
    return stopword_list

if __name__ == '__main__':
    text=input()
    result=""
    # 任务:使用停用词表去掉text文本中的停用词,并将结果保存至result变量
    # ********** Begin *********#
    
    filtered_tokens = [word for word in text if word not in get_stopword_list()]
    result = "".join(filtered_tokens)

    # ********** End **********#

    print(result,end="")

三、TF/IDF 算法

是一种基于统计的计算方法

TF-IDF 的主要思想是:如果某个单词在一篇文章中出现的频率(TF)高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类

1、TF 是词频( Term Frequency )

词频( TF )表示词条(关键字)在文本中出现的频率。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。计算公式为: TFw​=该类中所有词条数目在某一类中词条w出现的次数​

2、IDF 是逆向文件频率( Inverse Document Frequency )

某一特定词语的 IDF ,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到

3、TF-IDF 实际上是:TF * IDF

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的 TF-IDF 。因此,TF-IDF 倾向于过滤掉常见的词语,保留重要的词语。计算公式为: TF-IDF=TF∗IDF

文本预处理

import jieba
import jieba.posseg
import numpy as np
import pandas as pd
import math
import operator

'''
提供Python内置的部分操作符函数,这里主要应用于序列操作
用于对大型语料库进行主题建模,支持TF-IDF、LSA和LDA等多种主题模型算法,提供了
诸如相似度计算、信息检索等一些常用任务的API接口
'''
from gensim import corpora, models

"""
Gensim是一个开源的自然语言处理库,主要用于处理文本数据,并支持多种任务,包括文档相似度计算、主题建模、文本分类、信息检索等。它旨在使文本处理更加高效、简单和有趣。Gensim支持多种文本格式,包括txt、csv、json等,并提供了预处理功能,如分词、停用词过滤、词干提取等。

Gensim最著名的功能是主题建模,它使用Latent Dirichlet Allocation(LDA)算法,这种算法可以将文档集合分解成一组主题,并为每个主题分配一组词汇。除了主题建模之外,Gensim还提供了其他有用的功能,例如词向量表示、文档相似度计算、TF-IDF计算等。它还支持训练自己的词向量模型,如Word2Vec和FastText。
"""

text = '''嫦娥五号实现我国首次地外天体起飞
科技日报北京12月3日电 (李晨 记者付毅飞)记者从国家航天局获悉,12月3日23时10分,嫦娥五号上升器3000牛发动机工作约6分钟,成功将携带样品的上升器送入到预定环月轨道。这是我国首次实现地外天体起飞。
与地面起飞不同,嫦娥五号上升器月面起飞不具备成熟的发射塔架系统,着陆器相当于上升器的“临时塔架”,上升器起飞存在起飞初始基准与起飞平台姿态不确定、发动机羽流导流空间受限、地月环境差异等问题。另外由于月球上没有导航星座,上升器起飞后,需在地面测控辅助下,借助自身携带的特殊敏感器实现自主定位、定姿。
点火起飞前,着上组合体实现月面国旗展开以及上升器、着陆器的解锁分离。此次国旗展开是我国在月球表面首次实现国旗的“独立展示”。点火起飞后,上升器经历垂直上升、姿态调整和轨道射入三个阶段,进入预定环月飞行轨道。随后,上升器将与环月等待的轨返组合体交会对接,将月球样品转移到返回器,后者将等待合适的月地入射窗口,做好返回地球的准备。'''

# 获取停用词
def Stop_words():
    stopword = []
    data = []
    f = open('./stopword.txt', encoding='utf8')
    for line in f.readlines():
        data.append(line)
    for i in data:
        output = i.replace('\n', '')
        stopword.append(output)
    return stopword

# 采用jieba进行词性标注,对当前文档过滤词性和停用词
def Filter_word(text):
    filter_word = []
    stopword = Stop_words()
    text = jieba.posseg.cut(text)
    for word, flag in text:
        if flag.startswith('n') is False:
            continue
        if not word in stopword and len(word) > 1:
            filter_word.append(word)
    return filter_word

# 加载文档集,对文档集过滤词性和停用词
def Filter_words(data_path='./corpus.txt'):
    document = []
    for line in open(data_path, 'r', encoding='utf8'):
        segment = jieba.posseg.cut(line.strip())
        filter_words = []
        stopword = Stop_words()
        for word, flag in segment:
            if flag.startswith('n') is False:
                continue
            if not word in stopword and len(word) > 1:
                filter_words.append(word)
        document.append(filter_words)
    return document

TF/IDF 算法

def tf_idf():
    # 统计TF值
    tf_dict = {}
    filter_word = Filter_word(text)
    for word in filter_word:
        if word not in tf_dict:
            tf_dict[word] = 1
        else:
            tf_dict[word] += 1
    for word in tf_dict:
        tf_dict[word] = tf_dict[word] / len(text)
    # 统计IDF值
    idf_dict = {}
    document = Filter_words()
    doc_total = len(document)
    for doc in document:
        for word in set(doc):
            if word not in idf_dict:
                idf_dict[word] = 1
            else:
                idf_dict[word] += 1
    for word in idf_dict:
        idf_dict[word] = math.log(doc_total / (idf_dict[word] + 1))
    # 计算TF-IDF值
    tf_idf_dict = {}
    for word in filter_word:
        if word not in idf_dict:
            idf_dict[word] = 0
        tf_idf_dict[word] = tf_dict[word] * idf_dict[word]
    # 提取前10个关键词
    keyword = 10
    print('TF-IDF模型结果:')
    for key, value in sorted(tf_idf_dict.items(), key=operator.itemgetter(1),
                             reverse=True)[:keyword]:
        print(key + '/', end='')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值