赞
踩
考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化。
这时,需要一个语料库(corpus),用来模拟语言的使用环境。
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。
可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。
import jieba import numpy as np import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer # 定义一个更复杂的文本集 documents = [ '这是第一篇文章。这是一篇关于机器学习和人工智能的文章。', '这是第二篇文章,和第一篇文章类似。它也涉及到机器学习和人工智能的主题。', '这是第三篇文章,和前两篇文章完全不同。它讨论的是自然语言处理和文本挖掘的算法。', '这是第四篇文章,它涉及到深度学习和神经网络的最新进展。', '这是第五篇文章,它是一篇关于数据分析和数据可视化的文章。它介绍了如何使用Python进行数据分析和可视化。' ] # 自定义jieba分词函数 def tokenize_with_jieba(text): return ' '.join(jieba.cut(text)) # 对所有文档应用jieba分词 preprocessed_documents = [tokenize_with_jieba(doc) for doc in documents] # 创建TF-IDF模型对象,使用自定义的分词器(这里其实是identity,因为分词已经在前面完成了) vectorizer = TfidfVectorizer(tokenizer=lambda x: x.split()) # 这里我们不需要再次分词,所以只是简单地分割空格 # 将文本集转换为TF-IDF矩阵 tfidf_matrix = vectorizer.fit_transform(preprocessed_documents) # 将TF-IDF矩阵转换为pandas DataFrame df = pd.DataFrame(tfidf_matrix.toarray(), columns=vectorizer.get_feature_names_out()) # 输出每个单词的权重 print("单词\t权重值") for index, row in df.iterrows(): for word, weight in zip(df.columns, row): print(f"文档{index + 1}的'{word}'\t{weight}")
输出结果:
TF-IDF的优点是简单快速,而且容易理解。缺点是有时候用词频来衡量文章中的一个词的重要性不够全面,有时候重要的词出现的可能不够多,而且这种计算无法体现位置信息,无法体现词在上下文的重要性。如果要体现词的上下文结构,那么你可能需要使用word2vec算法来支持。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。