最近学习使用了传统的自然语言处理技术进行关键词的提取,接下来我介绍一下两种常用的算法:TFIDF和TextRank。目前BiLSTM也可以用于提取文本关键词,有空再学。
1.TF-IDF
TF-IDF(term frequency-inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF-IDF是一种统计方法,用来评估一个字词对于一个文件集或语料库中的一份文件的重要程度。
首先解释一下TF-IDF的意思:
TF(term frequency):词语在一篇文章中出现的频率
IDF(inverse document frequency):反文档频率,与词语在其他文档中出现的频率负相关
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率高,即TF值高;并且在其他文章中很少出现,即IDF值高,那么认为这个词或短语具有很好的类别区分能力,适合作为该文章的关键词。
TF-IDF的具体计算公式为:
文档中词的tfidf值越高,便认为该词越可以代表该文档的主题。TF-IDF算法的python实现如下,同时jieba库中也实现了TF-IDF,有兴趣的话也可以去了解一下。
# TF-IDf算法python实现
import re
import math
# 获取一个文档中每个词的TF值,doc参数保存文档中的句子列表,返回单词与其tf值的字典
# 首先对文档中的单词进行切分,然后统计每个词的词频
def GetWordTF(doc):
words_count = 0 # 单词总数
words_map = {
} # 单词与单词数的映射
tf_map = {
} # tf值映射词典,格式: tf_map[word] = tf_word
for sentence in doc: # 遍历文档中的每个句子
# 单词的切分方式可以根据所给的数据格式进行修改
# 我将提取英文句子中的每个单词,使用正则表达式提取并去除空字符串
words_arr = [word for word in re.split(r'\W+',sentence) if word]
words_count += len(words_arr) # 统计有效词的总长度
for word in words_arr: # 遍历每一个词并进行统计单词数
words_map[word] = words_map.get(word,0) + 1
for key,val in words_map.items(): # 计算每个单词的tf值
tf_map[key] = val / words_count
return tf_map
# 获取文档每个单词在文档集docSet中的IDF值映射
def GetWordIDF(tfMap,docSet):
docs_num = len(docSet) # 文档集中文档的总数
word_doc_num = {
} # 包含word的文档数,格式为word_doc_num[word] = num of doc that contains word
idf_map = {
} # idf值映射字典,格式idf_map[word] = idf_word