├── .gitattributes ├── README.md ├── data ├── CNstopwords.txt ├── EnMicroMsg.db ├── chat_data.csv ├── simhei.ttf └── 大连理工大学中文情感词汇本体.xlsx ├── generate_wordcloud.py ├── others.py ├── requirements.txt ├── result ├── 句子长度均值随时间变化.png ├── 情感得分随时间变化.png ├── 情感热力图.png ├── 数据示例.png ├── 词云-他发的.png └── 词云-我发的.png ├── sentiment_dict.py └── sentiment_snownlp.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 用python对微信聊天记录进行文本分析 2 | 3 | ## 项目结构、所需数据 4 | --data 存放分析所需的数据 5 | --EnMicroMsg.db 从微信中导出的聊天记录数据库 6 | --chat_data.csv 将数据库中的聊天记录存储到csv文件,之后分析都从csv读取数据 7 | --大连理工大学中文情感词汇本体.xlsx 情感词典 8 | --CNstopwords.txt 中文停用词 9 | --simhei.ttf 绘制词云指定的字体 10 | 11 | --result 存放分析结果、生成的图片 12 | 13 | --gernerate_word_cloud.py 生成词云 14 | 15 | --sentiment_snownlp.py 调用snownlp生成情感得分,计算情感均值、作折线图 16 | 17 | --sentiment_dict.py 使用大连理工情感词典计算情绪分类,作热力图 18 | 19 | --others.py 其他统计 20 | 21 | 22 | ## 具体步骤 23 | ### 1. 导出聊天记录 24 | 参考以下两个博客: 25 | ① https://blog.csdn.net/weixin_41746317/article/details/104110161?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-5-104110161-blog-126700288.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-5-104110161-blog-126700288.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=6 26 | ① https://blog.csdn.net/m0_59452630/article/details/124222235 27 | 破译密码如果①的方法没成功可以试试②的 28 | 29 | content列:聊天内容 30 | type列:信息类型(1代表文本消息,需要用excel筛选一下之后只分析type=1的数据) 31 | isSend列:0代表对方发送的信息,1代表自己发送的信息 32 | createTime:时间(暂时不知道怎么恢复成年月日),但是降序排序以后的顺序是聊天记录由近到远的顺序 33 | 自己加了一列newTime,记录聊天记录所在月份,是根据createTime降序排序后,手机上看每月最后几句信息,在excel中搜索,来进行月份划分的 34 | 35 | ![image](result/数据示例.png) 36 | 37 | 38 | ### 2. 生成词云 39 | 调用generate_word_cloud.py 40 | ![image](result/词云-他发的.png) 41 | ![image](result/词云-我发的.png) 42 | 43 | ### 3. 计算情感得分均值,作折线图(使用snownlp) 44 | ① 调用get_sentiment_score()函数,将情感得分保存到csv的sentiment_score列中 45 | ② 调用draw()函数,将情感得分随时间变化值保存到result文件夹中 46 | 47 | snownlp得到的分值不一定准确,所以send和receive的得分值都差不多,但也有可能日常的交流就是比较中性的,没有什么大起大落的情感 48 | ![image](result/情感得分随时间变化.png) 49 | 50 | 51 | ### 4. 计算情绪分类,作热力图(使用大连理工情感词典) 52 | 调用sentiment_dict.py 53 | 注意第115行,如果没有匹配到任何情感词,就记为None,绘制热力图的时候会筛掉None的记录 54 | ![image](result/情感热力图.png) 55 | 56 | ### 5. 其他统计绘图 57 | others.py 58 | ![image](result/句子长度均值随时间变化.png) 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /data/CNstopwords.txt: -------------------------------------------------------------------------------- 1 | 一个个 2 | 一个集 3 | 一九九八年 4 | 一人 5 | 一代 6 | 一件 7 | 一份 8 | 一位 9 | 一体 10 | 一侧 11 | 一口 12 | 一只 13 | 一号 14 | 一名 15 | 一向 16 | 一周 17 | 一圈 18 | 一场 19 | 一块 20 | 一处 21 | 一夜 22 | 一大 23 | 一大批 24 | 一头 25 | 一套 26 | 一家 27 | 一对 28 | 一尊 29 | 一小 30 | 一层 31 | 一带 32 | 一幅 33 | 一年 34 | 各式 35 | 大抵 36 | 何况 37 | 出来 38 | 第二 39 | 不问 40 | 换句话说 41 | 随 42 | 顷刻间 43 | 有及 44 | 怎麽 45 | 为主 46 | = 47 | - 48 | = 49 | ( 50 | 不管怎样 51 | [①c] 52 | 此处 53 | 什么样 54 | = 55 | [ 56 | 如同 57 | 临 58 | 然 59 | 此外 60 | 挨着 61 | @ 62 | 还要 63 | = 64 | { 65 | 正常 66 | 凡 67 | 针对 68 | 除 69 | 反之 70 | ]∧′=[ 71 | 2.3% 72 | 其 73 | 呸 74 | 亲自 75 | 反过来说 76 | 》 77 | 即或 78 | 而况 79 | 5 80 | 全力 81 | 你的 82 | 哎呀 83 | + 84 | 是 85 | 刚好 86 | [③①] 87 | 总之 88 | 容易 89 | 并非 90 | 仍旧 91 | 明确 92 | 设使 93 | 大批 94 | 以便 95 | …… 96 | 陡然 97 | 也 98 | 老是 99 | 继后 100 | 三番两次 101 | 往往 102 | 里面 103 | 目前 104 | 加以 105 | 上 106 | 最后 107 | 次第 108 | 后 109 | 4 110 | 您们 111 | 过于 112 | 啊呀 113 | 也好 114 | 一次 115 | 产生 116 | 虽则 117 | 表明 118 | 离 119 | 大体上 120 | 据说 121 | 人们 122 | 有力 123 | 屡次三番 124 | << 125 | 哎哟 126 | 开展 127 | 诚然 128 | 组成 129 | 以下 130 | 以上 131 | 极度 132 | 主要 133 | ~+ 134 | 为何 135 | 趁机 136 | 待到 137 | 老 138 | 啊哟 139 | 梆 140 | 自身 141 | 。。。 142 | 向使 143 | 啊哈 144 | 着呢 145 | 并不是 146 | [①⑨] 147 | 加之 148 | 据此 149 | 她的 150 | 但凡 151 | 孰知 152 | _ 153 | 挨家挨户 154 | A 155 | 其次 156 | 别处 157 | 赶早不赶晚 158 | 今 159 | 哎 160 | 与其 161 | 大面儿上 162 | 几 163 | [②d] 164 | 加上 165 | 不同 166 | ...... 167 | 暗自 168 | 譬喻 169 | 有利 170 | 精光 171 | 通常 172 | 固 173 | 啪达 174 | 虽然 175 | 再 176 | 尔 177 | 那些 178 | 无宁 179 | 因了 180 | 遇到 181 | 宣布 182 | , 183 | 乘机 184 | 一样 185 | 换言之 186 | 所 187 | 进来 188 | 么 189 | 或多或少 190 | 立时 191 | × 192 | 才能 193 | 每每 194 | 起见 195 | 臭 196 | 倒不如 197 | 突然 198 | 由是 199 | 彼时 200 | 故意 201 | 殆 202 | & 203 | 据我所知 204 | ”, 205 | 因为 206 | ∪φ∈ 207 | 诸位 208 | 够瞧的 209 | 不得了 210 | 后者 211 | 昂然 212 | 突出 213 | 做到 214 | 这时 215 | 路经 216 | 故 217 | 全都 218 | 全部 219 | 适当 220 | φ. 221 | 进而 222 | 的确 223 | 略 224 | 来看 225 | 而又 226 | 即若 227 | 好 228 | 什麽 229 | 下面 230 | 哪儿 231 | 几度 232 | >> 233 | 全然 234 | 喏 235 | 嘎 236 | 适应 237 | 或 238 | 叮当 239 | 的 240 | ∈[ 241 | 逢 242 | 具体来说 243 | 同一 244 | 莫 245 | 遭到 246 | exp 247 | 将近 248 | 大致 249 | 随后 250 | 乘虚 251 | 隔日 252 | 跟 253 | 有点 254 | 别管 255 | 轰然 256 | 只限 257 | 几经 258 | 可好 259 | 防止 260 | 倘然 261 | 故而 262 | 三 263 | 」 264 | 3 265 | 到处 266 | [②c] 267 | 常言说得好 268 | 特殊 269 | 到头 270 | 趁早 271 | - 272 | 宁可 273 | 不怎么 274 | 形成 275 | 不限 276 | 人民 277 | 唯有 278 | 这一来 279 | [⑤d] 280 | 放量 281 | 当时 282 | 当 283 | 个别 284 | 亲手 285 | 每时每刻 286 | 竟然 287 | 来不及 288 | 哪里 289 | 有的是 290 | [②⑩] 291 | 碰巧 292 | 为了 293 | 一一 294 | 到底 295 | 一下 296 | 咋 297 | 迅速 298 | 2 299 | 开外 300 | ‘ 301 | 依 302 | 那 303 | R.L. 304 | 一个 305 | 刚巧 306 | 对待 307 | 许多 308 | 就此 309 | 其他 310 | 漫说 311 | > 312 | 纵令 313 | 到目前为止 314 | 莫不 315 | 归 316 | 决不 317 | 长话短说 318 | 以至于 319 | 嗡 320 | 不再 321 | 再有 322 | 敞开儿 323 | ︿ 324 | 简直 325 | 谁人 326 | 数/ 327 | 与否 328 | 抽冷子 329 | 有着 330 | 格外 331 | ②c 332 | 不免 333 | 不光 334 | 始而 335 | [①⑧] 336 | ] 337 | 急匆匆 338 | 如此等等 339 | 後来 340 | 开始 341 | 截然 342 | 其中 343 | [] 344 | 不然 345 | 从而 346 | 穷年累月 347 | +ξ 348 | 其一 349 | 连声 350 | 若果 351 | 为什麽 352 | [- 353 | [①o] 354 | 『 355 | 同样 356 | 相反 357 | 而后 358 | 是以 359 | 本 360 | . 361 | 极其 362 | 对应 363 | 怎么 364 | 若是 365 | 过 366 | 非特 367 | 为此 368 | 难说 369 | 为止 370 | 基本上 371 | 不择手段 372 | 一何 373 | 全面 374 | 应该 375 | 有的 376 | 丰富 377 | 我 378 | 这般 379 | 经过 380 | [②b] 381 | 恰逢 382 | 如其 383 | 彼 384 | 得了 385 | ℃ 386 | 应用 387 | 从来 388 | 至于 389 | 那麽 390 | 取得 391 | ’ 392 | 尽早 393 | 饱 394 | 纵使 395 | 届时 396 | 然後 397 | LI 398 | 本地 399 | 随著 400 | 其余 401 | 一边 402 | 正是 403 | 从未 404 | 背靠背 405 | 本着 406 | 前面 407 | 多年来 408 | 后来 409 | 至今 410 | 乘胜 411 | 略为 412 | 尚且 413 | ’‘ 414 | 九 415 | 云云 416 | 它是 417 | 自从 418 | 保管 419 | 受到 420 | 极 421 | 趁着 422 | 不可 423 | 绝非 424 | 同 425 | 不只 426 | 些 427 | 附近 428 | 结果 429 | 打开天窗说亮话 430 | 达旦 431 | 不变 432 | 猛然间 433 | 赶快 434 | 5:0 435 | 但 436 | 像 437 | 先後 438 | 距 439 | 反之则 440 | ≈ 441 | ××× 442 | 成年累月 443 | 据 444 | 得起 445 | 下列 446 | 快要 447 | 人人 448 | 和 449 | 』 450 | 1 451 | 默默地 452 | 使用 453 | 不得已 454 | 看见 455 | 矣乎 456 | 没有 457 | 前后 458 | / 459 | 不单 460 | [②c] 461 | Lex 462 | 另悉 463 | 平素 464 | 率尔 465 | 从今以后 466 | 毋宁 467 | 完全 468 | [①] 469 | 就要 470 | 莫不然 471 | b] 472 | 当真 473 | 极力 474 | 遵照 475 | 因 476 | 毕竟 477 | 庶乎 478 | 断然 479 | 倍感 480 | 出 481 | 1. 482 | 最 483 | 不止一次 484 | 不独 485 | 既是 486 | 呆呆地 487 | 0 488 | 怎么样 489 | 尽如人意 490 | 带 491 | 毫无例外 492 | 尔后 493 | 安全 494 | [⑤] 495 | 也罢 496 | 该当 497 | 另一个 498 | -β 499 | 即令 500 | 因着 501 | [②①] 502 | [③e] 503 | 齐 504 | [⑤f] 505 | 从新 506 | 除此以外 507 | 靠 508 | 呢 509 | 呼哧 510 | 是不是 511 | 一起 512 | 究竟 513 | [②⑧] 514 | 不力 515 | 哪 516 | 他的 517 | 每个 518 | 了 519 | 看 520 | 方面 521 | [⑨] 522 | 不特 523 | 分头 524 | 约 525 | 临到 526 | 不至于 527 | [ 528 | 尽 529 | 左右 530 | [⑩] 531 | 因此 532 | 简言之 533 | 贼死 534 | 认为 535 | 密切 536 | 下去 537 | 汝 538 | 怎奈 539 | [③F] 540 | 正如 541 | 零 542 | 比如 543 | 权时 544 | 要 545 | 不巧 546 | 反映 547 | 看来 548 | 以来 549 | 趁热 550 | 以为 551 | 【 552 | 连同 553 | 何妨 554 | :: 555 | 不已 556 | 会 557 | -- 558 | 被 559 | 特别是 560 | 一般 561 | 当下 562 | 0 563 | 背地里 564 | [⑨] 565 | 然则 566 | 现在 567 | 保险 568 | 各地 569 | 见 570 | 再次 571 | 近几年来 572 | 经 573 | 看上去 574 | 串行 575 | [④b] 576 | ¥ 577 | 赖以 578 | 岂止 579 | 以期 580 | 从早到晚 581 | 尔等 582 | [①D] 583 | 相应 584 | 这么点儿 585 | 诚如 586 | 再说 587 | 吓 588 | 各种 589 | 匆匆 590 | 转变 591 | ㈧ 592 | 适用 593 | 恰巧 594 | 何处 595 | 所幸 596 | 勃然 597 | 嘿 598 | 屡次 599 | 几番 600 | 同时 601 | 叮咚 602 | 或则 603 | [ 604 | 总是 605 | 多少 606 | [②④ 607 | 故此 608 | 这边 609 | 它们的 610 | 过来 611 | 宁愿 612 | 似乎 613 | 这么 614 | 于是乎 615 | 交口 616 | ’‘ 617 | 属于 618 | 忽地 619 | 绝顶 620 | 用 621 | 共总 622 | [②⑦] 623 | 正在 624 | 仅 625 | 除此 626 | 风雨无阻 627 | 既 628 | 固然 629 | 这个 630 | 哩 631 | 自打 632 | ................... 633 | 整个 634 | 就是 635 | 除去 636 | 较之 637 | 具体地说 638 | 从此 639 | / 640 | 】 641 | 假如 642 | 眨眼 643 | 1 644 | ? 645 | 进步 646 | 相当 647 | 迄 648 | 何须 649 | 这些 650 | 您是 651 | 不尽 652 | 替代 653 | 任凭 654 | ? 655 | 出于 656 | 不可开交 657 | 转动 658 | 较为 659 | 不少 660 | 各级 661 | 这么样 662 | 至若 663 | ── 664 | 首先 665 | . 666 | 则甚 667 | 那儿 668 | 继续 669 | [④a] 670 | “ 671 | 不必 672 | [②f] 673 | 上去 674 | 以故 675 | ~± 676 | 一. 677 | 常 678 | [①E] 679 | 如常 680 | 坚决 681 | 据悉 682 | 川流不息 683 | 立 684 | 种 685 | 取道 686 | 这 687 | 乘 688 | \ 689 | 说来 690 | a] 691 | 不如 692 | 只当 693 | 不得 694 | 动辄 695 | 七 696 | 概 697 | 有 698 | 小 699 | 任务 700 | 日复一日 701 | [①i] 702 | 进行 703 | 绝对 704 | 大不了 705 | 豁然 706 | [①⑤] 707 | 乃 708 | φ 709 | * 710 | 请勿 711 | 上升 712 | 毫无保留地 713 | 由于 714 | [①⑥] 715 | 另 716 | 顷 717 | 借此 718 | —— 719 | 较 720 | 联系 721 | 顷刻之间 722 | 代替 723 | 哪天 724 | 他是 725 | 之一 726 | 在 727 | 不仅...而且 728 | 2 729 | 大概 730 | 去 731 | 咱们 732 | 行动 733 | 切切 734 | 不外乎 735 | {- 736 | 二话没说 737 | 兼之 738 | 倒不如说 739 | 都 740 | 所在 741 | 移动 742 | ” 743 | 帮助 744 | 切勿 745 | 顿时 746 | 充分 747 | 范围 748 | 呕 749 | 还 750 | ] 751 | 不常 752 | 按理 753 | 率然 754 | 强烈 755 | 照 756 | [①④] 757 | 哪些 758 | 一致 759 | 接著 760 | 趁 761 | 瑟瑟 762 | 伙同 763 | 显然 764 | 愤然 765 | 彼此 766 | …………………………………………………③ 767 | 较比 768 | 且不说 769 | 最大 770 | 使得 771 | ~~~~ 772 | 恰好 773 | 相对而言 774 | 大事 775 | 岂但 776 | 成年 777 | 掌握 778 | 哪年 779 | 不妨 780 | 全年 781 | 呐 782 | 即是说 783 | 云尔 784 | 例如 785 | 从事 786 | 广泛 787 | 啦 788 | 这次 789 | 反手 790 | ,也 791 | 直接 792 | 最好 793 | 需要 794 | 从古至今 795 | [②⑥] 796 | 大举 797 | - 798 | 起来 799 | 朝 800 | 从中 801 | 日益 802 | 除了 803 | 因而 804 | 3 805 | 分别 806 | 不大 807 | 限制 808 | 先生 809 | 从严 810 | 恰如 811 | 看样子 812 | 单 813 | 如上所述 814 | 此间 815 | 连日来 816 | 从不 817 | 充其量 818 | 只 819 | 们 820 | 认识 821 | 不外 822 | 千万千万 823 | 而已 824 | 不够 825 | 自个儿 826 | 重大 827 | 分期分批 828 | , 829 | 暗地里 830 | 相对 831 | 者 832 | 此后 833 | 即便 834 | 它们 835 | 介于 836 | ××× 837 | ′| 838 | 再者说 839 | 设若 840 | ^ 841 | 总的来看 842 | 极大 843 | 一来 844 | 至 845 | 举行 846 | 更加 847 | 谁 848 | 能够 849 | 把 850 | 必要 851 | 向 852 | 从轻 853 | 何尝 854 | 相等 855 | 咦 856 | 常言道 857 | 及其 858 | 设或 859 | 比及 860 | [⑦] 861 | 大都 862 | 高低 863 | 她 864 | 先后 865 | 多多 866 | 战斗 867 | 非但 868 | 屡 869 | 大体 870 | 哦 871 | 〕〔 872 | 偶而 873 | 从优 874 | 成心 875 | 了解 876 | 挨门挨户 877 | 白 878 | 一 879 | 不仅仅是 880 | 1. 881 | 〔 882 | 合理 883 | 此地 884 | 咧 885 | 反而 886 | 暗中 887 | 然后 888 | 4 889 | 喽 890 | 不管 891 | [②⑤] 892 | 策略地 893 | 别的 894 | ≈ 895 | 好象 896 | 正值 897 | 运用 898 | 默然 899 | 我的 900 | 何必 901 | 另行 902 | 不定 903 | 还有 904 | 按 905 | 觉得 906 | 争取 907 | 难怪 908 | 传说 909 | 清楚 910 | 以致 911 | 以至 912 | A 913 | 吧 914 | 极端 915 | 莫非 916 | ▲ 917 | 嘻 918 | 按照 919 | 以前 920 | 将才 921 | _ 922 | 尽管如此 923 | 否则 924 | 纯粹 925 | 依据 926 | 哼 927 | 上面 928 | 嗡嗡 929 | 比照 930 | 弹指之间 931 | @ 932 | 罢了 933 | 年复一年 934 | 尔尔 935 | γ 936 | 由此 937 | 允许 938 | 亲身 939 | 这么些 940 | 谁料 941 | 呵呵 942 | 归根结底 943 | 常常 944 | 除此而外 945 | ——— 946 | 理该 947 | 并 948 | 借以 949 | 顺 950 | [⑧] 951 | 这样 952 | 并没有 953 | + 954 | 〕 955 | ]∧′=[ 956 | 望 957 | 倒是 958 | 构成 959 | 还是 960 | [④c] 961 | 不知不觉 962 | 不亦乐乎 963 | 5 964 | 儿 965 | 与此同时 966 | [①⑦] 967 | 每 968 | 他 969 | 最高 970 | 由此可见 971 | 一旦 972 | 啐 973 | 缕缕 974 | [③h] 975 | 0:2 976 | 便于 977 | 一时 978 | 致 979 | 有关 980 | 不日 981 |   982 | 通过 983 | 千万 984 | 你是 985 | 来着 986 | 既然 987 | 不时 988 | 方能 989 | 且 990 | < 991 | ′∈ 992 | 总结 993 | [②g] 994 | 谨 995 | 大力 996 | 砰 997 | 似的 998 | 尽可能 999 | 方 1000 | 尽心尽力 1001 | ∈[ 1002 | 各位 1003 | 不断 1004 | 朝着 1005 | )÷(1- 1006 | 倘或 1007 | 末##末 1008 | ` 1009 | 累年 1010 | 严格 1011 | -- 1012 | 部分 1013 | 非独 1014 | 不料 1015 | 对比 1016 | 二话不说 1017 | 当中 1018 | 每天 1019 | 不敢 1020 | 自家 1021 | 很少 1022 | 立地 1023 | 五 1024 | 传闻 1025 | 即刻 1026 | : 1027 | 看起来 1028 | sub 1029 | 具有 1030 | 倘若 1031 | 反应 1032 | sup 1033 | 甚而 1034 | 呃 1035 | 果真 1036 | }> 1037 | 说明 1038 | 何 1039 | 加强 1040 | 多年前 1041 | 以後 1042 | ④ 1043 | 来 1044 | 独 1045 | 宁肯 1046 | 获得 1047 | 当场 1048 | [③g] 1049 | 她是 1050 | 当地 1051 | 自各儿 1052 | 下一页 1053 | 实际 1054 | 而外 1055 | 各个 1056 | 处在 1057 | 敢于 1058 | 个 1059 | 作为 1060 | 之后 1061 | 难得 1062 | 纵 1063 | 6 1064 | 连 1065 | 便 1066 | 甚至 1067 | 0:2 1068 | 尽然 1069 | 不 1070 | 的话 1071 | 据实 1072 | 啥 1073 | 除却 1074 | 其它 1075 | 相同 1076 | 进去 1077 | 但愿 1078 | 这就是说 1079 | 或许 1080 | 当着 1081 | 再则 1082 | 其实 1083 | 、 1084 | 普遍 1085 | 达到 1086 | 迫于 1087 | 重新 1088 | ㈧ 1089 | 一定 1090 | 有所 1091 | 总的来说 1092 | ! 1093 | 乌乎 1094 | 惟其 1095 | 各人 1096 | 曾经 1097 | 尽量 1098 | 旁人 1099 | 多数 1100 | 嘿嘿 1101 | 决定 1102 | 所有 1103 | 才 1104 | 普通 1105 | ][ 1106 | [①d] 1107 | 余外 1108 | 严重 1109 | 更为 1110 | 12% 1111 | 八 1112 | 应当 1113 | 现代 1114 | 良好 1115 | 偶尔 1116 | 比较 1117 | 使 1118 | 并无 1119 | 各 1120 | 颇 1121 | 处理 1122 | 什么 1123 | 而 1124 | 此次 1125 | 关于 1126 | 无论 1127 | 嘘 1128 | 考虑 1129 | 用来 1130 | 逐渐 1131 | 彻底 1132 | 哪怕 1133 | 如是 1134 | 上一页 1135 | 起首 1136 | 只有 1137 | · 1138 | ( 1139 | 沿 1140 | 基本 1141 | 难道说 1142 | 中小 1143 | 马上 1144 | 那么样 1145 | ~ 1146 | Ⅲ 1147 | ⑤ 1148 | 凭 1149 | × 1150 | ++ 1151 | 亲口 1152 | .数 1153 | 甚至于 1154 | 从古到今 1155 | ) 1156 | 接下来 1157 | 又及 1158 | 起头 1159 | 前者 1160 | 如期 1161 | 方才 1162 | 别 1163 | 意思 1164 | .日 1165 | 7 1166 | 已矣 1167 | [④e] 1168 | [②B] 1169 | 牢牢 1170 | 问题 1171 | 竟而 1172 | 凑巧 1173 | 甚或 1174 | 扩大 1175 | 六 1176 | .日 1177 | 假若 1178 | 近年来 1179 | 今天 1180 | 从速 1181 | 集中 1182 | 。 1183 | 下来 1184 | 比起 1185 | 只是 1186 | 不曾 1187 | 那样 1188 | 不仅仅 1189 | 存在 1190 | " 1191 | 从重 1192 | 一天 1193 | 别说 1194 | 据称 1195 | 沿着 1196 | [①①] 1197 | 惯常 1198 | 比如说 1199 | 却不 1200 | 大凡 1201 | 万一 1202 | 论说 1203 | 即使 1204 | 何苦 1205 | 叫 1206 | 多多少少 1207 | 嗯 1208 | 大量 1209 | 俺们 1210 | 少数 1211 | 从无到有 1212 | 很 1213 | 乘隙 1214 | 如果 1215 | 咚 1216 | 哗啦 1217 | 日见 1218 | 进入 1219 | 伟大 1220 | [②G] 1221 | 莫如 1222 | 奇 1223 | 不是 1224 | 孰料 1225 | 可见 1226 | [②③] 1227 | 等等 1228 | 规定 1229 | ⑥ 1230 | 莫若 1231 | 5:0 1232 | 失去 1233 | 几乎 1234 | 巴 1235 | exp 1236 | 藉以 1237 | 高兴 1238 | [⑤]] 1239 | 另方面 1240 | 为什么 1241 | 犹自 1242 | 于是 1243 | 要么 1244 | [②j] 1245 | 截至 1246 | 仍然 1247 | 倘 1248 | 人家 1249 | 按说 1250 | 三番五次 1251 | 若非 1252 | 8 1253 | 知道 1254 | 再者 1255 | 略微 1256 | 何时 1257 | 要不 1258 | 矣 1259 | 今後 1260 | 确定 1261 | 岂非 1262 | [②B] 1263 | 竟 1264 | ① 1265 | 诸如 1266 | 兮 1267 | 己 1268 | 并排 1269 | 阿 1270 | 当前 1271 | 一转眼 1272 | 日渐 1273 | [⑥] 1274 | 那边 1275 | 经常 1276 | 连袂 1277 | = 1278 | # 1279 | 简而言之 1280 | 不对 1281 | 真是 1282 | 好的 1283 | 采取 1284 | 後面 1285 | 就算 1286 | [③d] 1287 | [①A] 1288 | 立即 1289 | 出去 1290 | 举凡 1291 | 出现 1292 | 维持 1293 | 奋勇 1294 | 实现 1295 | 可以 1296 | 继而 1297 | 总而言之 1298 | 趁势 1299 | 那个 1300 | 般的 1301 | 将 1302 | 怎 1303 | [②i] 1304 | 不能 1305 | 刚 1306 | 好在 1307 | 恰恰 1308 | 对于 1309 | 长期以来 1310 | 只怕 1311 | [②a] 1312 | c] 1313 | 不胜 1314 | 不惟 1315 | 必然 1316 | 倍加 1317 | 当即 1318 | 奈 1319 | 它的 1320 | 乒 1321 | 绝 1322 | | 1323 | 不得不 1324 | 那么 1325 | 若 1326 | [①f] 1327 | 抑或 1328 | 可 1329 | 那里 1330 | 除非 1331 | 在下 1332 | 无法 1333 | 很多 1334 | 喀 1335 | ' 1336 | [②②] 1337 | 互 1338 | 立刻 1339 | ZXFITL 1340 | ■ 1341 | [①e] 1342 | 今年 1343 | 甫 1344 | 彻夜 1345 | 就 1346 | 结合 1347 | 完成 1348 | 9 1349 | 活 1350 | 更 1351 | 后面 1352 | 古来 1353 | 周围 1354 | 满足 1355 | 比 1356 | 综上所述 1357 | 双方 1358 | ② 1359 | 无 1360 | 大 1361 | 既...又 1362 | 。。。。。。 1363 | 不怕 1364 | 在于 1365 | 要求 1366 | 内 1367 | 恰恰相反 1368 | 常言说 1369 | 我们 1370 | $ 1371 | 让 1372 | 不但...而且 1373 | 有时 1374 | 不论 1375 | ... 1376 | 相信 1377 | [③] 1378 | 近 1379 | 哗 1380 | 偏偏 1381 | 敢 1382 | 上述 1383 | 转贴 1384 | 日臻 1385 | 别人 1386 | 任 1387 | 以外 1388 | 但是 1389 | 喂 1390 | 这里 1391 | 正巧 1392 | 这儿 1393 | 有效 1394 | 吗 1395 | 巨大 1396 | 怎样 1397 | 连连 1398 | 亲眼 1399 | 甭 1400 | 随着 1401 | 元/吨 1402 | 哼唷 1403 | 譬如 1404 | 等 1405 | 且说 1406 | 自己 1407 | 对 1408 | 呗 1409 | ——— 1410 | 果然 1411 | 如若 1412 | 毫无 1413 | [①B] 1414 | 单单 1415 | & 1416 | [④d] 1417 | 已 1418 | 乃至 1419 | 每当 1420 | 不若 1421 | 此中 1422 | 当儿 1423 | 而是 1424 | 当然 1425 | <± 1426 | 呼啦 1427 | 这种 1428 | 具体说来 1429 | 该 1430 | .. 1431 | ./ 1432 | . 1433 | 不止 1434 | 强调 1435 | : 1436 | 不拘 1437 | 着 1438 | 并肩 1439 | 促进 1440 | 再其次 1441 | 逐步 1442 | ③ 1443 | 吧哒 1444 | 任何 1445 | ℃ 1446 | 之前 1447 | 忽然 1448 | 有著 1449 | 专门 1450 | 愿意 1451 | 上下 1452 | 则 1453 | ; 1454 | 蛮 1455 | % 1456 | 亦 1457 | 顺着 1458 | 乘势 1459 | 不可抗拒 1460 | [①h] 1461 | 不能不 1462 | 千 1463 | 二来 1464 | 召开 1465 | 8 1466 | 大略 1467 | 主张 1468 | { 1469 | 每年 1470 | 行为 1471 | 嗬 1472 | 累次 1473 | 这点 1474 | 反倒是 1475 | 先不先 1476 | 不成 1477 | 长此下去 1478 | 待 1479 | 一切 1480 | [④] 1481 | 一方面 1482 | 必将 1483 | ↑ 1484 | 陈年 1485 | 一则 1486 | 所以 1487 | 来自 1488 | 纯 1489 | 一则通过 1490 | 咳 1491 | 越是 1492 | [③⑩] 1493 | [ 1494 | ] 1495 | 拦腰 1496 | 必 1497 | 一片 1498 | [③b] 1499 | [①C] 1500 | 慢说 1501 | 几时 1502 | 不足 1503 | 就地 1504 | 看看 1505 | ⑨ 1506 | 不消 1507 | 时候 1508 | 替 1509 | 就是说 1510 | % 1511 | 切 1512 | 十分 1513 | 唉 1514 | 坚持 1515 | 特点 1516 | 不起 1517 | 当庭 1518 | 随时 1519 | 社会主义 1520 | 另一方面 1521 | 鄙人 1522 | 只消 1523 | 遵循 1524 | ; 1525 | 虽说 1526 | 按期 1527 | 哈 1528 | [①③] 1529 | 你们 1530 | [②h] 1531 | 挨门逐户 1532 | Lex 1533 | 接着 1534 | 共 1535 | 具体 1536 | 俺 1537 | -[*]- 1538 | 大家 1539 | $ 1540 | 那般 1541 | .一 1542 | 独自 1543 | 凝神 1544 | =☆ 1545 | 姑且 1546 | … 1547 | 及时 1548 | 第 1549 | 得到 1550 | 为 1551 | 庶几 1552 | 心里 1553 | 哉 1554 | 略加 1555 | 挨个 1556 | 从宽 1557 | 之类 1558 | 以 1559 | 两者 1560 | 为着 1561 | 显著 1562 | 嗳 1563 | 难道 1564 | 呀 1565 | 尽心竭力 1566 | 每逢 1567 | 分期 1568 | 恍然 1569 | 广大 1570 | 傥然 1571 | 初 1572 | 话说 1573 | 扑通 1574 | 向着 1575 | 动不动 1576 | 起初 1577 | 人 1578 | 不然的话 1579 | μ 1580 | 大多数 1581 | 前此 1582 | 她们 1583 | 仅仅 1584 | 相似 1585 | 乃至于 1586 | ⑩ 1587 | 并不 1588 | 练习 1589 | 并且 1590 | 打从 1591 | 如前所述 1592 | 真正 1593 | 连日 1594 | 宁 1595 | ? 1596 | 理应 1597 | 根据 1598 | 不迭 1599 | 哪样 1600 | 如上 1601 | 如下 1602 | ,也 1603 | [③c] 1604 | 不过 1605 | 归齐 1606 | 然而 1607 | 按时 1608 | 到 1609 | 边 1610 | < 1611 | 总的说来 1612 | 多亏 1613 | 若夫 1614 | 啊 1615 | 省得 1616 | 哟 1617 | >λ 1618 |  1619 | 恰似 1620 | :// 1621 | 不经意 1622 | 原来 1623 | 极为 1624 | | 1625 | 如 1626 | 多么 1627 | 归根到底 1628 | 历 1629 | 其二 1630 | → 1631 | 9 1632 | 而论 1633 | 不但 1634 | ' 1635 | 充其极 1636 | 之後 1637 | e] 1638 | 冲 1639 | 继之 1640 | 或者 1641 | 反过来 1642 | 极了 1643 | 间或 1644 | 如今 1645 | 所谓 1646 | 最近 1647 | 何止 1648 | =″ 1649 | 三天两头 1650 | 起先 1651 | 可能 1652 | 深入 1653 | 依靠 1654 | 切莫 1655 | 得出 1656 | 不会 1657 | * 1658 | 不满 1659 | 怪不得 1660 | 与 1661 | 单纯 1662 | 即如 1663 | 不仅 1664 | 而言 1665 | 欢迎 1666 | 自后 1667 | 除外 1668 | 企图 1669 | 并没 1670 | 乎 1671 | 如何 1672 | 给 1673 | 叫做 1674 | 以后 1675 | 八成 1676 | 能 1677 | 刚才 1678 | # 1679 | 巩固 1680 | 7 1681 | 于 1682 | 大大 1683 | 老老实实 1684 | 不由得 1685 | 一些 1686 | 已经 1687 | 不久 1688 | 复杂 1689 | 大多 1690 | 中间 1691 | 这麽 1692 | = 1693 | 理当 1694 | 比方 1695 | 存心 1696 | 某某 1697 | 从 1698 | 尽管 1699 | )、 1700 | 从头 1701 | 基于 1702 | 差一点 1703 | 不一 1704 | 纵然 1705 | 不下 1706 | 避免 1707 | 呵 1708 | 趁便 1709 | } 1710 | 犹且 1711 | 曾 1712 | 那末 1713 | 成为 1714 | 〈 1715 | 大约 1716 | 反之亦然 1717 | 哪个 1718 | 可是 1719 | 矣哉 1720 | ( 1721 | 过去 1722 | 本身 1723 | 或曰 1724 | 迟早 1725 | 照着 1726 | 本人 1727 | 如此 1728 | 你 1729 | 半 1730 | 挨次 1731 | 不要 1732 | 除此之外 1733 | 要是 1734 | 公然 1735 | 一番 1736 | 紧接着 1737 | 必须 1738 | 赶 1739 | 拿 1740 | 腾 1741 | [⑤a] 1742 | 焉 1743 | 到头来 1744 | 二 1745 | [*] 1746 | 凭借 1747 | 定 1748 | 非常 1749 | 以及 1750 | 您 1751 | [①a] 1752 | 由 1753 | 光是 1754 | 论 1755 | 只要 1756 | 管 1757 | 光 1758 | 及 1759 | 此时 1760 | 鉴于 1761 | [⑤e] 1762 | 哈哈 1763 | 恐怕 1764 | 或是 1765 | 依照 1766 | 啷当 1767 | 一直 1768 | 顶多 1769 | 到了儿 1770 | 决非 1771 | 非徒 1772 | 没奈何 1773 | 毫不 1774 | 非得 1775 | [①g] 1776 | 得 1777 | 共同 1778 | 没 1779 | 谁知 1780 | 欤 1781 | 类如 1782 | } 1783 | 巴巴 1784 | 除开 1785 | 及至 1786 | 咱 1787 | 当口儿 1788 | 倘使 1789 | > 1790 | 有些 1791 | 是的 1792 | 仍 1793 | 凡是 1794 | 看到 1795 | 保持 1796 | 某个 1797 | 要不然 1798 | 一面 1799 | 此 1800 | ⑦ 1801 | 全体 1802 | 2010 1803 | 却 1804 | 不了 1805 | 前进 1806 | ~ 1807 | 哪边 1808 | 〉 1809 | 引起 1810 | 差不多 1811 | [②] 1812 | <φ 1813 | Δ 1814 | 弗 1815 | ③] 1816 | 变成 1817 | 重要 1818 | 要不是 1819 | ) 1820 | 吱 1821 | 注意 1822 | 不尽然 1823 | 怎么办 1824 | <Δ 1825 | 均 1826 | 立马 1827 | 局外 1828 | // 1829 | 那么些 1830 | -- 1831 | 某些 1832 | <λ 1833 | 直到 1834 | 就是了 1835 | 接连不断 1836 | 虽 1837 | 表示 1838 | 窃 1839 | 这会儿 1840 | 对方 1841 | — 1842 | 粗 1843 | 6 1844 | 尤其 1845 | 来说 1846 | 多 1847 | 以免 1848 | 多多益善 1849 | [②e] 1850 | 从此以后 1851 | 不比 1852 | 反倒 1853 | 根本 1854 | 哇 1855 | [⑤b] 1856 | 近来 1857 | 四 1858 | [①②] 1859 | 呜 1860 | 来讲 1861 | 那会儿 1862 | 将要 1863 | 呜呼 1864 | 也是 1865 | ! 1866 | 。 1867 | 甚么 1868 | 之所以 1869 | 加入 1870 | 下 1871 | 明显 1872 | 看出 1873 | 嘛 1874 | 顷刻 1875 | 即将 1876 | 借 1877 | 来得及 1878 | 既往 1879 | 猛然 1880 | 嘎嘎 1881 | 造成 1882 | 说说 1883 | 况且 1884 | ? 1885 | 之 1886 | ng昉 1887 | 打 1888 | 嘎登 1889 | 准备 1890 | 甚且 1891 | 那时 1892 | 我是 1893 | 各自 1894 | ⑧ 1895 | 从小 1896 | 自 1897 | 别是 1898 | 其后 1899 | 认真 1900 | 上来 1901 | 长线 1902 | 它 1903 | 处处 1904 | 《 1905 | 当头 1906 | 沙沙 1907 | В 1908 | 传 1909 | 如次 1910 | 另外 1911 | 怪 1912 | 地 1913 | 而且 1914 | 喔唷 1915 | 个人 1916 | 》 1917 | ) 1918 | , 1919 | ‘ 1920 | ” 1921 | “ 1922 | ’ 1923 | ~ 1924 | · 1925 | @ 1926 | # 1927 | ¥ 1928 | % 1929 | …… 1930 | & 1931 | * 1932 | ( 1933 | ) 1934 | + 1935 | = 1936 | { 1937 | } 1938 | : 1939 | ; 1940 | 《 1941 | 》 1942 | ? 1943 | / 1944 | 、 1945 | 绝不 1946 | 最後 1947 | 方便 1948 | 何以 1949 | 满 1950 | 敢情 1951 | 与其说 1952 | 假使 1953 | 快 1954 | f] 1955 | 大张旗鼓 1956 | 冒 1957 | 联袂 1958 | 屡屡 1959 | 往 1960 | 岂 1961 | 积极 1962 | [③a] 1963 | [② 1964 | 能否 1965 | 怕 1966 | 必定 1967 | -- 1968 | 尽快 1969 | 隔夜 1970 | 得天独厚 1971 | 也就是说 1972 | Ψ 1973 | 白白 1974 | 全身心 1975 | 他人 1976 | 居然 1977 | 又 1978 | 互相 1979 | 某 1980 | 今后 1981 | 何乐而不为 1982 | 更进一步 1983 | 切不可 1984 | 老大 1985 | 是否 1986 | 他们 1987 | 多次 1988 | 即 1989 | 起 1990 | 等到 1991 | 诸 1992 | 皆可 1993 | A 1994 | B 1995 | C 1996 | D 1997 | E 1998 | F 1999 | G 2000 | H 2001 | I 2002 | J 2003 | K 2004 | L 2005 | M 2006 | N 2007 | O 2008 | P 2009 | Q 2010 | R 2011 | S 2012 | T 2013 | U 2014 | V 2015 | W 2016 | X 2017 | Y 2018 | Z 2019 | z 2020 | x 2021 | c 2022 | v 2023 | b 2024 | n 2025 | m 2026 | l 2027 | k 2028 | j 2029 | h 2030 | g 2031 | f 2032 | d 2033 | s 2034 | a 2035 | q 2036 | w 2037 | e 2038 | r 2039 | t 2040 | y 2041 | u 2042 | i 2043 | o 2044 | p -------------------------------------------------------------------------------- /data/EnMicroMsg.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/data/EnMicroMsg.db -------------------------------------------------------------------------------- /data/chat_data.csv: -------------------------------------------------------------------------------- 1 | msgId,msgSvrId,type,status,isSend,isShowTimer,createTime,talker,content,imgPath,reserved,lvbuffer,transContent,transBrandWording,talkerId,bizClientMsgId,bizChatId,bizChatUserId,msgSeq,flag,solitaireFoldInfo,historyId,sentiment_score,newTime,情感类别,情感极性,情感词汇统计 2 | -------------------------------------------------------------------------------- /data/simhei.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/data/simhei.ttf -------------------------------------------------------------------------------- /data/大连理工大学中文情感词汇本体.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/data/大连理工大学中文情感词汇本体.xlsx -------------------------------------------------------------------------------- /generate_wordcloud.py: -------------------------------------------------------------------------------- 1 | from wordcloud import WordCloud 2 | import pandas as pd 3 | import jieba 4 | import re 5 | from collections import Counter 6 | import matplotlib.pyplot as plt 7 | 8 | def get_wordcloud(data_path,save_path,is_send=0): 9 | ''' 10 | 11 | :param data_path: 聊天记录文件csv 12 | :param is_send: 0代表对方发送的消息,1代表我发送的消息 13 | :param save_path: 词云保存路径 14 | :return: 15 | ''' 16 | 17 | df = pd.read_csv(data_path,encoding='utf-8') 18 | texts = df[df['isSend']==is_send]['content'].to_list() 19 | 20 | with open("data/CNstopwords.txt",'r',encoding='utf-8') as f: 21 | lines = f.readlines() 22 | stopwords = [line.strip().replace("\ufeff","") for line in lines] 23 | 24 | # 分词,去除停用词和表情(表情都是这样的格式:[xx]) 25 | norm_texts = [] 26 | pattern = re.compile("(\[.+?\])") 27 | for text in texts: 28 | text = pattern.sub('', text).replace("\n","") # 删除表情、换行符 29 | words = jieba.lcut(text) 30 | res = [word for word in words if word not in stopwords and word.replace(" ","")!="" and len(word)>1] 31 | if res!=[]: 32 | norm_texts.extend(res) 33 | 34 | count_dict = dict(Counter(norm_texts)) 35 | wc = WordCloud(font_path="data/simhei.ttf", background_color='white', include_numbers=False, 36 | random_state=0) # 如果不指定中文字体路径,词云会乱码 37 | wc = wc.fit_words(count_dict) 38 | plt.imshow(wc) 39 | plt.show() 40 | wc.to_file(save_path) 41 | 42 | # 示例:绘制 对方 发送的信息的词云图 43 | get_wordcloud("data/chat_data.csv",save_path="result/词云-他发的.png",is_send=0) 44 | -------------------------------------------------------------------------------- /others.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import seaborn as sns 3 | import matplotlib.pyplot as plt 4 | sns.set_style('white', {'font.sans-serif': ['simhei','FangSong']}) 5 | 6 | # 绘制消息平均长度随时间变化折线图(修改一下也可以变成消息数量随时间变化...) 7 | def draw_text_length(data_path): 8 | df = pd.read_csv(data_path, encoding='utf-8') 9 | send_df = df[df['isSend']==1] 10 | receive_df = df[df['isSend']==0] 11 | 12 | send_df['text_length'] = send_df['content'].str.len() 13 | receive_df['text_length'] = receive_df['content'].str.len() 14 | 15 | send_mean = send_df.groupby('newTime').mean() 16 | receive_mean = receive_df.groupby('newTime').mean() 17 | 18 | new_df = pd.DataFrame({"月份": list(send_mean.index) + list(receive_mean.index), 19 | "消息长度均值": send_mean['text_length'].to_list() + receive_mean['text_length'].to_list(), 20 | "is_send": ['send'] * len(send_mean) + ['receive'] * len(receive_mean)}) 21 | 22 | sns.lineplot(x="月份", y="消息长度均值", hue="is_send",data=new_df) 23 | plt.savefig("result/句子长度均值随时间变化.png") 24 | plt.show() 25 | 26 | draw_text_length("data/chat_data.csv") -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | snownlp 2 | pandas 3 | matplotlib 4 | seaborn 5 | jieba 6 | wordcloud -------------------------------------------------------------------------------- /result/句子长度均值随时间变化.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/result/句子长度均值随时间变化.png -------------------------------------------------------------------------------- /result/情感得分随时间变化.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/result/情感得分随时间变化.png -------------------------------------------------------------------------------- /result/情感热力图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/result/情感热力图.png -------------------------------------------------------------------------------- /result/数据示例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/result/数据示例.png -------------------------------------------------------------------------------- /result/词云-他发的.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/result/词云-他发的.png -------------------------------------------------------------------------------- /result/词云-我发的.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saturn-opposition/wechat_analysis/779b62100024988820a2d6ff80b006e1ce9d6416/result/词云-我发的.png -------------------------------------------------------------------------------- /sentiment_dict.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | pd.set_option("display.max_columns",None) 3 | import jieba 4 | import os 5 | 6 | import pandas as pd 7 | import seaborn as sns 8 | import matplotlib.pyplot as plt 9 | #解决中文显示问题 10 | plt.rcParams["font.sans-serif"]=["SimHei"] 11 | plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 12 | plt.rcParams.update({'font.size': 12.5}) 13 | 14 | 15 | 16 | def get_sentiment_dict(): 17 | df = pd.read_excel('data/大连理工大学中文情感词汇本体.xlsx') 18 | 19 | # 整理情绪列表 20 | Joy = [] 21 | Like = [] 22 | Surprise = [] 23 | Anger = [] 24 | Depress = [] 25 | Fear = [] 26 | Dislike = [] 27 | for idx, row in df.iterrows(): 28 | if row['情感分类'] in ['PA', 'PE']: 29 | Joy.append(row['词语']) 30 | if row['情感分类'] in ['PD', 'PH', 'PG', 'PB', 'PK']: 31 | Like.append(row['词语']) 32 | if row['情感分类'] in ['PC']: 33 | Surprise.append(row['词语']) 34 | if row['情感分类'] in ['NA']: 35 | Anger.append(row['词语']) 36 | if row['情感分类'] in ['NB', 'NJ', 'NH', 'PF']: 37 | Depress.append(row['词语']) 38 | if row['情感分类'] in ['NI', 'NC', 'NG']: 39 | Fear.append(row['词语']) 40 | if row['情感分类'] in ['NE', 'ND', 'NN', 'NK', 'NL']: 41 | Dislike.append(row['词语']) 42 | Positive = Joy + Like + Surprise 43 | Negative = Anger + Depress + Fear + Dislike 44 | print('情绪词语列表整理完成') 45 | 46 | 47 | return Joy , Like , Surprise,Anger , Depress , Fear , Dislike,Positive,Negative 48 | 49 | Joy , Like , Surprise,Anger , Depress , Fear , Dislike,Positive,Negative = get_sentiment_dict() 50 | 51 | def emotion_caculate(text): 52 | positive = 0 53 | negative = 0 54 | anger = 0 55 | dislike = 0 56 | fear = 0 57 | depress = 0 58 | surprise = 0 59 | like = 0 60 | joy = 0 61 | none = 0 62 | wordlist = text.split(" ") 63 | wordset = set(wordlist) 64 | 65 | for word in wordset: 66 | freq = wordlist.count(word) 67 | if word in Positive: 68 | positive+=freq 69 | if word in Negative: 70 | negative+=freq 71 | if word in Anger: 72 | anger+=freq 73 | if word in Dislike: 74 | dislike+=freq 75 | if word in Fear: 76 | fear+=freq 77 | if word in Depress: 78 | depress+=freq 79 | if word in Surprise: 80 | surprise+=freq 81 | if word in Like: 82 | like+=freq 83 | if word in Joy: 84 | joy+=freq 85 | 86 | emotion_info = { 87 | 'length':len(wordlist), 88 | 'positive': positive, 89 | 'negative': negative, 90 | 'anger': anger, 91 | 'dislike': dislike, 92 | 'fear':fear, 93 | 'like':like, 94 | 'depress':depress, 95 | 'surprise':surprise, 96 | 'joy':joy, 97 | } 98 | 99 | if positive>negative: 100 | polarity = '正面' 101 | elif positive==negative: 102 | polarity = '中立' 103 | else: 104 | polarity = '负面' 105 | 106 | dict = {'Anger': anger, 107 | 'Dislike': dislike, 108 | 'Fear':fear, 109 | 'Like':like, 110 | 'Depress':depress, 111 | 'Surprise':surprise, 112 | 'Joy':joy,} 113 | sentiment_type = max(dict.items(), key=lambda x: x[1])[0] 114 | 115 | if dict[sentiment_type]==0: 116 | sentiment_type = 'None' 117 | 118 | return sentiment_type,polarity,str(emotion_info) 119 | 120 | 121 | def sentiment_analysis(path): 122 | data_df = pd.read_csv(path) 123 | content = data_df['content'].to_list() 124 | content = [' '.join(jieba.lcut(s)) for s in content] 125 | types = [] 126 | polaritys = [] 127 | details = [] 128 | for i in range(len(content)): 129 | if pd.isna(content[i]): 130 | sentiment_type, polarity, detail = emotion_caculate("") 131 | else: 132 | sentiment_type, polarity, detail = emotion_caculate(content[i]) 133 | types.append(sentiment_type) 134 | polaritys.append(polarity) 135 | details.append(detail) 136 | 137 | data_df['情感类别'] = types 138 | data_df['情感极性'] = polaritys 139 | data_df['情感词汇统计'] = details 140 | data_df.to_csv(path,encoding='utf-8',index=False) 141 | 142 | 143 | 144 | def draw(path,savepath,order=None): 145 | df = pd.read_csv(path) 146 | df = df[df["情感类别"]!="None"] 147 | 148 | w = df.groupby(['newTime','情感类别'], as_index=False).count() 149 | w=w.loc[:,['newTime','情感类别','msgId']] 150 | 151 | w.columns = ['时间','情感','Count'] 152 | data_heatmap = w.pivot(index='情感', columns='时间' ,values='Count') 153 | 154 | data_heatmap = data_heatmap.reindex(index=['Like','Depress','Anger','Dislike','Fear', 'Joy','Surprise'],fill_value=0) 155 | 156 | if order!=None: 157 | data_heatmap = data_heatmap[order] 158 | 159 | pic = sns.heatmap(data_heatmap, fmt="d", cmap='gist_heat_r', annot=False) 160 | 161 | plt.tight_layout() 162 | plt.savefig(savepath) 163 | plt.show() 164 | 165 | sentiment_analysis("data/chat_data.csv") 166 | draw("data/chat_data.csv","result/情感热力图.png") 167 | 168 | 169 | 170 | 171 | -------------------------------------------------------------------------------- /sentiment_snownlp.py: -------------------------------------------------------------------------------- 1 | from snownlp import SnowNLP 2 | import pandas as pd 3 | import matplotlib.pyplot as plt 4 | import seaborn as sns 5 | 6 | sns.set_style('white', {'font.sans-serif': ['simhei','FangSong']}) 7 | 8 | def get_sentiment_score(data_path): 9 | df = pd.read_csv(data_path, encoding='utf-8') 10 | texts = df['content'].to_list() 11 | scores = [] 12 | for i in texts: 13 | s = SnowNLP(i) 14 | print(s.sentiments) # 越接近0越负面,越接近1越正面 15 | scores.append(s.sentiments) 16 | df['sentiment_score'] = scores 17 | 18 | # get_sentiment_score(data_path="data/chat_data.csv") 19 | 20 | def draw(data_path): # csv中的聊天记录有时间顺序 21 | df = pd.read_csv(data_path, encoding='utf-8') 22 | send_df = df[df['isSend']==1] 23 | receive_df = df[df['isSend']==0] 24 | send_mean = send_df.groupby('newTime').mean() 25 | receive_mean = receive_df.groupby('newTime').mean() 26 | 27 | new_df = pd.DataFrame({"月份":list(send_mean.index) + list(receive_mean.index), 28 | "情感得分均值":send_mean['sentiment_score'].to_list() + receive_mean['sentiment_score'].to_list(), 29 | "is_send":['send']*len(send_mean)+['receive']*len(receive_mean)}) 30 | sns.lineplot(x="月份", y="情感得分均值", hue="is_send",data=new_df) 31 | plt.savefig("result/情感得分随时间变化.png") 32 | plt.show() 33 | 34 | draw("data/chat_data.csv") 35 | 36 | --------------------------------------------------------------------------------