在信息爆炸的时代,如何从海量数据中快速提取有价值的信息成为了一个重要课题。关键词提取技术,作为一种文本分析手段,能够帮助在极短的时间内洞察文本主题,提炼出关键词汇。这项技术不仅节省了阅读全文的时间,还能在新闻文章中发现感兴趣的话题,或根据客户评论识别问题所在。
TF-IDF算法简介
TF-IDF算法是关键词提取中常用的一种技术,它通过计算词频(Term Frequency)和逆文档频率(Inverse Document Frequency)来衡量一个词在文档中的重要性。词频指的是一个词在文本中出现的次数,而逆文档频率则衡量一个词在所有文档中出现的频率。TF-IDF的值是这两个值的乘积,从而得到每个词的重要性得分。
Python实现TF-IDF算法
接下来,将通过Python代码逐步实现TF-IDF算法。首先,需要导入必要的库,包括用于分词的nltk库、用于排序的itemgetter以及用于计算对数的math库。然后,声明一个字符串变量,用于存放示例文本文档。
from nltk import tokenize
from operator import itemgetter
import math
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
# 声明示例文本文档
doc = '是一名毕业生。想学习Python。喜欢学习Python。Python很简单。Python很有趣。学习能提高思维能力。每个人都应该投入时间学习。'
接下来,需要去除停用词,这些词在文本中频繁出现,但对于分析可能并不重要。可以使用nltk库来去除这些词。
stop_words = set(stopwords.words('english'))
然后,需要计算文档中的总词数,这将用于计算词频。同时,也需要计算文档中的总句子数,这将用于计算逆文档频率。
total_words = doc.split()
total_word_length = len(total_words)
print(total_word_length)
total_sentences = tokenize.sent_tokenize(doc)
total_sent_len = len(total_sentences)
print(total_sent_len)
接下来,将计算每个非停用词的词频,并将其除以文档中的总词数。
tf_score = {}
for each_word in total_words:
each_word = each_word.replace('.','')
if each_word not in stop_words:
if each_word in tf_score:
tf_score[each_word] += 1
else:
tf_score[each_word] = 1
# 除以总词数
tf_score.update((x, y/int(total_word_length)) for x, y in tf_score.items())
print(tf_score)
为了计算逆文档频率,需要定义一个函数来检查一个词是否出现在句子列表中。
def check_sent(word, sentences):
final = [all([w in x for w in word]) for x in sentences]
sent_len = [sentences[i] for i in range(0, len(final)) if final[i]]
return int(len(sent_len))
然后,将使用这个函数来计算每个非停用词的逆文档频率,并进行对数运算和除法。
idf_score = {}
for each_word in total_words:
each_word = each_word.replace('.','')
if each_word not in stop_words:
if each_word in idf_score:
idf_score[each_word] = check_sent(each_word, total_sentences)
else:
idf_score[each_word] = 1
# 进行对数和除法运算
idf_score.update((x, math.log(int(total_sent_len)/
y)) for x, y in idf_score.items())
print(idf_score)
tf_idf_score = {key: tf_score[key] * idf_score.get(key, 0) for key in tf_score.keys()}
print(tf_idf_score)
def get_top_n(dict_elem, n):
result = dict(sorted(dict_elem.items(), key = itemgetter(1), reverse = True)[:n])
return result
print(get_top_n(tf_idf_score, 5))