├── Config ├── config ├── dict ├── stopwords_chs └── user_dict ├── Main.py ├── MongoDBIO.py ├── README.md ├── TextClassify.py ├── TextFeature.py └── TextProcess.py /Config/config: -------------------------------------------------------------------------------- 1 | # 对应语言 2 | #lag = "eng" 3 | lag = "chs" 4 | 5 | # 特征词典维度 6 | dict_size = 300 7 | 8 | # 训练集配置 9 | train_host = "localhost" 10 | train_port = 27017 11 | train_name = "" 12 | train_password = "" 13 | train_database = "textclassify" 14 | train_collection = "WallstreetcnSave" 15 | 16 | # 测试集配置 17 | test_host = "localhost" 18 | test_port = 27017 19 | test_name = "" 20 | test_password = "" 21 | test_database = "textclassify" 22 | test_collection = "WallstreetcnSave" 23 | limit_number = 100 24 | -------------------------------------------------------------------------------- /Config/stopwords_chs: -------------------------------------------------------------------------------- 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 | 冰毒 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 | 丝袜网 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 | 瓦斯手 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 | 新建户 881 | 新疆叛 882 | 新疆限 883 | 新金瓶 884 | 新唐人 885 | 信访专班 886 | 信接收器 887 | 兴中心幼 888 | 星上门 889 | 行长王益 890 | 形透视镜 891 | 型手枪 892 | 姓忽悠 893 | 幸运码 894 | 性爱日 895 | 性福情 896 | 性感少 897 | 性推广歌 898 | 胸主席 899 | 徐玉元 900 | 学骚乱 901 | 学位證 902 | 學生妹 903 | 丫与王益 904 | 烟感器 905 | 严晓玲 906 | 言被劳教 907 | 言论罪 908 | 盐酸曲 909 | 颜射 910 | 恙虫病 911 | 姚明进去 912 | 要人权 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 | 原装弹 961 | 袁腾飞 962 | 晕倒型 963 | 韵徐娘 964 | 遭便衣 965 | 遭到警 966 | 遭警察 967 | 遭武警 968 | 择油录 969 | 曾道人 970 | 炸弹教 971 | 炸弹遥控 972 | 炸广州 973 | 炸立交 974 | 炸药的制 975 | 炸药配 976 | 炸药制 977 | 张春桥 978 | 找枪手 979 | 找援交 980 | 找政法委副 981 | 赵紫阳 982 | 针刺案 983 | 针刺伤 984 | 针刺事 985 | 针刺死 986 | 侦探设备 987 | 真钱斗地 988 | 真钱投注 989 | 真善忍 990 | 真实文凭 991 | 真实资格 992 | 震惊一个民 993 | 震其国土 994 | 证到付款 995 | 证件办 996 | 证件集团 997 | 证生成器 998 | 证书办 999 | 证一次性 1000 | 政府操 1001 | 政论区 1002 | 證件 1003 | 植物冰 1004 | 殖器护 1005 | 指纹考勤 1006 | 指纹膜 1007 | 指纹套 1008 | 至国家高 1009 | 志不愿跟 1010 | 制服诱 1011 | 制手枪 1012 | 制证定金 1013 | 制作证件 1014 | 中的班禅 1015 | 中共黑 1016 | 中国不强 1017 | 种公务员 1018 | 种学历证 1019 | 众像羔 1020 | 州惨案 1021 | 州大批贪 1022 | 州三箭 1023 | 宙最高法 1024 | 昼将近 1025 | 主席忏 1026 | 住英国房 1027 | 助考 1028 | 助考网 1029 | 专业办理 1030 | 专业代 1031 | 专业代写 1032 | 专业助 1033 | 转是政府 1034 | 赚钱资料 1035 | 装弹甲 1036 | 装枪套 1037 | 装消音 1038 | 着护士的胸 1039 | 着涛哥 1040 | 姿不对死 1041 | 资格證 1042 | 资料泄 1043 | 梓健特药 1044 | 字牌汽 1045 | 自己找枪 1046 | 自慰用 1047 | 自由圣 1048 | 自由亚 1049 | 总会美女 1050 | 足球玩法 1051 | 最牛公安 1052 | 醉钢枪 1053 | 醉迷药 1054 | 醉乙醚 1055 | 尊爵粉 1056 | 左转是政 1057 | 作弊器 1058 | 作各种证 1059 | 作硝化甘 1060 | 唑仑 1061 | 做爱小 1062 | 做原子弹 1063 | 做证件 1064 | 发票 1065 | -------------------------------------------------------------------------------- /Config/user_dict: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/TextClassify2/e923d2ee0b530b0ef1ee91103ac8ec6cb1c9f70e/Config/user_dict -------------------------------------------------------------------------------- /Main.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | from __future__ import division 3 | __author__ = 'LiNing' 4 | 5 | import re 6 | from os.path import exists 7 | import simplejson as json 8 | 9 | from MongoDBIO import TrainDataSelect 10 | from MongoDBIO import TestDataSelect 11 | from MongoDBIO import ResultUpdate 12 | 13 | from TextProcess import TextSeg 14 | from TextProcess import TextExtractTags 15 | from TextProcess import MakeAllWordsList 16 | from TextProcess import MakeFeatureWordsDict 17 | from TextProcess import MakeStopWordsList 18 | 19 | from TextFeature import TextBool 20 | from TextFeature import ComputeTf 21 | 22 | from TextClassify import Gne_Train_Dimensions 23 | from TextClassify import TextClassifier 24 | from TextClassify import Vote 25 | 26 | import numpy as np 27 | 28 | 29 | if __name__ == '__main__': 30 | #------------------------------------------------------------------------------- 31 | try: 32 | with open("./Config/config", "r") as fp: 33 | lines = fp.readlines() # list 34 | except Exception as e: 35 | print e 36 | exit() 37 | for line in lines: 38 | # 检测语言 39 | if re.match(r'^lag', line): 40 | lag = str(re.search(r'"(.*?)"', line).group(1)) # 从任意位置只找出第一个成功的匹配 41 | # 特征词典维度 42 | elif re.match(r'^dict_size', line): 43 | dict_size = int(re.search(r'.*?\s*=\s*(\d+?)\s', line).group(1)) 44 | # 训练集配置 45 | elif re.match(r'^train_host', line): 46 | train_host = str(re.search(r'"(.*?)"', line).group(1)) 47 | elif re.match(r'^train_port', line): 48 | train_port = int(re.search(r'.*?\s*=\s*(\d+?)\s', line).group(1)) 49 | elif re.match(r'^train_name', line): 50 | train_name = str(re.search(r'"(.*?)"', line).group(1)) 51 | elif re.match(r'^train_password', line): 52 | train_password = str(re.search(r'"(.*?)"', line).group(1)) 53 | elif re.match(r'^train_database', line): 54 | train_database = str(re.search(r'"(.*?)"', line).group(1)) 55 | elif re.match(r'^train_collection', line): 56 | train_collection = str(re.search(r'"(.*?)"', line).group(1)) 57 | # 测试集配置 58 | elif re.match(r'^test_host', line): 59 | test_host = str(re.search(r'"(.*?)"', line).group(1)) 60 | elif re.match(r'^test_port', line): 61 | test_port = int(re.search(r'.*?\s*=\s*(\d+?)\s', line).group(1)) 62 | elif re.match(r'^test_name', line): 63 | test_name = str(re.search(r'"(.*?)"', line).group(1)) 64 | elif re.match(r'^test_password', line): 65 | test_password = str(re.search(r'"(.*?)"', line).group(1)) 66 | elif re.match(r'^test_database', line): 67 | test_database = str(re.search(r'"(.*?)"', line).group(1)) 68 | elif re.match(r'^test_collection', line): 69 | test_collection = str(re.search(r'"(.*?)"', line).group(1)) 70 | elif re.match(r'^limit_number', line): 71 | limit_number = int(re.search(r'.*?\s*=\s*(\d+?)\s', line).group(1)) 72 | 73 | 74 | #------------------------------------------------------------------------------- 75 | # 训练集数据提取与分词 76 | json_path = "./Config/traindata_"+lag # 训练数据库变化需删除重新生成 77 | if not exists(json_path): 78 | try: 79 | train_datas_targets = TrainDataSelect(train_host, train_port, train_name, train_password, train_database, train_collection) 80 | except Exception as e: 81 | print e 82 | exit() 83 | train_datasseg = TextSeg(train_datas_targets["datas"], lag) 84 | # 由训练集生成单词库all_words_list 85 | all_words_list = MakeAllWordsList(train_datasseg) 86 | train_datasseg_targets_wordlist = {"datas":train_datasseg, "targets":train_datas_targets["targets"], "wordlist":all_words_list} 87 | with open(json_path, 'wb') as train_file: 88 | json.dump(train_datasseg_targets_wordlist, train_file) 89 | else: 90 | with open(json_path, 'rb') as json_file: 91 | train_datasseg_targets_wordlist = json.load(json_file) 92 | 93 | train_datasseg = train_datasseg_targets_wordlist["datas"] # list list 94 | train_targets = train_datasseg_targets_wordlist["targets"] # dict list 95 | all_words_list = train_datasseg_targets_wordlist["wordlist"] # list 96 | 97 | 98 | #------------------------------------------------------------------------------- 99 | # 由训练集生成特征词word_features 100 | stopwords_file = "./Config/stopwords_"+lag 101 | stopwords_list = MakeStopWordsList(stopwords_file) 102 | words_feature = MakeFeatureWordsDict(all_words_list, stopwords_list, dict_size, lag) 103 | 104 | train_targets_names_dimensions, train_targets_dimensions = Gne_Train_Dimensions(train_targets) 105 | 106 | # 训练集特征提取和关键词提取 107 | fea_train = [] 108 | keywords_train = [] 109 | for train_dataseg in train_datasseg: 110 | # 特征提取 111 | train_bool_features = TextBool(words_feature, train_dataseg) 112 | fea_train.append(train_bool_features) 113 | # train_tf_features = ComputeTf(words_feature, train_dataseg) 114 | # fea_train.append(train_tf_features) 115 | 116 | # 关键词提取(利用词频tf) 117 | train_tags = TextExtractTags(words_feature, train_dataseg, 3) 118 | # print "The KeyWords:", 119 | # for i in range(len(train_tags)): 120 | # print train_tags[i], 121 | # print "" 122 | keywords_train.append(train_tags) 123 | fea_train = np.array(fea_train) 124 | 125 | 126 | #------------------------------------------------------------------------------- 127 | # 测试集数据提取与分词 128 | try: 129 | test_ids_datas = TestDataSelect(test_host, test_port, test_name, test_password, test_database, test_collection, limit_number) 130 | except Exception as e: 131 | print e 132 | exit() 133 | test_datasseg = TextSeg(test_ids_datas["datas"], lag) 134 | test_ids_datasseg = {"ids":test_ids_datas["ids"], "datas":test_datasseg} 135 | 136 | test_ids = test_ids_datasseg["ids"] 137 | test_datasseg = test_ids_datasseg["datas"] 138 | 139 | 140 | #------------------------------------------------------------------------------- 141 | # 测试集特征提取和关键词提取 142 | fea_test = [] 143 | keywords_test = [] 144 | for test_dataseg in test_datasseg: 145 | # 特征提取 146 | test_bool_features = TextBool(words_feature, test_dataseg) 147 | fea_test.append(test_bool_features) 148 | # test_tf_features = ComputeTf(words_feature, test_dataseg) 149 | # fea_test.append(test_tf_features) 150 | 151 | # 关键词提取 152 | test_tags = TextExtractTags(words_feature, test_dataseg, 3) 153 | # print "The KeyWords:", 154 | # for i in range(len(test_tags)): 155 | # print test_tags[i], 156 | # print "" 157 | keywords_test.append(test_tags) 158 | fea_test = np.array(fea_test) 159 | 160 | 161 | #------------------------------------------------------------------------------- 162 | # 分类器 163 | dimensions = train_targets[0].keys() 164 | all_pred_results = [] 165 | for i in range(len(dimensions)): 166 | train_targets_dimension = np.array(train_targets_dimensions[i]) 167 | results = TextClassifier(fea_train, fea_test, train_targets_dimension) 168 | results = np.array(results) 169 | resultsT = results.T 170 | # 投票法 171 | print 'Combination of All the Classifiers for Classify Dimension "', dimensions[i], '":' 172 | print "The Result of Combination:", 173 | pred_results = [] 174 | for resultT in resultsT: 175 | temp_num = Vote(list(resultT)) 176 | pred_result = train_targets_names_dimensions[i][temp_num] 177 | pred_results.append(pred_result) 178 | print pred_result, 179 | print "" 180 | all_pred_results.append(pred_results) 181 | 182 | # 处理多维度分类结果 183 | all_pred_results = np.array(all_pred_results) 184 | all_pred_resultsT = all_pred_results.T 185 | test_targets = [] 186 | for all_pred_resultT in all_pred_resultsT: 187 | test_target = {} 188 | for i in range(len(dimensions)): 189 | test_target[dimensions[i]] = list(all_pred_resultT)[i] 190 | test_targets.append(test_target) 191 | test_ids_targets = {"ids":test_ids, "targets":test_targets} 192 | 193 | #------------------------------------------------------------------------------- 194 | # 更新操作 195 | if test_host: 196 | ResultUpdate(test_host, test_port, test_name, test_password, test_database, test_collection, test_ids_targets) 197 | else: 198 | print "error" 199 | exit() 200 | -------------------------------------------------------------------------------- /MongoDBIO.py: -------------------------------------------------------------------------------- 1 | #coding: utf-8 2 | from __future__ import division 3 | __author__ = 'LiNing' 4 | 5 | import os 6 | import pymongo 7 | import datetime 8 | 9 | 10 | class MongoDBIO(object): 11 | # 申明相关的属性 12 | def __init__(self, host, port, name, password, database, collection): 13 | self.host = host 14 | self.port = port 15 | self.name = name 16 | self.password = password 17 | self.database = database 18 | self.collection = collection 19 | 20 | # 连接数据库,db和posts为数据库和集合的游标 21 | def Connection(self): 22 | ## -------------------------------------------------------------------------------- 23 | # # connection = pymongo.Connection() # 连接本地数据库 24 | # connection = pymongo.Connection(host=self.host, port=self.port) 25 | # db = connection[self.database] 26 | # if len(self.name)>0: 27 | # db.authenticate(name=self.name, password=self.password) # 验证用户名密码 28 | # else: 29 | # pass 30 | ## -------------------------------------------------------------------------------- 31 | # mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] 32 | if len(self.name)>0: 33 | uri = "mongodb://%s:%s@%s:%d/%s" % (self.name, self.password, self.host, self.port, self.database) 34 | else: 35 | uri = "mongodb://%s:%d/%s" % (self.host, self.port, self.database) 36 | # print uri 37 | client = pymongo.MongoClient(uri) 38 | db = client.get_default_database() 39 | ## -------------------------------------------------------------------------------- 40 | print "Database:", db.name 41 | print db.collection_names() # 查询所有集合 42 | posts = db[self.collection] 43 | print "Collection:", posts.name 44 | print "Count:", posts.count() 45 | 46 | return posts 47 | 48 | 49 | def TrainDataSelect(host, port, name, password, database, collection): 50 | posts = MongoDBIO(host, port, name, password, database, collection).Connection() 51 | print "Number of All Documents in the Collection:", posts.count() # 查询数量 52 | 53 | train_datas_targets = {"datas":[], "targets":[]} 54 | #------------------------------------------------------------------------------- 55 | # 以下几行根据实际情况修改 56 | starttime = datetime.datetime(2015, 1, 1) 57 | endtime = datetime.datetime.now() 58 | for post in posts.find({ 59 | "content":{"$exists":1}, 60 | "country":{"$exists":1}, 61 | "createdtime":{"$gte":starttime, "$lte":endtime}, 62 | "t_status":1 63 | }): 64 | # print post 65 | # if len(post["content"])>1 and len(post["country"])>1: 66 | if (post["content"] and post["country"]) is not None: 67 | train_datas_targets["datas"].append(post["content"]) 68 | Classify_Dimension = {u"国家":post["country"]} ## 支持多维分类 69 | train_datas_targets["targets"].append(Classify_Dimension) 70 | else: 71 | print '{"_id":ObjectId("%s")}' % post["_id"] 72 | #------------------------------------------------------------------------------- 73 | print "Number of Selected Train Documents in the Collection:", len(train_datas_targets["datas"]) # 选择数量 74 | return train_datas_targets 75 | 76 | 77 | def TestDataSelect(host, port, name, password, database, collection, limit_number): 78 | posts = MongoDBIO(host, port, name, password, database, collection).Connection() 79 | print "Number of all Documents in the Collection:", posts.count() # 查询数量 80 | 81 | test_ids_datas = {"ids":[], "datas":[]} 82 | #------------------------------------------------------------------------------- 83 | # 以下几行根据实际情况修改 84 | starttime = datetime.datetime(2015, 1, 1) 85 | endtime = datetime.datetime.now() 86 | for post in posts.find({ 87 | "content":{"$exists":1}, 88 | "country":{"$exists":0}, 89 | "createdtime":{"$gte":starttime, "$lte":endtime}, 90 | "t_status":{"$ne":1} 91 | }).sort("createdtime", pymongo.DESCENDING).limit(limit_number): 92 | # print post 93 | # if len(post["content"])>1: 94 | if post["content"] is not None: 95 | test_ids_datas["ids"].append(post["_id"]) 96 | test_ids_datas["datas"].append(post["content"]) 97 | else: 98 | print '{"_id":ObjectId("%s")}' % post["_id"] 99 | #------------------------------------------------------------------------------- 100 | print "Number of Selected Test Documents in the Collection:", len(test_ids_datas["datas"]) # 选择数量 101 | return test_ids_datas 102 | 103 | 104 | def ResultUpdate(test_host, test_port, test_name, test_password, test_database, test_collection, test_ids_targets): 105 | posts = MongoDBIO(test_host, test_port, test_name, test_password, test_database, test_collection).Connection() 106 | test_ids = test_ids_targets["ids"] 107 | test_targets = test_ids_targets["targets"] 108 | 109 | for i in range(len(test_ids)): 110 | id = test_ids[i] 111 | test_target = test_targets[i] 112 | #------------------------------------------------------------------------------- 113 | # 以下几行根据实际情况修改 114 | # posts.update({"_id":id}, {"$set":{"country_test":test_target[u"国家"], "t_status":1}}) ## 支持多维分类 115 | posts.update({"_id":id}, {"$set":{"country_test":test_target[u"国家"]}}) ## 支持多维分类 116 | #------------------------------------------------------------------------------- 117 | print '{"_id":ObjectId("%s")}' % id # MongoVUE中find命令 118 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 多算法的文本分类系统 2 | 3 | ### **更多详见[TextMining](https://github.com/lining0806/TextMining)** 4 | 5 | *** 6 | 7 | ## 关于分词 8 | **英文分词,采用nltk工具包进行分词** 9 | 10 | pip install nltk 11 | 12 | **中文分词,采用jieba工具包进行分词** 13 | 14 | pip install jieba 15 | 16 | **jieba分词** 17 | 18 | dict 主词典文件 19 | user_dict 用户词典文件,即分词白名单 20 | 21 | **user_dict为分词白名单** 22 | * 如果添加的过滤词(包括黑名单和白名单)无法正确被jieba正确分词,则将该需要添加的单词及词频加入到主词典dict文件中或者用户词典user_dict,一行一个(词频也可省略) 23 | -------------------------------------------------------------------------------- /TextClassify.py: -------------------------------------------------------------------------------- 1 | #coding: utf-8 2 | from __future__ import division 3 | __author__ = 'LiNing' 4 | import datetime 5 | 6 | 7 | def Gne_Train_Dimensions(train_targets): 8 | dimensions = train_targets[0].keys() 9 | train_targets_names_dimensions = [] # 每个维度下的分类名称 10 | train_targets_dimensions = [] # 每个维度下的分类情况 11 | for dimension in dimensions: 12 | temp = [train_target[dimension] for train_target in train_targets] 13 | temp_list = sorted(list(set(temp))) 14 | # 统计每个分类名称下的数目 15 | print 'The Classify Dimension "', dimension, '":' 16 | for train_targets_names in temp_list: 17 | print train_targets_names, "\t", temp.count(train_targets_names) 18 | temp_num = [temp_list.index(temp_i) for temp_i in temp] 19 | train_targets_names_dimensions.append(temp_list) 20 | train_targets_dimensions.append(temp_num) 21 | return train_targets_names_dimensions, train_targets_dimensions 22 | 23 | 24 | def TextClassifier(fea_train, fea_test, train_targets_dimensions): 25 | results = [] 26 | 27 | ###################################################### 28 | # # SVM 29 | # from sklearn.svm import SVC 30 | # svclf = SVC() 31 | # svclf.fit(fea_train, train_targets_dimensions) 32 | # pred = svclf.predict(fea_test) 33 | # # print "*************************\nSVM\n*************************" 34 | # results.append(list(pred)) 35 | ###################################################### 36 | # # Linear SVM 37 | # from sklearn.svm import LinearSVC 38 | # lsvclf = LinearSVC() 39 | # lsvclf.fit(fea_train, train_targets_dimensions) 40 | # pred = lsvclf.predict(fea_test) 41 | # # print "*************************\nLinear SVM\n*************************" 42 | # results.append(list(pred)) 43 | ###################################################### 44 | # Naive Bayes 45 | from sklearn.naive_bayes import MultinomialNB 46 | nbcclf = MultinomialNB() 47 | nbcclf.fit(fea_train, train_targets_dimensions) 48 | pred = nbcclf.predict(fea_test) 49 | # print "*************************\nNaive Bayes\n*************************" 50 | results.append(list(pred)) 51 | ###################################################### 52 | # # Logistic Regression 53 | # from sklearn.linear_model import LogisticRegression 54 | # lrclf = LogisticRegression() 55 | # lrclf.fit(fea_train, train_targets_dimensions) 56 | # pred = lrclf.predict(fea_test) 57 | # # print "*************************\nLogistic Regression\n*************************" 58 | # results.append(list(pred)) 59 | ###################################################### 60 | # # K-Nearest Neighbors 61 | # from sklearn.neighbors import KNeighborsClassifier 62 | # knnclf = KNeighborsClassifier() # default with n_neighbors = 5 63 | # knnclf.fit(fea_train, train_targets_dimensions) 64 | # pred = knnclf.predict(fea_test) 65 | # # print "*************************\nK-Nearest Neighbors\n*************************" 66 | # results.append(list(pred)) 67 | ###################################################### 68 | # # Decision Tree 69 | # from sklearn.tree import DecisionTreeClassifier 70 | # dtclf = DecisionTreeClassifier() 71 | # dtclf.fit(fea_train, train_targets_dimensions) 72 | # pred = dtclf.predict(fea_test) 73 | # # print "*************************\nDecision Tree\n*************************" 74 | # results.append(list(pred)) 75 | ###################################################### 76 | 77 | # ###################################################### 78 | # # SVM Classifier 79 | # from sklearn.svm import SVC 80 | # from sklearn.svm import LinearSVC 81 | # from sklearn import preprocessing 82 | # from sklearn.decomposition import PCA 83 | # from sklearn.pipeline import Pipeline 84 | # from sklearn.grid_search import GridSearchCV 85 | # from sklearn.cross_validation import StratifiedKFold 86 | # from sklearn.cross_validation import KFold 87 | # fea_train = preprocessing.MinMaxScaler().fit_transform(fea_train) 88 | # parameters = { 89 | # 'pca__n_components':[50, 100, 150, 200, 250, 300], 90 | # 'svm__kernel':['rbf', 'linear'], 91 | # 'svm__gamma':[1e-2, 1e-1], 92 | # 'svm__C':[1e-2, 1e-1, 1, 5, 10] 93 | # } 94 | # pipeline = Pipeline( 95 | # steps = [ 96 | # ('pca', PCA()), 97 | # ('svm', SVC()) 98 | # ] 99 | # ) 100 | # clf = GridSearchCV( 101 | # estimator = pipeline, 102 | # param_grid = parameters, 103 | # cv = StratifiedKFold(train_targets_dimensions, 3), 104 | # scoring = "accuracy", 105 | # n_jobs = 3 106 | # ) 107 | # clf.fit(fea_train, train_targets_dimensions) 108 | # pred = clf.predict(fea_test) 109 | # # print "*************************\nSVM\n*************************" 110 | # results.append(list(pred)) 111 | # ###################################################### 112 | 113 | return results 114 | 115 | 116 | def Vote(votelist): 117 | elements_dict = {} 118 | for element in votelist: 119 | if elements_dict.has_key(element): 120 | elements_dict[element] += 1 121 | else: 122 | elements_dict[element] = 1 123 | # key函数利用词频进行降序排序 124 | elements_sortlist = sorted(elements_dict.items(), key=lambda f:f[1], reverse=True) # 内建函数sorted参数需为list 125 | return elements_sortlist[0][0] 126 | -------------------------------------------------------------------------------- /TextFeature.py: -------------------------------------------------------------------------------- 1 | #coding: utf-8 2 | from __future__ import division 3 | __author__ = 'LiNing' 4 | 5 | 6 | def TextBool(words_feature, text): 7 | bool_features = [] 8 | words = sorted(list(set(text))) 9 | for word_feature in words_feature: # 根据words_feature生成每个text的feature 10 | if word_feature in words: 11 | bool_features.append(1) 12 | else: 13 | bool_features.append(0) 14 | return bool_features 15 | 16 | 17 | def ComputeTf(words_feature, text): # 每个text的tf 18 | tf_features = [] 19 | for word_feature in words_feature: 20 | word_count = text.count(word_feature) 21 | length = len(text) 22 | tf = word_count/length 23 | tf_features.append(tf) 24 | return tf_features 25 | -------------------------------------------------------------------------------- /TextProcess.py: -------------------------------------------------------------------------------- 1 | #coding: utf-8 2 | from __future__ import division 3 | __author__ = 'LiNing' 4 | 5 | import os 6 | import re 7 | import nltk 8 | import jieba 9 | import jieba.analyse 10 | # dict_path = "./Config/dict" 11 | # if os.path.exists(dict_path): 12 | # jieba.set_dictionary(dict_path) # 主词典 13 | userdict_path = "./Config/user_dict" 14 | if os.path.exists(userdict_path): 15 | jieba.load_userdict(userdict_path) # 用户词典 16 | 17 | 18 | def TextSeg(datas, lag): 19 | datasseg = [] 20 | for data in datas: 21 | if lag == "eng": # 英文情况 22 | word_list = nltk.word_tokenize(data) 23 | elif lag == "chs": # 中文情况 24 | #------------------------------------------------------------------------------- 25 | # jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数,不支持windows 26 | word_cut = jieba.cut(data, cut_all=False) # 精确模式,返回的结构是一个可迭代的genertor 27 | word_list = list(word_cut) # genertor转化为list,每个词unicode格式 28 | # jieba.disable_parallel() # 关闭并行分词模式 29 | #------------------------------------------------------------------------------- 30 | # # jieba关键词提取 31 | # tags = jieba.analyse.extract_tags(data, topK=10) 32 | # # tags = jieba.analyse.textrank(data, topK=10) 33 | # print tags 34 | #------------------------------------------------------------------------------- 35 | else: 36 | word_list = [] 37 | # print " ".join(word_list) 38 | datasseg.append(word_list) 39 | return datasseg 40 | 41 | 42 | def TextExtractTags(words_feature, text, topK=10): # 每个text对应tags 43 | #------------------------------------------------------------------------------- 44 | tf_results = {} 45 | for word in text: 46 | if tf_results.has_key(word): 47 | tf_results[word] += 1 48 | else: 49 | if word in words_feature: 50 | tf_results[word] = 1 51 | length = len(text) 52 | for key in tf_results: 53 | tf_results[key] /= length 54 | #------------------------------------------------------------------------------- 55 | # tf_results = {} 56 | # for word_feature in words_feature: 57 | # word_count = text.count(word_feature) 58 | # length = len(text) 59 | # tf = word_count/length 60 | # tf_results[word_feature] = tf 61 | #------------------------------------------------------------------------------- 62 | # key函数利用词频进行降序排序 63 | tf_list = sorted(tf_results.items(), key=lambda f:f[1], reverse=True) # 内建函数sorted参数需为list 64 | tags = [] 65 | top_tf_list = tf_list[:topK] 66 | for tag, tf in top_tf_list: 67 | tags.append(tag) 68 | #------------------------------------------------------------------------------- 69 | return tags 70 | 71 | 72 | def MakeAllWordsList(train_datasseg): 73 | # 统计词频 74 | all_words = {} 75 | for train_dataseg in train_datasseg: 76 | for word in train_dataseg: 77 | if all_words.has_key(word): 78 | all_words[word] += 1 79 | else: 80 | all_words[word] = 1 81 | # 所有出现过的词数目 82 | # print "all_words length in all the train datas: ", len(all_words.keys()) 83 | # key函数利用词频进行降序排序 84 | all_words_reverse = sorted(all_words.items(), key=lambda f:f[1], reverse=True) # 内建函数sorted参数需为list 85 | # for all_word_reverse in all_words_reverse: 86 | # print all_word_reverse[0], "\t", all_word_reverse[1] 87 | all_words_list = [all_word_reverse[0] for all_word_reverse in all_words_reverse if len(all_word_reverse[0])>1] 88 | return all_words_list 89 | 90 | 91 | def MakeStopWordsList(stopwords_file): 92 | fp = open(stopwords_file, 'r') # stopwords_file最后有一个空行,可以添加或删除单词 93 | stopwords = [] 94 | for line in fp.readlines(): 95 | stopword = line.strip().decode("utf-8") # 由utf-8编码转换为unicode编码 96 | if len(stopword)>0: 97 | stopwords.append(stopword) 98 | fp.close() 99 | # 去重 100 | stopwords_list = sorted(list(set(stopwords))) 101 | return stopwords_list 102 | 103 | 104 | def MakeFeatureWordsDict(all_words_list, stopwords_list, dict_size, lag): # 特征词words_feature是选用的word-词典 105 | dict = open("./Config/fea_dict_"+lag, 'w') 106 | n = 0 107 | words_feature = [] 108 | if lag == "eng": # 英文情况 109 | wordlen_min, wordlen_max = 2, 15 110 | elif lag == "chs": # 中文情况 111 | wordlen_min, wordlen_max = 1, 5 112 | else: 113 | wordlen_min, wordlen_max = 1, 15 114 | for all_words in all_words_list: 115 | if n == dict_size: 116 | break 117 | # if not all_words.isdigit() and not all_words == "\r\n": # 不是数字 118 | # if not all_words.isdigit() and not all_words == "\r\n" and not all_words in stopwords_list: # 不是数字 119 | # if re.match(ur'^[a-z A-Z -]+$', all_words) and not all_words == "\r\n": # 英文 120 | # if re.match(ur'^[a-z A-Z -]+$', all_words) and not all_words == "\r\n" and not all_words in stopwords_list: # 英文 121 | # if re.match(ur'^[\u4e00-\u9fa5]+$', all_words) and not all_words == "\r\n": # 中文 122 | # if re.match(ur'^[\u4e00-\u9fa5]+$', all_words) and not all_words == "\r\n" and not all_words in stopwords_list: # 中文 123 | if re.match(ur'^[\u4e00-\u9fa5]+$|^[\u4e00-\u9fa5]+$', all_words) and not all_words == "\r\n" and not all_words in stopwords_list: # 中英文 124 | if wordlen_min