用TF-IDF算法提取中文文档关键词、词云展示文章内容

       先使用jieba进行文档内容的分词处理,再利用TfidfVectorizer进行 tf-idf的计算,最后在根据其值进行排序,最后输出排行前十的关键词。

相关原理介绍请参考:文本关键词提取(TF与TF-IDF)-CountVectorizer()和TfidfVectorizer()

#coding:utf-8
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba

text = """
"1月29日,货拉拉开始与武汉的连锁便利店Today合作,为武汉40多家医院免费运送餐食。如有战,召必回,我从那天开始随时待命。后来我加入了货拉拉武汉爱心司机支援群,现在志愿司机已经108人了。 我每天早上六点多钟起床,从家里到取餐地黄陂再到协和医院,需在武汉跨越几个区。早上要预留两三个小时来应对限行和出餐点排队轮候、拥堵的问题。为医院运送完餐食后,我还要去运送别的物资。运送的第一批救援物资是给同济医院的防护服,最远是给孝感的医院送防护服。平均每天要跑2-3趟,有时跑4-5趟。没地方吃午饭,想吃泡面也没开水,中午只能吃点饼干。但是我知道,怎么也不能让一线的战士饿着肚子打仗,我早到一点,医院的人就能早些吃到饭菜。我是个人司机,武汉禁行,我本来是不能私下参与运送物资的。货拉拉负责与政府部门沟通,拿到配送通行证,然后将配送任务派发给我们,我们这些司机就根据订单需要去完成定向的物资配送。图 /视觉中国 我的家人都在武汉,还有一个小孙女。为了做好自我防护,我每天都穿防护服,车上备着酒精和消毒水,车辆每天消毒2到3次。数不清每天洗多少次手,只知道手都洗得开裂了。我还在车上放了一个睡袋,我跟家里人说,如果自己被感染,就睡车上,不回家了。 我觉得一线的医护人员才是真正的战士,不能让他们饿着肚子。所以即便在春节假期,我也一直在一线工作,在现场配送物资。即便是封城了,我们也要去做点什么,没有理由退缩。"
"""
sentences = text.split()
sent_words = [list(jieba.cut(sent0)) for sent0 in sentences]
document = [" ".join(sent0) for sent0 in sent_words]
print('词料:', document)

tfidf_model = TfidfVectorizer().fit(document)
# 得到语料库所有不重复的词
feature = tfidf_model.get_feature_names()
print(feature)
# ['一切', '一条', '便是', '全宇宙', '天狗', '日来', '星球']
# 得到每个特征对应的id值:即上面数组的下标
print(tfidf_model.vocabulary_)
# {'一条': 1, '天狗': 4, '日来': 5, '一切': 0, '星球': 6, '全宇宙': 3, '便是': 2}

# 每一行中的指定特征的tf-idf值:
sparse_result = tfidf_model.transform(document)
# print(sparse_result)

# 每一个语料中包含的各个特征值的tf-idf值:
# 每一行代表一个预料,每一列代表这一行代表的语料中包含这个词的tf-idf值,不包含则为空
weight = sparse_result.toarray()

# 构建词与tf-idf的字典:
feature_TFIDF = {}
for i in range(len(weight)):
    for j in range(len(feature)):
        # print(feature[j], weight[i][j])
        if feature[j] not in feature_TFIDF:
            feature_TFIDF[feature[j]] = weight[i][j]
        else:
            feature_TFIDF[feature[j]] = max(feature_TFIDF[feature[j]], weight[i][j])
# print(feature_TFIDF)
# 按值排序:
print('TF-IDF 排名前十的:')
featureList = sorted(feature_TFIDF.items(), key=lambda kv: (kv[1], kv[0]), reverse=True)
for i in range(1, 10 if len(featureList) > 10 else len(featureList)):
    print(featureList[i][0], featureList[i][1])

'''
词云展示
'''
from wordcloud import WordCloud
from scipy.misc import imread

# 整理文本:
# words = '一切 一条 便是 全宇宙 天狗 日来 星球' # 样例
words = document[0]
# print(words)
# 设置显示的形状图片:
b_mask = imread('./image/ciyun.webp')
# 绘制词图:
wc = WordCloud(
    background_color="white", #背景颜色
    max_words=2000, #显示最大词数
    font_path="./image/simkai.ttf",  #使用字体
    # min_font_size=5,
    # max_font_size=80, # 最大字体
    # width=400,  #图幅宽度
    mask=b_mask   #显示的形状图片
)
wc.generate(words)
# 准备一个写入的背景图片
wc.to_file("./image/beijing_2.jpg")

用TF-IDF算法提取中文文档关键词、词云展示文章内容_第1张图片

输出结果:
词料: ['" 1 月 29 日 , 货 拉拉 开始 与 武汉 的 连锁 便利店 Today 合作 , 为 武汉 40 多家 医院 免费 运送 餐食 。 如有战 , 召必回 , 我 从 那天 开始 随时 待命 。 后来 我 加入 了 货 拉拉 武汉 爱心 司机 支援 群 , 现在 志愿 司机 已经 108 人 了 。', '我 每天 早上 六点 多 钟 起床 , 从 家里 到 取餐 地 黄陂 再 到 协和医院 , 需在 武汉 跨越 几个 区 。 早上 要 预留 两三个 小时 来 应对 限行 和 出 餐点 排队 轮候 、 拥堵 的 问题 。 为 医院 运送 完 餐食 后 , 我 还要 去 运送 别的 物资 。 运送 的 第一批 救援 物资 是 给 同济 医院 的 防护服 , 最远 是 给 孝感 的 医院 送 防护服 。 平均 每天 要 跑 2 - 3 趟 , 有时 跑 4 - 5 趟 。 没 地方 吃 午饭 , 想 吃 泡面 也 没 开水 , 中午 只能 吃点 饼干 。 但是 我 知道 , 怎么 也 不能 让 一线 的 战士 饿着肚子 打仗 , 我 早到 一点 , 医院 的 人 就 能 早些 吃 到 饭菜 。 我 是 个人 司机 , 武汉 禁行 , 我 本来 是 不能 私下 参与 运送 物资 的 。 货 拉拉 负责 与 政府部门 沟通 , 拿到 配送 通行证 , 然后 将 配送 任务 派 发给 我们 , 我们 这些 司机 就 根据 订单 需要 去 完成 定向 的 物资 配送 。 图', '/ 视觉 中国', '我 的 家人 都 在 武汉 , 还有 一个 小孙女 。 为了 做好 自我 防护 , 我 每天 都 穿 防护服 , 车上 备着 酒精 和 消毒水 , 车辆 每天 消毒 2 到 3 次 。 数不清 每天 洗 多少 次手 , 只 知道 手 都 洗 得 开裂 了 。 我 还 在 车上 放 了 一个 睡袋 , 我 跟 家里人 说 , 如果 自己 被 感染 , 就 睡 车上 , 不 回家 了 。', '我 觉得 一线 的 医护人员 才 是 真正 的 战士 , 不能 让 他们 饿着肚子 。 所以 即便 在 春节假期 , 我 也 一直 在 一线 工作 , 在 现场 配送 物资 。 即便 是 封城 了 , 我们 也 要 去 做点 什么 , 没有 理由 退缩 。 "']
['108', '29', '40', 'today', '一个', '一点', '一直', '一线', '不能', '两三个', '个人', '中午', '中国', '为了', '什么', '他们', '任务', '但是', '便利店', '做好', '做点', '免费', '六点', '几个', '别的', '加入', '医护人员', '医院', '午饭', '协和医院', '即便', '参与', '发给', '取餐', '只能', '召必回', '司机', '吃点', '合作', '同济', '后来', '回家', '地方', '备着', '多家', '多少', '如有战', '如果', '孝感', '完成', '定向', '家人', '家里', '家里人', '封城', '小孙女', '小时', '工作', '已经', '平均', '应对', '开始', '开水', '开裂', '待命', '志愿', '怎么', '感染', '我们', '战士', '所以', '打仗', '拉拉', '拥堵', '拿到', '排队', '支援', '政府部门', '救援', '数不清', '早上', '早些', '早到', '春节假期', '最远', '有时', '本来', '根据', '次手', '武汉', '每天', '沟通', '没有', '泡面', '消毒', '消毒水', '然后', '爱心', '物资', '现在', '现场', '理由', '真正', '睡袋', '知道', '禁行', '私下', '第一批', '自己', '自我', '视觉', '觉得', '订单', '负责', '起床', '跨越', '车上', '车辆', '轮候', '运送', '还有', '还要', '这些', '连锁', '退缩', '通行证', '那天', '配送', '酒精', '问题', '防护', '防护服', '限行', '随时', '需在', '需要', '预留', '餐点', '餐食', '饭菜', '饼干', '饿着肚子', '黄陂']
{'29': 1, '拉拉': 72, '开始': 61, '武汉': 89, '连锁': 123, '便利店': 18, 'today': 3, '合作': 38, '40': 2, '多家': 44, '医院': 27, '免费': 21, '运送': 119, '餐食': 138, '如有战': 46, '召必回': 35, '那天': 126, '随时': 133, '待命': 64, '后来': 40, '加入': 25, '爱心': 97, '司机': 36, '支援': 76, '现在': 99, '志愿': 65, '已经': 58, '108': 0, '每天': 90, '早上': 80, '六点': 22, '起床': 114, '家里': 52, '取餐': 33, '黄陂': 142, '协和医院': 29, '需在': 134, '跨越': 115, '几个': 23, '预留': 136, '两三个': 9, '小时': 56, '应对': 60, '限行': 132, '餐点': 137, '排队': 75, '轮候': 118, '拥堵': 73, '问题': 129, '还要': 121, '别的': 24, '物资': 98, '第一批': 107, '救援': 78, '同济': 39, '防护服': 131, '最远': 84, '孝感': 48, '平均': 59, '有时': 85, '地方': 42, '午饭': 28, '泡面': 93, '开水': 62, '中午': 11, '只能': 34, '吃点': 37, '饼干': 140, '但是': 17, '知道': 104, '怎么': 66, '不能': 8, '一线': 7, '战士': 69, '饿着肚子': 141, '打仗': 71, '早到': 82, '一点': 5, '早些': 81, '饭菜': 139, '个人': 10, '禁行': 105, '本来': 86, '私下': 106, '参与': 31, '负责': 113, '政府部门': 77, '沟通': 91, '拿到': 74, '配送': 127, '通行证': 125, '然后': 96, '任务': 16, '发给': 32, '我们': 68, '这些': 122, '根据': 87, '订单': 112, '需要': 135, '完成': 49, '定向': 50, '视觉': 110, '中国': 12, '家人': 51, '还有': 120, '一个': 4, '小孙女': 55, '为了': 13, '做好': 19, '自我': 109, '防护': 130, '车上': 116, '备着': 43, '酒精': 128, '消毒水': 95, '车辆': 117, '消毒': 94, '数不清': 79, '多少': 45, '次手': 88, '开裂': 63, '睡袋': 103, '家里人': 53, '如果': 47, '自己': 108, '感染': 67, '回家': 41, '觉得': 111, '医护人员': 26, '真正': 102, '他们': 15, '所以': 70, '即便': 30, '春节假期': 83, '一直': 6, '工作': 57, '现场': 100, '封城': 54, '做点': 20, '什么': 14, '没有': 92, '理由': 101, '退缩': 124}
TF-IDF 排名前十的:
中国 0.7071067811865475
车上 0.4595922221621456
即便 0.3959878948353881
每天 0.3707961110124713
武汉 0.3339447507363904
开始 0.3324263991986453
一线 0.31948054021065436
一个 0.30639481477476377
运送 0.2923903495520924

 

你可能感兴趣的:(数据分析)