├── README.md ├── data └── stopWord.json ├── douban_NLP_envs.ipynb └── image ├── example.png └── 数据样式.png /README.md: -------------------------------------------------------------------------------- 1 | # 豆瓣电影评分预测 2 | 3 | 本项目基于豆瓣电影平台上用户对电影的评论与打分的数据集,构建一个豆瓣电影评分预测系统。 4 | 具体流程如下: 5 | 6 | - 中文分词 7 | - 文本预处理(包括去停用词、去低频词等) 8 | - 文本特征提取(使用tf-idf、word2vec、bert embedding三种技术设计文本特征) 9 | - 模型搭建和训练(利用逻辑回归、朴素贝叶斯两个简单的机器学习分类模型搭建算法) 10 | 11 | ## 1. 准备数据 12 | 首先下载[豆瓣电影评分数据集DBMS](https://pan.baidu.com/s/1pIBLEeiv5ychGmj2keNLSQ ),提取码`l9xj`。 13 | 14 | 另外,实验中还参照了知乎预训练的词向量进行比对,在[此处](https://pan.baidu.com/s/1kaa8EpMrN5r1Gc-ALOVI1w )下载,提取码:`yjic`。 15 | 16 | 下载后将两个文件放在项目中的data文件夹下。 17 | 18 | 加载数据后样式如下: 19 | ![数据样式](image/数据样式.png) 20 | 21 | ## 2. 逐块运行`douban_NLP_envs.ipynb`文件 22 | 示例如下 23 | ![示例](image/example.png) -------------------------------------------------------------------------------- /data/stopWord.json: -------------------------------------------------------------------------------- 1 | $ 2 | 0 3 | 1 4 | 2 5 | 3 6 | 4 7 | 5 8 | 6 9 | 7 10 | 8 11 | 9 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 | 不料 52 | 不是 53 | 不比 54 | 不然 55 | 不特 56 | 不独 57 | 不管 58 | 不至于 59 | 不若 60 | 不论 61 | 不过 62 | 不问 63 | 与 64 | 与其 65 | 与其说 66 | 与否 67 | 与此同时 68 | 且 69 | 且不说 70 | 且说 71 | 两者 72 | 个 73 | 个别 74 | 临 75 | 为 76 | 为了 77 | 为什么 78 | 为何 79 | 为止 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 | 什么样 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 | 依照 155 | 便于 156 | 俺 157 | 俺们 158 | 倘 159 | 倘使 160 | 倘或 161 | 倘然 162 | 倘若 163 | 借 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 | 只当 247 | 只怕 248 | 只是 249 | 只有 250 | 只消 251 | 只要 252 | 只限 253 | 叫 254 | 叮咚 255 | 可 256 | 可以 257 | 可是 258 | 可见 259 | 各 260 | 各个 261 | 各位 262 | 各种 263 | 各自 264 | 同 265 | 同时 266 | 后 267 | 后者 268 | 向 269 | 向使 270 | 向着 271 | 吓 272 | 吗 273 | 否则 274 | 吧 275 | 吧哒 276 | 吱 277 | 呀 278 | 呃 279 | 呕 280 | 呗 281 | 呜 282 | 呜呼 283 | 呢 284 | 呵 285 | 呵呵 286 | 呸 287 | 呼哧 288 | 咋 289 | 和 290 | 咚 291 | 咦 292 | 咧 293 | 咱 294 | 咱们 295 | 咳 296 | 哇 297 | 哈 298 | 哈哈 299 | 哉 300 | 哎 301 | 哎呀 302 | 哎哟 303 | 哗 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 | 嗡 332 | 嗡嗡 333 | 嗬 334 | 嗯 335 | 嗳 336 | 嘎 337 | 嘎登 338 | 嘘 339 | 嘛 340 | 嘻 341 | 嘿 342 | 嘿嘿 343 | 因 344 | 因为 345 | 因了 346 | 因此 347 | 因着 348 | 因而 349 | 固然 350 | 在 351 | 在下 352 | 在于 353 | 地 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 | 宁愿 381 | 宁肯 382 | 它 383 | 它们 384 | 对 385 | 对于 386 | 对待 387 | 对方 388 | 对比 389 | 将 390 | 小 391 | 尔 392 | 尔后 393 | 尔尔 394 | 尚且 395 | 就 396 | 就是 397 | 就是了 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 | 怎么样 435 | 怎奈 436 | 怎样 437 | 总之 438 | 总的来看 439 | 总的来说 440 | 总的说来 441 | 总而言之 442 | 恰恰相反 443 | 您 444 | 惟其 445 | 慢说 446 | 我 447 | 我们 448 | 或 449 | 或则 450 | 或是 451 | 或曰 452 | 或者 453 | 截至 454 | 所 455 | 所以 456 | 所在 457 | 所幸 458 | 所有 459 | 才 460 | 才能 461 | 打 462 | 打从 463 | 把 464 | 抑或 465 | 拿 466 | 按 467 | 按照 468 | 换句话说 469 | 换言之 470 | 据 471 | 据此 472 | 接着 473 | 故 474 | 故此 475 | 故而 476 | 旁人 477 | 无 478 | 无宁 479 | 无论 480 | 既 481 | 既往 482 | 既是 483 | 既然 484 | 时候 485 | 是 486 | 是以 487 | 是的 488 | 曾 489 | 替 490 | 替代 491 | 最 492 | 有 493 | 有些 494 | 有关 495 | 有及 496 | 有时 497 | 有的 498 | 望 499 | 朝 500 | 朝着 501 | 本 502 | 本人 503 | 本地 504 | 本着 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 | 沿着 540 | 漫说 541 | 焉 542 | 然则 543 | 然后 544 | 然而 545 | 照 546 | 照着 547 | 犹且 548 | 犹自 549 | 甚且 550 | 甚么 551 | 甚或 552 | 甚而 553 | 甚至 554 | 甚至于 555 | 用 556 | 用来 557 | 由 558 | 由于 559 | 由是 560 | 由此 561 | 由此可见 562 | 的 563 | 的确 564 | 的话 565 | 直到 566 | 相对而言 567 | 省得 568 | 看 569 | 眨眼 570 | 着 571 | 着呢 572 | 矣 573 | 矣乎 574 | 矣哉 575 | 离 576 | 竟而 577 | 第 578 | 等 579 | 等到 580 | 等等 581 | 简言之 582 | 管 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 | 要是 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 | 趁着 670 | 越是 671 | 距 672 | 跟 673 | 较 674 | 较之 675 | 边 676 | 过 677 | 还 678 | 还是 679 | 还有 680 | 还要 681 | 这 682 | 这一来 683 | 这个 684 | 这么 685 | 这么些 686 | 这么样 687 | 这么点儿 688 | 这些 689 | 这会儿 690 | 这儿 691 | 这就是说 692 | 这时 693 | 这样 694 | 这次 695 | 这般 696 | 这边 697 | 这里 698 | 进而 699 | 连 700 | 连同 701 | 逐步 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 | 除非 729 | 随 730 | 随后 731 | 随时 732 | 随着 733 | 难道说 734 | 非但 735 | 非徒 736 | 非特 737 | 非独 738 | 靠 739 | 顺 740 | 顺着 741 | 首先 742 | ! 743 | , 744 | : 745 | ; 746 | ? 747 | -------------------------------------------------------------------------------- /douban_NLP_envs.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 豆瓣评分的预测\n", 8 | "\n", 9 | "在这个项目中,我们要预测一部电影的评分,这个问题实际上就是一个分类问题。给定的输入为一段文本,输出为具体的评分。 在这个项目中,我们需要做:\n", 10 | "- 文本的预处理,如停用词的过滤,低频词的过滤,特殊符号的过滤等\n", 11 | "- 文本转化成向量,将使用三种方式,分别为tf-idf, word2vec以及BERT向量。 \n", 12 | "- 训练逻辑回归和朴素贝叶斯模型,并做交叉验证\n", 13 | "- 评估模型的准确率\n" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 1, 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "#导入数据处理的基础包\n", 23 | "import numpy as np\n", 24 | "import pandas as pd\n", 25 | "\n", 26 | "#导入用于计数的包\n", 27 | "from collections import Counter\n", 28 | "\n", 29 | "#导入tf-idf相关的包\n", 30 | "from sklearn.feature_extraction.text import TfidfTransformer \n", 31 | "from sklearn.feature_extraction.text import CountVectorizer\n", 32 | "\n", 33 | "#导入模型评估的包\n", 34 | "from sklearn import metrics\n", 35 | "\n", 36 | "#导入与word2vec相关的包\n", 37 | "from gensim.models import KeyedVectors\n", 38 | "\n", 39 | "#导入与bert embedding相关的包,关于mxnet包下载的注意事项参考实验手册\n", 40 | "from bert_embedding import BertEmbedding\n", 41 | "import mxnet\n", 42 | "\n", 43 | "#包tqdm是用来对可迭代对象执行时生成一个进度条用以监视程序运行过程\n", 44 | "from tqdm import tqdm\n", 45 | "\n", 46 | "#导入其他一些功能包\n", 47 | "import requests\n", 48 | "import os\n" 49 | ] 50 | }, 51 | { 52 | "cell_type": "markdown", 53 | "metadata": {}, 54 | "source": [ 55 | "### 1. 读取数据并做文本的处理\n", 56 | "需要完成以下几步操作:\n", 57 | "- 去掉无用的字符如!&,可自行定义\n", 58 | "- 中文分词\n", 59 | "- 去掉低频词" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 2, 65 | "metadata": {}, 66 | "outputs": [ 67 | { 68 | "data": { 69 | "text/html": [ 70 | "
\n", 71 | "\n", 84 | "\n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | "
IDMovie_Name_ENMovie_Name_CNCrawl_DateNumberUsernameDateStarCommentLike
00Avengers Age of Ultron复仇者联盟22017-01-221然潘2015-05-133连奥创都知道整容要去韩国。2404
110Avengers Age of Ultron复仇者联盟22017-01-2211影志2015-04-304“一个没有黑暗面的人不值得信任。” 第二部剥去冗长的铺垫,开场即高潮、一直到结束,会有人觉...381
220Avengers Age of Ultron复仇者联盟22017-01-2221随时流感2015-04-282奥创弱爆了弱爆了弱爆了啊!!!!!!120
330Avengers Age of Ultron复仇者联盟22017-01-2231乌鸦火堂2015-05-084与第一集不同,承上启下,阴郁严肃,但也不会不好看啊,除非本来就不喜欢漫威电影。场面更加宏大...30
440Avengers Age of Ultron复仇者联盟22017-01-2241办公室甜心2015-05-105看毕,我激动地对友人说,等等奥创要来毁灭台北怎么办厚,她拍了拍我肩膀,没事,反正你买了两份...16
\n", 168 | "
" 169 | ], 170 | "text/plain": [ 171 | " ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username \\\n", 172 | "0 0 Avengers Age of Ultron 复仇者联盟2 2017-01-22 1 然潘 \n", 173 | "1 10 Avengers Age of Ultron 复仇者联盟2 2017-01-22 11 影志 \n", 174 | "2 20 Avengers Age of Ultron 复仇者联盟2 2017-01-22 21 随时流感 \n", 175 | "3 30 Avengers Age of Ultron 复仇者联盟2 2017-01-22 31 乌鸦火堂 \n", 176 | "4 40 Avengers Age of Ultron 复仇者联盟2 2017-01-22 41 办公室甜心 \n", 177 | "\n", 178 | " Date Star Comment Like \n", 179 | "0 2015-05-13 3 连奥创都知道整容要去韩国。 2404 \n", 180 | "1 2015-04-30 4 “一个没有黑暗面的人不值得信任。” 第二部剥去冗长的铺垫,开场即高潮、一直到结束,会有人觉... 381 \n", 181 | "2 2015-04-28 2 奥创弱爆了弱爆了弱爆了啊!!!!!! 120 \n", 182 | "3 2015-05-08 4 与第一集不同,承上启下,阴郁严肃,但也不会不好看啊,除非本来就不喜欢漫威电影。场面更加宏大... 30 \n", 183 | "4 2015-05-10 5 看毕,我激动地对友人说,等等奥创要来毁灭台北怎么办厚,她拍了拍我肩膀,没事,反正你买了两份... 16 " 184 | ] 185 | }, 186 | "execution_count": 2, 187 | "metadata": {}, 188 | "output_type": "execute_result" 189 | } 190 | ], 191 | "source": [ 192 | "#读取数据\n", 193 | "data = pd.read_csv('data/DMSC.csv')\n", 194 | "#观察数据格式\n", 195 | "data.head()" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": 3, 201 | "metadata": {}, 202 | "outputs": [ 203 | { 204 | "data": { 205 | "text/html": [ 206 | "
\n", 207 | "\n", 220 | "\n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | "
CommentStar
0连奥创都知道整容要去韩国。3
1“一个没有黑暗面的人不值得信任。” 第二部剥去冗长的铺垫,开场即高潮、一直到结束,会有人觉...4
2奥创弱爆了弱爆了弱爆了啊!!!!!!2
3与第一集不同,承上启下,阴郁严肃,但也不会不好看啊,除非本来就不喜欢漫威电影。场面更加宏大...4
4看毕,我激动地对友人说,等等奥创要来毁灭台北怎么办厚,她拍了拍我肩膀,没事,反正你买了两份...5
\n", 256 | "
" 257 | ], 258 | "text/plain": [ 259 | " Comment Star\n", 260 | "0 连奥创都知道整容要去韩国。 3\n", 261 | "1 “一个没有黑暗面的人不值得信任。” 第二部剥去冗长的铺垫,开场即高潮、一直到结束,会有人觉... 4\n", 262 | "2 奥创弱爆了弱爆了弱爆了啊!!!!!! 2\n", 263 | "3 与第一集不同,承上启下,阴郁严肃,但也不会不好看啊,除非本来就不喜欢漫威电影。场面更加宏大... 4\n", 264 | "4 看毕,我激动地对友人说,等等奥创要来毁灭台北怎么办厚,她拍了拍我肩膀,没事,反正你买了两份... 5" 265 | ] 266 | }, 267 | "execution_count": 3, 268 | "metadata": {}, 269 | "output_type": "execute_result" 270 | } 271 | ], 272 | "source": [ 273 | "#只保留数据中我们需要的两列:Comment列和Star列\n", 274 | "data = data[['Comment','Star']]\n", 275 | "#观察新的数据的格式\n", 276 | "data.head()" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 4, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "data": { 286 | "text/html": [ 287 | "
\n", 288 | "\n", 301 | "\n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | "
CommentStar
0连奥创都知道整容要去韩国。1
1“一个没有黑暗面的人不值得信任。” 第二部剥去冗长的铺垫,开场即高潮、一直到结束,会有人觉...1
2奥创弱爆了弱爆了弱爆了啊!!!!!!0
3与第一集不同,承上启下,阴郁严肃,但也不会不好看啊,除非本来就不喜欢漫威电影。场面更加宏大...1
4看毕,我激动地对友人说,等等奥创要来毁灭台北怎么办厚,她拍了拍我肩膀,没事,反正你买了两份...1
\n", 337 | "
" 338 | ], 339 | "text/plain": [ 340 | " Comment Star\n", 341 | "0 连奥创都知道整容要去韩国。 1\n", 342 | "1 “一个没有黑暗面的人不值得信任。” 第二部剥去冗长的铺垫,开场即高潮、一直到结束,会有人觉... 1\n", 343 | "2 奥创弱爆了弱爆了弱爆了啊!!!!!! 0\n", 344 | "3 与第一集不同,承上启下,阴郁严肃,但也不会不好看啊,除非本来就不喜欢漫威电影。场面更加宏大... 1\n", 345 | "4 看毕,我激动地对友人说,等等奥创要来毁灭台北怎么办厚,她拍了拍我肩膀,没事,反正你买了两份... 1" 346 | ] 347 | }, 348 | "execution_count": 4, 349 | "metadata": {}, 350 | "output_type": "execute_result" 351 | } 352 | ], 353 | "source": [ 354 | "# 这里的star代表具体的评分。但在这个项目中,我们要预测的是正面还是负面。我们把评分为1和2的看作是负面,把评分为3,4,5的作为正面\n", 355 | "data['Star']=(data.Star/3).astype(int)\n", 356 | "data.head()" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": {}, 362 | "source": [ 363 | "#### 任务1: 去掉一些无用的字符" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 5, 369 | "metadata": {}, 370 | "outputs": [ 371 | { 372 | "name": "stderr", 373 | "output_type": "stream", 374 | "text": [ 375 | "douban: 100%|██████████████████████████████████████████████████████████████| 212506/212506 [00:00<00:00, 562982.34it/s]\n" 376 | ] 377 | } 378 | ], 379 | "source": [ 380 | "tqdm.pandas(desc='douban') #查看处理进度\n", 381 | "data['Comment']=data['Comment'].progress_apply(lambda x:x.replace(',','').replace('。',''))" 382 | ] 383 | }, 384 | { 385 | "cell_type": "code", 386 | "execution_count": 6, 387 | "metadata": { 388 | "scrolled": true 389 | }, 390 | "outputs": [ 391 | { 392 | "data": { 393 | "text/html": [ 394 | "
\n", 395 | "\n", 408 | "\n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | "
CommentStar
0连奥创都知道整容要去韩国1
1“一个没有黑暗面的人不值得信任” 第二部剥去冗长的铺垫开场即高潮、一直到结束会有人觉得只剩...1
2奥创弱爆了弱爆了弱爆了啊!!!!!!0
3与第一集不同承上启下阴郁严肃但也不会不好看啊除非本来就不喜欢漫威电影场面更加宏大单打与团战...1
4看毕我激动地对友人说等等奥创要来毁灭台北怎么办厚她拍了拍我肩膀没事反正你买了两份旅行保险惹...1
\n", 444 | "
" 445 | ], 446 | "text/plain": [ 447 | " Comment Star\n", 448 | "0 连奥创都知道整容要去韩国 1\n", 449 | "1 “一个没有黑暗面的人不值得信任” 第二部剥去冗长的铺垫开场即高潮、一直到结束会有人觉得只剩... 1\n", 450 | "2 奥创弱爆了弱爆了弱爆了啊!!!!!! 0\n", 451 | "3 与第一集不同承上启下阴郁严肃但也不会不好看啊除非本来就不喜欢漫威电影场面更加宏大单打与团战... 1\n", 452 | "4 看毕我激动地对友人说等等奥创要来毁灭台北怎么办厚她拍了拍我肩膀没事反正你买了两份旅行保险惹... 1" 453 | ] 454 | }, 455 | "execution_count": 6, 456 | "metadata": {}, 457 | "output_type": "execute_result" 458 | } 459 | ], 460 | "source": [ 461 | "# 观察新的数据的格式\n", 462 | "data.head()" 463 | ] 464 | }, 465 | { 466 | "cell_type": "markdown", 467 | "metadata": {}, 468 | "source": [ 469 | "#### 任务2:使用结巴分词对文本做分词" 470 | ] 471 | }, 472 | { 473 | "cell_type": "code", 474 | "execution_count": 7, 475 | "metadata": {}, 476 | "outputs": [ 477 | { 478 | "name": "stderr", 479 | "output_type": "stream", 480 | "text": [ 481 | "apply: 0%| | 0/212506 [00:00\n", 510 | "\n", 523 | "\n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | "
CommentStarcomment_processed
0连奥创都知道整容要去韩国1[连, 奥创, 都, 知道, 整容, 要, 去, 韩国]
1“一个没有黑暗面的人不值得信任” 第二部剥去冗长的铺垫开场即高潮、一直到结束会有人觉得只剩...1[“, 一个, 没有, 黑暗面, 的, 人, 不, 值得, 信任, ”, , 第二部, 剥...
2奥创弱爆了弱爆了弱爆了啊!!!!!!0[奥创, 弱, 爆, 了, 弱, 爆, 了, 弱, 爆, 了, 啊, !, !, !, !,...
3与第一集不同承上启下阴郁严肃但也不会不好看啊除非本来就不喜欢漫威电影场面更加宏大单打与团战...1[与, 第一集, 不同, 承上启下, 阴郁, 严肃, 但, 也, 不会, 不, 好看, 啊,...
4看毕我激动地对友人说等等奥创要来毁灭台北怎么办厚她拍了拍我肩膀没事反正你买了两份旅行保险惹...1[看毕, 我, 激动, 地, 对, 友人, 说, 等等, 奥创, 要, 来, 毁灭, 台北,...
\n", 565 | "" 566 | ], 567 | "text/plain": [ 568 | " Comment Star \\\n", 569 | "0 连奥创都知道整容要去韩国 1 \n", 570 | "1 “一个没有黑暗面的人不值得信任” 第二部剥去冗长的铺垫开场即高潮、一直到结束会有人觉得只剩... 1 \n", 571 | "2 奥创弱爆了弱爆了弱爆了啊!!!!!! 0 \n", 572 | "3 与第一集不同承上启下阴郁严肃但也不会不好看啊除非本来就不喜欢漫威电影场面更加宏大单打与团战... 1 \n", 573 | "4 看毕我激动地对友人说等等奥创要来毁灭台北怎么办厚她拍了拍我肩膀没事反正你买了两份旅行保险惹... 1 \n", 574 | "\n", 575 | " comment_processed \n", 576 | "0 [连, 奥创, 都, 知道, 整容, 要, 去, 韩国] \n", 577 | "1 [“, 一个, 没有, 黑暗面, 的, 人, 不, 值得, 信任, ”, , 第二部, 剥... \n", 578 | "2 [奥创, 弱, 爆, 了, 弱, 爆, 了, 弱, 爆, 了, 啊, !, !, !, !,... \n", 579 | "3 [与, 第一集, 不同, 承上启下, 阴郁, 严肃, 但, 也, 不会, 不, 好看, 啊,... \n", 580 | "4 [看毕, 我, 激动, 地, 对, 友人, 说, 等等, 奥创, 要, 来, 毁灭, 台北,... " 581 | ] 582 | }, 583 | "execution_count": 10, 584 | "metadata": {}, 585 | "output_type": "execute_result" 586 | } 587 | ], 588 | "source": [ 589 | "data.head()" 590 | ] 591 | }, 592 | { 593 | "cell_type": "markdown", 594 | "metadata": {}, 595 | "source": [ 596 | "#### 任务3:设定停用词并去掉停用词" 597 | ] 598 | }, 599 | { 600 | "cell_type": "code", 601 | "execution_count": 12, 602 | "metadata": {}, 603 | "outputs": [ 604 | { 605 | "name": "stderr", 606 | "output_type": "stream", 607 | "text": [ 608 | "apply: 100%|█████| 212506/212506 [00:35<00:00, 5936.44it/s]\n" 609 | ] 610 | } 611 | ], 612 | "source": [ 613 | "# 读取下载的停用词表,并保存在列表中\n", 614 | "with open(\"data/stopWord.json\",\"r\",encoding='utf-8') as f:\n", 615 | " stopWords = f.read().split(\"\\n\")\n", 616 | "\n", 617 | "# 去除停用词\n", 618 | "def rm_stop_word(wordList):\n", 619 | " return [word for word in wordList if word not in stopWords]\n", 620 | "\n", 621 | "#这行代码中.progress_apply()函数的作用等同于.apply()函数的作用,只是写成.progress_apply()函数才能被tqdm包监控从而输出进度条。\n", 622 | "data['comment_processed'] = data['comment_processed'].progress_apply(rm_stop_word)" 623 | ] 624 | }, 625 | { 626 | "cell_type": "code", 627 | "execution_count": 15, 628 | "metadata": { 629 | "scrolled": true 630 | }, 631 | "outputs": [ 632 | { 633 | "data": { 634 | "text/html": [ 635 | "
\n", 636 | "\n", 649 | "\n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | "
CommentStarcomment_processed
0连奥创都知道整容要去韩国1[奥创, 知道, 整容, 韩国]
1“一个没有黑暗面的人不值得信任” 第二部剥去冗长的铺垫开场即高潮、一直到结束会有人觉得只剩...1[一个, 没有, 黑暗面, 值得, 信任, , 第二部, 剥去, 冗长, 铺垫, 开场, ...
2奥创弱爆了弱爆了弱爆了啊!!!!!!0[奥创, 弱, 爆, 弱, 爆, 弱, 爆]
3与第一集不同承上启下阴郁严肃但也不会不好看啊除非本来就不喜欢漫威电影场面更加宏大单打与团战...1[第一集, 不同, 承上启下, 阴郁, 严肃, 不会, 好看, 本来, 喜欢, 漫威, 电影...
4看毕我激动地对友人说等等奥创要来毁灭台北怎么办厚她拍了拍我肩膀没事反正你买了两份旅行保险惹...1[看毕, 激动, 友人, 说, 奥创, 毁灭, 台北, 厚, 拍了拍, 肩膀, 没事, 反正...
\n", 691 | "
" 692 | ], 693 | "text/plain": [ 694 | " Comment Star \\\n", 695 | "0 连奥创都知道整容要去韩国 1 \n", 696 | "1 “一个没有黑暗面的人不值得信任” 第二部剥去冗长的铺垫开场即高潮、一直到结束会有人觉得只剩... 1 \n", 697 | "2 奥创弱爆了弱爆了弱爆了啊!!!!!! 0 \n", 698 | "3 与第一集不同承上启下阴郁严肃但也不会不好看啊除非本来就不喜欢漫威电影场面更加宏大单打与团战... 1 \n", 699 | "4 看毕我激动地对友人说等等奥创要来毁灭台北怎么办厚她拍了拍我肩膀没事反正你买了两份旅行保险惹... 1 \n", 700 | "\n", 701 | " comment_processed \n", 702 | "0 [奥创, 知道, 整容, 韩国] \n", 703 | "1 [一个, 没有, 黑暗面, 值得, 信任, , 第二部, 剥去, 冗长, 铺垫, 开场, ... \n", 704 | "2 [奥创, 弱, 爆, 弱, 爆, 弱, 爆] \n", 705 | "3 [第一集, 不同, 承上启下, 阴郁, 严肃, 不会, 好看, 本来, 喜欢, 漫威, 电影... \n", 706 | "4 [看毕, 激动, 友人, 说, 奥创, 毁灭, 台北, 厚, 拍了拍, 肩膀, 没事, 反正... " 707 | ] 708 | }, 709 | "execution_count": 15, 710 | "metadata": {}, 711 | "output_type": "execute_result" 712 | } 713 | ], 714 | "source": [ 715 | "data.head()" 716 | ] 717 | }, 718 | { 719 | "cell_type": "markdown", 720 | "metadata": {}, 721 | "source": [ 722 | "#### 任务4:去掉低频词,出现次数少于10次的词去掉" 723 | ] 724 | }, 725 | { 726 | "cell_type": "code", 727 | "execution_count": 17, 728 | "metadata": {}, 729 | "outputs": [ 730 | { 731 | "name": "stdout", 732 | "output_type": "stream", 733 | "text": [ 734 | "106235\n" 735 | ] 736 | } 737 | ], 738 | "source": [ 739 | "#确实得建立大词典来统计所有词词频\n", 740 | "word_dic={}\n", 741 | "for comment in data['comment_processed']:\n", 742 | " for word in comment:\n", 743 | " if word in word_dic:\n", 744 | " word_dic[word]+=1\n", 745 | " else:\n", 746 | " word_dic[word]=1\n", 747 | "print(len(word_dic))" 748 | ] 749 | }, 750 | { 751 | "cell_type": "code", 752 | "execution_count": 19, 753 | "metadata": {}, 754 | "outputs": [ 755 | { 756 | "name": "stdout", 757 | "output_type": "stream", 758 | "text": [ 759 | "[('奥创', 302), ('知道', 6022), ('整容', 79), ('韩国', 1633), ('一个', 13852), ('没有', 18448), ('黑暗面', 31), ('值得', 3056), ('信任', 223), (' ', 98052)]\n" 760 | ] 761 | } 762 | ], 763 | "source": [ 764 | "print(list(word_dic.items())[:10])" 765 | ] 766 | }, 767 | { 768 | "cell_type": "code", 769 | "execution_count": 20, 770 | "metadata": {}, 771 | "outputs": [ 772 | { 773 | "name": "stderr", 774 | "output_type": "stream", 775 | "text": [ 776 | "apply: 100%|███| 212506/212506 [00:00<00:00, 269018.58it/s]\n" 777 | ] 778 | } 779 | ], 780 | "source": [ 781 | "def rm_low_freq_word(wordList):\n", 782 | " return [w for w in wordList if word_dic[w]>=10]\n", 783 | "\n", 784 | "data['comment_processed'] = data['comment_processed'].progress_apply(rm_low_freq_word)" 785 | ] 786 | }, 787 | { 788 | "cell_type": "code", 789 | "execution_count": 21, 790 | "metadata": {}, 791 | "outputs": [ 792 | { 793 | "data": { 794 | "text/html": [ 795 | "
\n", 796 | "\n", 809 | "\n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | "
CommentStarcomment_processed
0连奥创都知道整容要去韩国1[奥创, 知道, 整容, 韩国]
1“一个没有黑暗面的人不值得信任” 第二部剥去冗长的铺垫开场即高潮、一直到结束会有人觉得只剩...1[一个, 没有, 黑暗面, 值得, 信任, , 第二部, 冗长, 铺垫, 开场, 高潮, ...
2奥创弱爆了弱爆了弱爆了啊!!!!!!0[奥创, 弱, 爆, 弱, 爆, 弱, 爆]
3与第一集不同承上启下阴郁严肃但也不会不好看啊除非本来就不喜欢漫威电影场面更加宏大单打与团战...1[第一集, 不同, 承上启下, 阴郁, 严肃, 不会, 好看, 本来, 喜欢, 漫威, 电影...
4看毕我激动地对友人说等等奥创要来毁灭台北怎么办厚她拍了拍我肩膀没事反正你买了两份旅行保险惹...1[激动, 友人, 说, 奥创, 毁灭, 台北, 厚, 肩膀, 没事, 反正, 买, 两份, ...
\n", 851 | "
" 852 | ], 853 | "text/plain": [ 854 | " Comment Star \\\n", 855 | "0 连奥创都知道整容要去韩国 1 \n", 856 | "1 “一个没有黑暗面的人不值得信任” 第二部剥去冗长的铺垫开场即高潮、一直到结束会有人觉得只剩... 1 \n", 857 | "2 奥创弱爆了弱爆了弱爆了啊!!!!!! 0 \n", 858 | "3 与第一集不同承上启下阴郁严肃但也不会不好看啊除非本来就不喜欢漫威电影场面更加宏大单打与团战... 1 \n", 859 | "4 看毕我激动地对友人说等等奥创要来毁灭台北怎么办厚她拍了拍我肩膀没事反正你买了两份旅行保险惹... 1 \n", 860 | "\n", 861 | " comment_processed \n", 862 | "0 [奥创, 知道, 整容, 韩国] \n", 863 | "1 [一个, 没有, 黑暗面, 值得, 信任, , 第二部, 冗长, 铺垫, 开场, 高潮, ... \n", 864 | "2 [奥创, 弱, 爆, 弱, 爆, 弱, 爆] \n", 865 | "3 [第一集, 不同, 承上启下, 阴郁, 严肃, 不会, 好看, 本来, 喜欢, 漫威, 电影... \n", 866 | "4 [激动, 友人, 说, 奥创, 毁灭, 台北, 厚, 肩膀, 没事, 反正, 买, 两份, ... " 867 | ] 868 | }, 869 | "execution_count": 21, 870 | "metadata": {}, 871 | "output_type": "execute_result" 872 | } 873 | ], 874 | "source": [ 875 | "data.head()" 876 | ] 877 | }, 878 | { 879 | "cell_type": "markdown", 880 | "metadata": {}, 881 | "source": [ 882 | "### 2. 把文本分为训练集和测试集\n", 883 | "选择语料库中的20%作为测试数据,剩下的作为训练数据" 884 | ] 885 | }, 886 | { 887 | "cell_type": "code", 888 | "execution_count": 23, 889 | "metadata": {}, 890 | "outputs": [], 891 | "source": [ 892 | "from sklearn.model_selection import train_test_split\n", 893 | "train, test = train_test_split(data, test_size = 0.2)\n", 894 | "x_train = train['comment_processed']\n", 895 | "x_test = test['comment_processed']\n", 896 | "y_train = train['Star']\n", 897 | "y_test = test['Star']" 898 | ] 899 | }, 900 | { 901 | "cell_type": "markdown", 902 | "metadata": {}, 903 | "source": [ 904 | "### 3. 把文本转换成向量的形式\n", 905 | "\n", 906 | "在这个部分我们会采用三种不同的方式:\n", 907 | "- 使用tf-idf向量\n", 908 | "- 使用word2vec\n", 909 | "- 使用bert向量\n", 910 | "\n", 911 | "转换成向量之后,我们接着做模型的训练" 912 | ] 913 | }, 914 | { 915 | "cell_type": "markdown", 916 | "metadata": {}, 917 | "source": [ 918 | "#### 任务6:把文本转换成tf-idf向量" 919 | ] 920 | }, 921 | { 922 | "cell_type": "code", 923 | "execution_count": 24, 924 | "metadata": {}, 925 | "outputs": [], 926 | "source": [ 927 | "comments_train_concat = x_train.apply(lambda x:' '.join(x))\n", 928 | "comments_test_concat = x_test.apply(lambda x:' '.join(x))" 929 | ] 930 | }, 931 | { 932 | "cell_type": "code", 933 | "execution_count": 27, 934 | "metadata": {}, 935 | "outputs": [ 936 | { 937 | "data": { 938 | "text/plain": [ 939 | "188015 [不停, 穿越, 不停, 转换, , 确实, 冲击, , 跟随, 剧情, , 完整, ...\n", 940 | "193033 [星半]\n", 941 | "163310 [ , 其实, , 没有, 纸醉金迷, ......, 林萧, 有点, 失望, .......]\n", 942 | "101549 [演员, 喜欢, 没, 演技, 撑, 不起, 一部, 电影]\n", 943 | "43776 [太, 难看]\n", 944 | "Name: comment_processed, dtype: object" 945 | ] 946 | }, 947 | "execution_count": 27, 948 | "metadata": {}, 949 | "output_type": "execute_result" 950 | } 951 | ], 952 | "source": [ 953 | "x_train.head()" 954 | ] 955 | }, 956 | { 957 | "cell_type": "code", 958 | "execution_count": 26, 959 | "metadata": { 960 | "scrolled": true 961 | }, 962 | "outputs": [ 963 | { 964 | "data": { 965 | "text/plain": [ 966 | "188015 不停 穿越 不停 转换 确实 冲击 跟随 剧情 完整 紧凑 没 说 恍惚 ~ ~\n", 967 | "193033 星半\n", 968 | "163310 其实 没有 纸醉金迷 ...... 林萧 有点 失望 .......\n", 969 | "101549 演员 喜欢 没 演技 撑 不起 一部 电影\n", 970 | "43776 太 难看\n", 971 | "Name: comment_processed, dtype: object" 972 | ] 973 | }, 974 | "execution_count": 26, 975 | "metadata": {}, 976 | "output_type": "execute_result" 977 | } 978 | ], 979 | "source": [ 980 | "comments_train_concat.head()" 981 | ] 982 | }, 983 | { 984 | "cell_type": "code", 985 | "execution_count": 28, 986 | "metadata": {}, 987 | "outputs": [ 988 | { 989 | "name": "stdout", 990 | "output_type": "stream", 991 | "text": [ 992 | "(170004, 14880) (42502, 14880)\n" 993 | ] 994 | } 995 | ], 996 | "source": [ 997 | "vectorizer = CountVectorizer() #便于稀疏矩阵存储更有效率\n", 998 | "trans = TfidfTransformer() #根据“词 词 词”生成句向量\n", 999 | "\n", 1000 | "word_count_train = vectorizer.fit_transform(comments_train_concat) #fit表示既训练又转化\n", 1001 | "tfidf_train = trans.fit_transform(word_count_train)\n", 1002 | "\n", 1003 | "word_count_test = vectorizer.transform(comments_test_concat) #fit表示既训练又转化\n", 1004 | "tfidf_test = trans.transform(word_count_test)\n", 1005 | "\n", 1006 | "print(tfidf_train.shape, tfidf_test.shape)" 1007 | ] 1008 | }, 1009 | { 1010 | "cell_type": "code", 1011 | "execution_count": 29, 1012 | "metadata": { 1013 | "scrolled": true 1014 | }, 1015 | "outputs": [ 1016 | { 1017 | "data": { 1018 | "text/plain": [ 1019 | "<170004x14880 sparse matrix of type ''\n", 1020 | "\twith 1468830 stored elements in Compressed Sparse Row format>" 1021 | ] 1022 | }, 1023 | "execution_count": 29, 1024 | "metadata": {}, 1025 | "output_type": "execute_result" 1026 | } 1027 | ], 1028 | "source": [ 1029 | "tfidf_train" 1030 | ] 1031 | }, 1032 | { 1033 | "cell_type": "markdown", 1034 | "metadata": {}, 1035 | "source": [ 1036 | "#### 任务7:把文本转换成word2vec向量" 1037 | ] 1038 | }, 1039 | { 1040 | "cell_type": "code", 1041 | "execution_count": 30, 1042 | "metadata": {}, 1043 | "outputs": [], 1044 | "source": [ 1045 | "# 使用KeyedVectors.load_word2vec_format()函数加载预训练好的词向量文件\n", 1046 | "model = KeyedVectors.load_word2vec_format('data/sgns.zhihu.word')" 1047 | ] 1048 | }, 1049 | { 1050 | "cell_type": "code", 1051 | "execution_count": 33, 1052 | "metadata": {}, 1053 | "outputs": [ 1054 | { 1055 | "data": { 1056 | "text/plain": [ 1057 | "300" 1058 | ] 1059 | }, 1060 | "execution_count": 33, 1061 | "metadata": {}, 1062 | "output_type": "execute_result" 1063 | } 1064 | ], 1065 | "source": [ 1066 | "model['今天'].shape[0]" 1067 | ] 1068 | }, 1069 | { 1070 | "cell_type": "code", 1071 | "execution_count": 49, 1072 | "metadata": {}, 1073 | "outputs": [ 1074 | { 1075 | "data": { 1076 | "text/plain": [ 1077 | "80" 1078 | ] 1079 | }, 1080 | "execution_count": 49, 1081 | "metadata": {}, 1082 | "output_type": "execute_result" 1083 | } 1084 | ], 1085 | "source": [ 1086 | "# 由于数据量大需要长时间训练,这里就用小样本试一下效果\n", 1087 | "x_train = x_train[:80]\n", 1088 | "x_test = x_test[:20]\n", 1089 | "y_train = y_train[:80]\n", 1090 | "y_test = y_test[:20]\n", 1091 | "len(x_train)" 1092 | ] 1093 | }, 1094 | { 1095 | "cell_type": "code", 1096 | "execution_count": 50, 1097 | "metadata": {}, 1098 | "outputs": [ 1099 | { 1100 | "name": "stderr", 1101 | "output_type": "stream", 1102 | "text": [ 1103 | "\n", 1104 | "apply: 0%| | 0/80 [00:00