├── CNN_中文二分类 ├── .gitignore ├── data │ ├── 交通214.txt │ └── 计算机202.txt ├── data_helpers.py ├── eval.py ├── fenci │ ├── jiaotong214.txt │ ├── jisuanji200.txt │ ├── stop_words.txt │ ├── 交通214.txt │ └── 计算机202.txt ├── fenci_jieba.py ├── jiaocheng │ └── fenci.py ├── jieba_test.py ├── sklearn_NB.py ├── text_cnn.py ├── train.py ├── word2vec_test.py └── 说明.txt ├── README.md └── 基于Text-CNN的中文文本二分类实例.md /CNN_中文二分类/.gitignore: -------------------------------------------------------------------------------- 1 | *.npy 2 | runs/ 3 | 4 | # Created by https://www.gitignore.io/api/python,ipythonnotebook 5 | 6 | ### Python ### 7 | # Byte-compiled / optimized / DLL files 8 | __pycache__/ 9 | *.py[cod] 10 | *$py.class 11 | 12 | # C extensions 13 | *.so 14 | 15 | # Distribution / packaging 16 | .Python 17 | env/ 18 | build/ 19 | develop-eggs/ 20 | dist/ 21 | downloads/ 22 | eggs/ 23 | .eggs/ 24 | lib/ 25 | lib64/ 26 | parts/ 27 | sdist/ 28 | var/ 29 | *.egg-info/ 30 | .installed.cfg 31 | *.egg 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *,cover 52 | 53 | # Translations 54 | *.mo 55 | *.pot 56 | 57 | # Django stuff: 58 | *.log 59 | 60 | # Sphinx documentation 61 | docs/_build/ 62 | 63 | # PyBuilder 64 | target/ 65 | 66 | 67 | ### IPythonNotebook ### 68 | # Temporary data 69 | .ipynb_checkpoints/ 70 | -------------------------------------------------------------------------------- /CNN_中文二分类/data/交通214.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-hacker/CNN_ChineseTextBinaryClassify/03eeb2b18b60a03a7b3b4d43a92100df7fc69a2e/CNN_中文二分类/data/交通214.txt -------------------------------------------------------------------------------- /CNN_中文二分类/data_helpers.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import numpy as np 3 | import re 4 | import itertools 5 | from collections import Counter 6 | import sys 7 | reload(sys) 8 | sys.setdefaultencoding("utf-8") 9 | 10 | # 剔除英文的符号 11 | def clean_str(string): 12 | 13 | string = re.sub(r"[^A-Za-z0-9(),!?\'\`]", " ", string) 14 | string = re.sub(r"\'s", " \'s", string) 15 | string = re.sub(r"\'ve", " \'ve", string) 16 | string = re.sub(r"n\'t", " n\'t", string) 17 | string = re.sub(r"\'re", " \'re", string) 18 | string = re.sub(r"\'d", " \'d", string) 19 | string = re.sub(r"\'ll", " \'ll", string) 20 | string = re.sub(r",", " , ", string) 21 | string = re.sub(r"!", " ! ", string) 22 | string = re.sub(r"\(", " \( ", string) 23 | string = re.sub(r"\)", " \) ", string) 24 | string = re.sub(r"\?", " \? ", string) 25 | string = re.sub(r"\s{2,}", " ", string) 26 | return string.strip().lower() 27 | 28 | 29 | def load_data_and_labels(jisuanji_data_file, jiaotong_data_file): 30 | """ 31 | 加载二分类训练数据,为数据打上标签 32 | (X,[0,0]) 33 | X = 【 日 期 】19960104 【 版 号 】1 【 标 题 】合巢芜高速公路巢芜段竣工 【 作 者 】彭建中 【 正 文 】 安徽合(肥)巢(湖)芜(湖)高速公路巢芜段日前竣工通车并投入营运。合巢芜 高速公路是国家规划的京福综合运输网的重要干线路段,是交通部确定1995年建成 的全国10条重点公路之一。该条高速公路正线长88公里。(彭建中) 34 | Y = 交通 35 | 36 | 0:交通---> [1,0] 37 | 38 | 1:计算机--->[0,1] 39 | 40 | (X,Y) 41 | 42 | """ 43 | 44 | jisuanji_examples = list(open(jisuanji_data_file, "r").readlines()) 45 | jisuanji_examples = [s.strip() for s in jisuanji_examples] 46 | jiaotong_exampless = list(open(jiaotong_data_file, "r").readlines()) 47 | jiaotong_exampless = [s.strip() for s in jiaotong_exampless] 48 | x_text = jisuanji_examples + jiaotong_exampless 49 | 50 | # 适用于英文 51 | # x_text = [clean_str(sent) for sent in x_text] 52 | 53 | x_text = [sent for sent in x_text] 54 | # 定义类别标签 ,格式为one-hot的形式: y=1--->[0,1] 55 | positive_labels = [[0, 1] for _ in jisuanji_examples] 56 | # print positive_labels[1:3] 57 | negative_labels = [[1, 0] for _ in jiaotong_exampless] 58 | y = np.concatenate([positive_labels, negative_labels], 0) 59 | """ 60 | print y 61 | [[0 1] 62 | [0 1] 63 | [0 1] 64 | ..., 65 | [1 0] 66 | [1 0] 67 | [1 0]] 68 | print y.shape 69 | (10662, 2) 70 | """ 71 | return [x_text, y] 72 | 73 | 74 | def batch_iter(data, batch_size, num_epochs, shuffle=True): 75 | """ 76 | 利用迭代器从训练数据的回去某一个batch的数据 77 | """ 78 | data = np.array(data) 79 | data_size = len(data) 80 | num_batches_per_epoch = int((len(data)-1)/batch_size) + 1 81 | for epoch in range(num_epochs): 82 | # 每回合打乱顺序 83 | if shuffle: 84 | # 随机产生以一个乱序数组,作为数据集数组的下标 85 | shuffle_indices = np.random.permutation(np.arange(data_size)) 86 | shuffled_data = data[shuffle_indices] 87 | else: 88 | shuffled_data = data 89 | # 划分批次 90 | for batch_num in range(num_batches_per_epoch): 91 | start_index = batch_num * batch_size 92 | end_index = min((batch_num + 1) * batch_size, data_size) 93 | yield shuffled_data[start_index:end_index] 94 | 95 | 96 | # 测试代码用的 97 | if __name__ == '__main__': 98 | jisuanji_data_file = './fenci/jisuanji200.txt' 99 | jiaotong_data_file = './fenci/jiaotong214.txt' 100 | load_data_and_labels(jisuanji_data_file, jiaotong_data_file) 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /CNN_中文二分类/eval.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | #! /usr/bin/env python 3 | 4 | import tensorflow as tf 5 | import numpy as np 6 | import os 7 | import time 8 | import datetime 9 | import data_helpers 10 | from text_cnn import TextCNN 11 | from tensorflow.contrib import learn 12 | import csv 13 | import sys 14 | reload(sys) 15 | sys.setdefaultencoding("utf-8") 16 | 17 | # ============ 18 | # 命令行执行:python eval.py --eval_train --checkpoint_dir="./runs/1527400164/checkpoints/" 19 | #预测结果在runs/1527396368/prediction.csv中。 20 | # ============ 21 | 22 | #参数:我们这里使用命令行传入参数的方式执行该脚本 23 | 24 | tf.flags.DEFINE_string("positive_data_file", "./fenci/jisuanji200.txt", "Data source for the positive data.") 25 | tf.flags.DEFINE_string("negative_data_file", "./fenci/jiaotong214.txt", "Data source for the positive data.") 26 | 27 | # Eval Parameters 28 | tf.flags.DEFINE_integer("batch_size", 64, "Batch Size (default: 64)") 29 | # 填写训练获得模型的存储位置 30 | tf.flags.DEFINE_string("checkpoint_dir", "./runs/1527400164/checkpoints/", "Checkpoint directory from training run") 31 | tf.flags.DEFINE_boolean("eval_train", False, "Evaluate on all training data") 32 | 33 | # Misc Parameters 34 | tf.flags.DEFINE_boolean("allow_soft_placement", True, "Allow device soft device placement") 35 | tf.flags.DEFINE_boolean("log_device_placement", False, "Log placement of ops on devices") 36 | 37 | 38 | FLAGS = tf.flags.FLAGS 39 | 40 | # CHANGE THIS: Load data. Load your own data here 41 | if FLAGS.eval_train: 42 | x_raw, y_test = data_helpers.load_data_and_labels(FLAGS.positive_data_file, FLAGS.negative_data_file) 43 | y_test = np.argmax(y_test, axis=1) 44 | else: 45 | # x_raw = ["a masterpiece four years in the making", "everything is off."] 46 | # y_test = [1, 0] 47 | x1=''' 48 | 三个 三个臭皮匠 臭皮 臭皮匠 皮匠 顶 个 诸葛 诸葛亮 以此 以此类推 此类 类推 如果 能 把 一个 个人 跟 另外 100 万 人 的 大脑 连接 连接起来 接起 起来 就 会 诞生 超级 大脑 49 | 正因如此 如此 现在 才 出现 了 好几 好几家 几家 公司 争相 开发 脑 机界面 界面 希望 把 人 的 思维 与 机器 连接 连接起来 接起 起来 如果 能够 率先 将 笔记 笔记本 笔记本电脑 电脑 的 功能 植入 你 的 大脑 就 将 为 人们 开辟 一条 道路 使 之 得以 随意 通过 无缝 渠道 与 任何 任何人 何人 甚至 任何 东西 交换 信息 50 | 目前 有 两位 IT 行业 的 大佬 都 在 参与 这场 角逐 他们 分别 是 特斯 特斯拉 斯拉 创始 创始人 埃 隆 马斯克 Elon Musk 和 Facebook 创始 创始人 人马 马克 扎克 伯格 Mark Zuckerberg 他们 两 人 的 项目 分别 别名 名为 Neuralink 和 Building 8 而 据 知情 知情人 情人 人士 透露 这 两个 项目 都 需要 对 大脑 进行 外科 外科手术 手术 51 | 然而 还有 一些 没有 那么 野心 野心勃勃 勃勃 勃勃的 微创 方式 也 可以 解决 脑 机界面 界面 问题 只 需要 把 脑电波 电波 的 数据 转化 转化成 化成 简单 的 指令 然后 由 应用 或 设备 进行 处理 即可 一家 名为 Nuro 的 创业 公司 就 采取 了 这种 方式 他们 希望 借助 自己 的 软件 软件平台 平台 让 那些 因为 严重 受伤 或 疾病 而 丧失 交流 能力 的 人 恢复 这种 能力 52 | ''' 53 | x_raw = [x1] 54 | y_test = [1] 55 | 56 | # Map data into vocabulary 57 | vocab_path = os.path.join(FLAGS.checkpoint_dir, "..", "vocab") 58 | vocab_processor = learn.preprocessing.VocabularyProcessor.restore(vocab_path) 59 | x_test = np.array(list(vocab_processor.transform(x_raw))) 60 | 61 | print("\nEvaluating...\n") 62 | 63 | # Evaluation 64 | # ================================================== 65 | checkpoint_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir) 66 | print "checkpoint_file========",checkpoint_file 67 | graph = tf.Graph() 68 | with graph.as_default(): 69 | session_conf = tf.ConfigProto( 70 | allow_soft_placement=FLAGS.allow_soft_placement, 71 | log_device_placement=FLAGS.log_device_placement) 72 | sess = tf.Session(config=session_conf) 73 | with sess.as_default(): 74 | # Load the saved meta graph and restore variables 75 | saver = tf.train.import_meta_graph("{}.meta".format(checkpoint_file)) 76 | 77 | saver.restore(sess, checkpoint_file) 78 | 79 | # Get the placeholders from the graph by name 80 | input_x = graph.get_operation_by_name("input_x").outputs[0] 81 | # input_y = graph.get_operation_by_name("input_y").outputs[0] 82 | dropout_keep_prob = graph.get_operation_by_name("dropout_keep_prob").outputs[0] 83 | 84 | # Tensors we want to evaluate 85 | predictions = graph.get_operation_by_name("output/predictions").outputs[0] 86 | 87 | # Generate batches for one epoch 88 | batches = data_helpers.batch_iter(list(x_test), FLAGS.batch_size, 1, shuffle=False) 89 | 90 | # 存储模型预测结果 91 | all_predictions = [] 92 | for x_test_batch in batches: 93 | batch_predictions = sess.run(predictions, {input_x: x_test_batch, dropout_keep_prob: 1.0}) 94 | all_predictions = np.concatenate([all_predictions, batch_predictions]) 95 | 96 | # Print accuracy if y_test is defined 97 | if y_test is not None: 98 | correct_predictions = float(sum(all_predictions == y_test)) 99 | print("Total number of test examples: {}".format(len(y_test))) 100 | print("Accuracy: {:g}".format(correct_predictions/float(len(y_test)))) 101 | 102 | # [0,1] 103 | # [1,0] 104 | 105 | # 将二分类的0,1标签转化为中文标签 106 | y=[] 107 | for i in all_predictions: 108 | if i==0.0: 109 | y.append("[交通]") 110 | else: 111 | y.append("[计算机]") 112 | # 把预测的结果保存到本地 113 | predictions_human_readable = np.column_stack((y,np.array(x_raw))) 114 | out_path = os.path.join(FLAGS.checkpoint_dir, "..", "prediction.csv") 115 | print("Saving evaluation to {0}".format(out_path)) 116 | with open(out_path, 'w') as f: 117 | csv.writer(f).writerows(predictions_human_readable) 118 | 119 | -------------------------------------------------------------------------------- /CNN_中文二分类/fenci/stop_words.txt: -------------------------------------------------------------------------------- 1 | 摘要 2 | 3 | , 4 | ? 5 | c 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 | A 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 | 0 571 | 1 572 | 2 573 | 3 574 | 4 575 | 5 576 | 6 577 | 7 578 | 8 579 | 9 580 | 0 581 | 1 582 | 2 583 | 3 584 | 4 585 | 5 586 | 6 587 | 7 588 | 8 589 | 9 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 | 快要 1066 | 来不及 1067 | 来得及 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 | 略加 1107 | 略微 1108 | 略为 1109 | 论说 1110 | 马上 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 | 恰如 1166 | 恰似 1167 | 千 1168 | 千万 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 | 上来 1221 | 上去 -------------------------------------------------------------------------------- /CNN_中文二分类/fenci_jieba.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | import jieba 3 | import sys 4 | import time 5 | sys.path.append("../../") 6 | import codecs 7 | import os 8 | import re 9 | import sys 10 | reload(sys) 11 | sys.setdefaultencoding("utf-8") 12 | 13 | def FenCi(readfile,outfile): 14 | line = readfile.readline() 15 | while line: 16 | # 更高效的字符串替换 17 | lines=filter(lambda ch:ch not in '0123456789 ',line) 18 | newline =jieba.cut(lines,cut_all=False) 19 | str_out=' '.join(newline).encode('utf-8').replace(',',' ').replace('。',' ').replace('?',' ').replace('!',' ')\ 20 | .replace('(',' ').replace(')',' ')\ 21 | .replace('=',' ').replace('-',' ')\ 22 | .replace('+',' ').replace(';',' ')\ 23 | .replace(')',' ').replace(')',' ')\ 24 | .replace('◣',' ').replace('◢',' ')\ 25 | .replace('@',' ').replace('|',' ')\ 26 | .replace('~',' ').replace(']',' ')\ 27 | .replace('●',' ').replace('★',' ')\ 28 | .replace('/',' ').replace('■',' ')\ 29 | .replace('╪',' ').replace('☆',' ')\ 30 | .replace('└',' ').replace('┘',' ')\ 31 | .replace('─',' ').replace('┬',' ')\ 32 | .replace(':',' ').replace('‘',' ')\ 33 | .replace(':',' ').replace('-',' ')\ 34 | .replace('、',' ').replace('.',' ')\ 35 | .replace('...',' ').replace('?',' ')\ 36 | .replace('“',' ').replace('”',' ')\ 37 | .replace('《',' ').replace('》',' ')\ 38 | .replace('!',' ').replace(',',' ')\ 39 | .replace('】',' ').replace('【',' ')\ 40 | .replace('·',' ') 41 | print str_out, 42 | print >>outfile,str_out, 43 | line=readfile.readline() 44 | 45 | 46 | 47 | 48 | if __name__ == '__main__': 49 | fromdir="./data" 50 | todir="./fenci/" 51 | # 一次只能对一个文档进行分词 52 | file = "计算机202.txt" 53 | # file = "交通214.txt" 54 | outfile = open(os.path.join(todir,file),'w+') 55 | infile = open(os.path.join(fromdir,file),'r') 56 | FenCi(infile, outfile) 57 | infile.close() 58 | outfile.close() 59 | 60 | -------------------------------------------------------------------------------- /CNN_中文二分类/jiaocheng/fenci.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import multiprocessing 3 | tmp_catalog = '/data/' 4 | # file_list = [tmp_catalog+'交通214.txt', tmp_catalog+'cnews.test.txt'] 5 | file_list = [tmp_catalog+'交通214.txt'] 6 | write_list = [tmp_catalog+'交通214_cut.txt'] 7 | 8 | def tokenFile(file_path, write_path): 9 | word_divider = WordCut() 10 | with open(write_path, 'w') as w: 11 | with open(file_path, 'r') as f: 12 | for line in f.readlines(): 13 | line = line.decode('utf-8').strip() 14 | token_sen = word_divider.seg_sentence(line.split('\t')[1]) 15 | w.write(line.split('\t')[0].encode('utf-8') + '\t' + token_sen.encode('utf-8') + '\n') 16 | print file_path + ' has been token and token_file_name is ' + write_path 17 | 18 | pool = multiprocessing.Pool(processes=4) 19 | for file_path, write_path in zip(file_list, write_list): 20 | pool.apply_async(tokenFile, (file_path, write_path, )) 21 | print file_path 22 | pool.close() 23 | pool.join() # 调用join()之前必须先调用close() 24 | print "Sub-process(es) done." -------------------------------------------------------------------------------- /CNN_中文二分类/jieba_test.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import numpy as py 3 | y_test = [1,0,0,0,1] 4 | y=[] 5 | for i in y_test: 6 | if i==0: 7 | y.append("交通") 8 | else: 9 | y.append("计算机") 10 | 11 | print y[0],y[1],y[2] 12 | 13 | 14 | import jieba 15 | """ 16 | jieba的中文github地址:https://github.com/fxsjy/jieba 17 | """ 18 | x1=''' 19 | 20 | 三个臭皮匠顶个诸葛亮,以此类推,如果能把一个人跟另外100万人的大脑连接起来,就会诞生“超级大脑”。正因如此,现在才出现了好几家公司争相开发脑机界面,希望把人的思维与机器连接起来。如果能够率先将笔记本电脑的功能植入你的大脑,就将为人们开辟一条道路,使之得以随意通过无缝渠道与任何人(甚至任何东西)交换信息。目前有两位IT行业的大佬都在参与这场角逐,他们分别是特斯拉创始人埃隆·马斯克(Elon Musk)和Facebook创始人马克·扎克伯格(Mark Zuckerberg)。他们两人的项目分别名为Neuralink和Building 8。而据知情人士透露,这两个项目都需要对大脑进行外科手术。然而,还有一些没有那么野心勃勃的微创方式,也可以解决脑机界面问题。只需要把脑电波的数据转化成简单的指令,然后由应用或设备进行处理即可。一家名为Nuro的创业公司就采取了这种方式。他们希望借助自己的软件平台,让那些因为严重受伤或疾病而丧失交流能力的人恢复这种能力。 21 | ''' 22 | x2="本期企鹅评测团产品——华为MateBook X Pro笔记本电脑。作者是一名普通公务员,同时又是一名数码发烧友,多年来一直沉迷于各种新潮的数码产品,工作以后也不忘通过数码产品提升工作效率。随着笔记本电脑市场竞争的日益激烈,再加上硬件性能不断提升,越来越多的非游戏用户选择使用更加方便携带的超极本,各大厂商自然也是迎合用户需求,推出外观更加靓丽、身材更加小巧、功能更加丰富的超极本。" 23 | seg_list = jieba.cut(x2.strip(), cut_all=True) 24 | # seg_list这是一个可循环的对象 25 | print("Full Mode: " + " ".join(seg_list)) # 全模式 26 | 27 | seg_list = jieba.cut("我来到北京清华大学,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作", cut_all = False) 28 | print("Precise Mode: " + " ".join(seg_list)) #精确模式,默认状态下也是精确模式 29 | 30 | seg_list=jieba.cut_for_search("我来到北京清华大学,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作") 31 | print "搜索模式:"," ".join(seg_list) 32 | 33 | mcase = {'a': 10, 'b': 34} 34 | mcase_frequency = {v: k for k, v in mcase.items()} 35 | print mcase_frequency -------------------------------------------------------------------------------- /CNN_中文二分类/sklearn_NB.py: -------------------------------------------------------------------------------- 1 | #引入包 2 | import random 3 | import jieba 4 | import pandas as pd 5 | #指定文件目录 6 | dir = "fenci" 7 | #指定语料 8 | stop_words = "".join([dir,'stopwords.txt']) 9 | laogong = "".join([dir,'beilaogongda.csv']) #被老公打 10 | laopo = "".join([dir,'beilaopoda.csv']) #被老婆打 11 | erzi = "".join([dir,'beierzida.csv']) #被儿子打 12 | nver = "".join([dir,'beinverda.csv']) #被女儿打 13 | #加载停用词 14 | stopwords=pd.read_csv(stop_words,index_col=False,quoting=3,sep="\t",names=['stopword'], encoding='utf-8') 15 | stopwords=stopwords['stopword'].values 16 | #加载语料 17 | laogong_df = pd.read_csv(laogong, encoding='utf-8', sep=',') 18 | laopo_df = pd.read_csv(laopo, encoding='utf-8', sep=',') 19 | erzi_df = pd.read_csv(erzi, encoding='utf-8', sep=',') 20 | nver_df = pd.read_csv(nver, encoding='utf-8', sep=',') 21 | #删除语料的nan行 22 | laogong_df.dropna(inplace=True) 23 | laopo_df.dropna(inplace=True) 24 | erzi_df.dropna(inplace=True) 25 | nver_df.dropna(inplace=True) 26 | #转换 27 | laogong = laogong_df.segment.values.tolist() 28 | laopo = laopo_df.segment.values.tolist() 29 | erzi = erzi_df.segment.values.tolist() 30 | nver = nver_df.segment.values.tolist() 31 | #定义分词和打标签函数preprocess_text 32 | #参数content_lines即为上面转换的list 33 | #参数sentences是定义的空list,用来储存打标签之后的数据 34 | #参数category 是类型标签 35 | def preprocess_text(content_lines, sentences, category): 36 | for line in content_lines: 37 | try: 38 | segs=jieba.lcut(line) 39 | segs = [v for v in segs if not str(v).isdigit()]#去数字 40 | segs = list(filter(lambda x:x.strip(), segs)) #去左右空格 41 | segs = list(filter(lambda x:len(x)>1, segs)) #长度为1的字符 42 | segs = list(filter(lambda x:x not in stopwords, segs)) #去掉停用词 43 | sentences.append((" ".join(segs), category))# 打标签 44 | except Exception: 45 | print(line) 46 | continue 47 | #调用函数、生成训练数据 48 | sentences = [] 49 | preprocess_text(laogong, sentences, 'laogong') 50 | preprocess_text(laopo, sentences, 'laopo') 51 | preprocess_text(erzi, sentences, 'erzi') 52 | preprocess_text(nver, sentences, 'nver') 53 | 54 | #打散数据,生成更可靠的训练集 55 | random.shuffle(sentences) 56 | 57 | #控制台输出前10条数据,观察一下 58 | for sentence in sentences[:10]: 59 | print(sentence[0], sentence[1]) 60 | #用sk-learn对数据切分,分成训练集和测试集 61 | from sklearn.model_selection import train_test_split 62 | x, y = zip(*sentences) 63 | x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1234) 64 | 65 | #抽取特征,我们对文本抽取词袋模型特征 66 | from sklearn.feature_extraction.text import CountVectorizer 67 | vec = CountVectorizer( 68 | analyzer='word', # tokenise by character ngrams 69 | max_features=4000, # keep the most common 1000 ngrams 70 | ) 71 | vec.fit(x_train) 72 | #用朴素贝叶斯算法进行模型训练 73 | from sklearn.naive_bayes import MultinomialNB 74 | classifier = MultinomialNB() 75 | classifier.fit(vec.transform(x_train), y_train) 76 | #对结果进行评分 77 | print(classifier.score(vec.transform(x_test), y_test)) -------------------------------------------------------------------------------- /CNN_中文二分类/text_cnn.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import tensorflow as tf 3 | import numpy as np 4 | 5 | class TextCNN(object): 6 | ''' 7 | sequence_length: 句子的长度,我们把所有的句子都填充成了相同的长度(该数据集是59)。 8 | num_classes: 输出层的类别数,我们这个例子是2(正向和负向)。 9 | vocab_size: 我们词汇表的大小。定义 embedding 层的大小的时候需要这个参数,embedding层的形状是[vocabulary_size, embedding_size]。 10 | embedding_size: 嵌入的维度。 11 | filter_sizes: 我们想要 convolutional filters 覆盖的words的个数,对于每个size,我们会有 num_filters 个 filters。比如 [3,4,5] 表示我们有分别滑过3,4,5个 words 的 filters,总共是3 * num_filters 个 filters。 12 | num_filters: 每一个filter size的filters数量(见上面) 13 | l2_reg_lambda:正则化处理时L2的参数 14 | ''' 15 | def __init__( 16 | self, sequence_length, num_classes, vocab_size, 17 | embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0): 18 | 19 | # 定义占位符,在dropout层保持的神经元的数量也是网络的输入,因为我们可以只在训练过程中启用dropout,而评估模型的时候不启用。 20 | self.input_x = tf.placeholder(tf.int32, [None, sequence_length], name="input_x") 21 | self.input_y = tf.placeholder(tf.float32, [None, num_classes], name="input_y") 22 | self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob") 23 | # 定义常量,Keeping track of l2 regularization loss (optional) 24 | l2_loss = tf.constant(0.0) 25 | # Embedding layer,强制操作运行在CPU上。 如果有GPU,TensorFlow 会默认尝试把操作运行在GPU上,但是embedding实现目前没有GPU支持,如果使用GPU会报错。 26 | # 这个 scope 添加所有的操作到一个叫做“embedding”的高阶节点,使得在TensorBoard可视化你的网络时,你可以得到一个好的层次 27 | with tf.device('/cpu:0'), tf.name_scope("embedding"): 28 | self.W = tf.Variable( 29 | # 它将词汇表的词索引映射到低维向量表示。它基本上是我们从数据中学习到的lookup table 30 | tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), 31 | name="W") 32 | # 创建实际的embedding操作。embedding操作的结果是形状为 [None, sequence_length, embedding_size] 的3维张量积 33 | self.embedded_chars = tf.nn.embedding_lookup(self.W, self.input_x) 34 | # print "^^^^^^^embedded_chars^^^^^^",self.embedded_chars.get_shape() 35 | # (?, 56, 128) 36 | self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1) 37 | # print "^^^^^^^embedded_chars_expanded^^^^^^",self.embedded_chars_expanded.get_shape() 38 | # (?, 56, 128, 1) 39 | 40 | # Create a convolution + maxpool layer for each filter size 41 | ''' 42 | 现在我们准备构建convolutional layers,然后进行max-pooling。注意我们使用不同大小的filters。 43 | 因为每个卷积会产生不同形状的张量积,我们需要通过他们迭代,为每一个卷积构建一个卷积层, 44 | 然后把结果合并为一个大的特征向量。 45 | 这里,W是filter矩阵,h是对卷积输出应用非线性的结果(就是说卷积层用的是relu激活函数), 46 | 每个filter都在整个embedding上滑动,但是覆盖的words个数不同。”VALID” 填充意味着我们在句子上滑动filter没有填充边缘, 47 | 做的是narrow convolution,可以得到形状为 [1, sequence_length - filter_size + 1, 1, 1]的输出。 48 | 对特定的filter大小的输出进行max-pooling得到的是形状为[batch_size, 1, 1, num_filters]的张量积 49 | ,这基本是一个特征向量,最后的维度对应特征。一旦我们从每个filter size得到了所有的pool了的输出张量积, 50 | 我们可以将它们结合在一起形成一个长的特征向量,形状是[batch_size, num_filters_total]。 51 | 52 | ''' 53 | pooled_outputs = [] 54 | for i, filter_size in enumerate(filter_sizes): 55 | with tf.name_scope("conv-maxpool-%s" % filter_size): 56 | # 卷积层 57 | filter_shape = [filter_size, embedding_size, 1, num_filters] 58 | # 定义参数,也就是模型的参数变量 59 | W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W") 60 | b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b") 61 | """ 62 | TensorFlow卷积conv2d操作接收的参数说明: 63 | self.embedded_chars_expanded:一个4维的张量,维度分别代表batch, width, height 和 channel 64 | W:权重 65 | strides:步长,是一个四维的张量[1, 1, 1, 1],第一位与第四位固定为1,第二第三为长宽上的步长 66 | 这里都是设为1 67 | padding:选择是否填充0,TensorFlow提供俩个选项,SAME、VAILD 68 | """ 69 | conv = tf.nn.conv2d( 70 | self.embedded_chars_expanded, 71 | W, 72 | strides=[1, 1, 1, 1], 73 | padding="VALID", 74 | name="conv") 75 | # 非线性激活 76 | h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu") 77 | # 最大值池化,h是卷积的结果,是一个四维矩阵,ksize是过滤器的尺寸,是一个四维数组,第一位第四位必须是1,第二位是长度,这里为卷积后的长度,第三位是宽度,这里为1 78 | pooled = tf.nn.max_pool( 79 | h, 80 | ksize=[1, sequence_length - filter_size + 1, 1, 1], 81 | strides=[1, 1, 1, 1], 82 | padding='VALID', 83 | name="pool") 84 | pooled_outputs.append(pooled) 85 | 86 | # Combine all the pooled features 87 | num_filters_total = num_filters * len(filter_sizes) 88 | self.h_pool = tf.concat(pooled_outputs, 3) 89 | # 在 tf.reshape中使用-1是告诉TensorFlow把维度展平,作为全连接层的输入 90 | self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total]) 91 | # Add dropout,以概率1-dropout_keep_prob,随机丢弃一些节点 92 | with tf.name_scope("dropout"): 93 | self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob) 94 | ''' 95 | 使用经过max-pooling (with dropout applied)的特征向量,我们可以通过做矩阵乘积,然后选择得分最高的类别进行预测。 96 | 我们也可以应用softmax函数把原始的分数转化为规范化的概率,但是这不会改变我们最终的预测结果。 97 | ''' 98 | with tf.name_scope("output"): 99 | W = tf.get_variable( 100 | "W", 101 | shape=[num_filters_total, num_classes], 102 | initializer=tf.contrib.layers.xavier_initializer()) 103 | b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b") 104 | l2_loss += tf.nn.l2_loss(W) 105 | l2_loss += tf.nn.l2_loss(b) 106 | # tf.nn.xw_plus_b 是进行 Wx+b 矩阵乘积的方便形式 107 | self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores") 108 | self.predictions = tf.argmax(self.scores, 1, name="predictions") 109 | 110 | # 定义损失函数 111 | with tf.name_scope("loss"): 112 | losses = tf.nn.softmax_cross_entropy_with_logits(logits=self.scores, labels=self.input_y) 113 | self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss 114 | 115 | # Accuracy 116 | with tf.name_scope("accuracy"): 117 | correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1)) 118 | self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy") 119 | -------------------------------------------------------------------------------- /CNN_中文二分类/train.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | #! /usr/bin/env python 3 | import tensorflow as tf 4 | import numpy as np 5 | import os 6 | import time 7 | import datetime 8 | import data_helpers 9 | from text_cnn import TextCNN 10 | from tensorflow.contrib import learn 11 | 12 | # 训练数据的赋值,文件的名字不建议用中文 13 | tf.flags.DEFINE_float("dev_sample_percentage", .2, "Percentage of the training data to use for validation") 14 | tf.flags.DEFINE_string("jisuanji_data_file", "./fenci/jisuanji200.txt", "Data source for the jisuanji data.") 15 | tf.flags.DEFINE_string("jiaotong_data_file", "./fenci/jiaotong214.txt", "Data source for the jiaotong data.") 16 | 17 | #模型的超参数“:词向量的维数、过滤器的大小、每层网络上卷积核的个数、DropOut的概率、L2的参数 18 | tf.flags.DEFINE_integer("embedding_dim", 128, "Dimensionality of character embedding (default: 128)") 19 | tf.flags.DEFINE_string("filter_sizes", "3,4,5", "Comma-separated filter sizes (default: '3,4,5')") 20 | tf.flags.DEFINE_integer("num_filters", 128, "Number of filters per filter size (default: 128)") 21 | tf.flags.DEFINE_float("dropout_keep_prob", 0.5, "Dropout keep probability (default: 0.5)") 22 | tf.flags.DEFINE_float("l2_reg_lambda", 0.0, "L2 regularization lambda (default: 0.0)") 23 | 24 | # 训练的参数:每一批的训练数据数量,每一批次的训练数据大小以及训练的次数,每100步评测一下模型,每100步保存一下模型,最多保留最近的5个模型 25 | tf.flags.DEFINE_integer("batch_size", 64, "Batch Size (default: 64)") 26 | tf.flags.DEFINE_integer("num_epochs", 200, "Number of training epochs (default: 200)") 27 | tf.flags.DEFINE_integer("evaluate_every", 100, "Evaluate model on dev set after this many steps (default: 100)") 28 | tf.flags.DEFINE_integer("checkpoint_every", 100, "Save model after this many steps (default: 100)") 29 | tf.flags.DEFINE_integer("num_checkpoints", 5, "Number of checkpoints to store (default: 5)") 30 | # Misc Parameters【】 31 | tf.flags.DEFINE_boolean("allow_soft_placement", True, "Allow device soft device placement") 32 | tf.flags.DEFINE_boolean("log_device_placement", False, "Log placement of ops on devices") 33 | 34 | FLAGS = tf.flags.FLAGS 35 | 36 | # Load data,这里也可以打乱数据,后面在计算batch时还需要打乱一次 37 | print("Loading data...") 38 | x_text, y = data_helpers.load_data_and_labels(FLAGS.jisuanji_data_file, FLAGS.jiaotong_data_file) 39 | print " =========Loading data x_text============== " 40 | 41 | # 获得训练实例中的最长的文本的长度 42 | max_document_length = max([len(x.split(" ")) for x in x_text]) 43 | # print max_document_length 44 | # 因为存在非常长的文本,为了加快训练的速度,这里手动指定了每个文本的最大长度,用于截取与填充 45 | max_document_length = 150 46 | # X=[] 47 | vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length) 48 | x = np.array(list(vocab_processor.fit_transform(x_text))) 49 | 50 | # Randomly shuffle data,这里也可以打乱数据,后面在计算batch时还需要打乱一次 51 | np.random.seed(10) 52 | shuffle_indices = np.random.permutation(np.arange(len(y))) 53 | x_shuffled = x[shuffle_indices] 54 | y_shuffled = y[shuffle_indices] 55 | print x_shuffled.shape 56 | 57 | # 2:1[100,100] 58 | # 7: 59 | 60 | 61 | #这里简单的使用百分比*训练集长度,来划分了训练集、测试集 62 | dev_sample_index = -1 * int(FLAGS.dev_sample_percentage * float(len(y))) 63 | x_train, x_dev = x_shuffled[:dev_sample_index], x_shuffled[dev_sample_index:] 64 | # skleran 65 | 66 | print "x_train.shape[1]:",x_train.shape[1] 67 | 68 | y_train, y_dev = y_shuffled[:dev_sample_index], y_shuffled[dev_sample_index:] 69 | print("Vocabulary Size: {:d}".format(len(vocab_processor.vocabulary_))) 70 | print("Train/Dev split: {:d}/{:d}".format(len(y_train), len(y_dev))) 71 | 72 | # Training 73 | with tf.Graph().as_default(): 74 | session_conf = tf.ConfigProto( 75 | allow_soft_placement=FLAGS.allow_soft_placement, 76 | log_device_placement=FLAGS.log_device_placement) 77 | sess = tf.Session(config=session_conf) 78 | with sess.as_default(): 79 | cnn = TextCNN( 80 | sequence_length=x_train.shape[1], 81 | num_classes=y_train.shape[1], 82 | vocab_size=len(vocab_processor.vocabulary_), 83 | embedding_size=FLAGS.embedding_dim, 84 | filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))), 85 | num_filters=FLAGS.num_filters, 86 | l2_reg_lambda=FLAGS.l2_reg_lambda) 87 | 88 | global_step = tf.Variable(0, name="global_step", trainable=False) 89 | optimizer = tf.train.AdamOptimizer(1e-3) 90 | grads_and_vars = optimizer.compute_gradients(cnn.loss) 91 | train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step) 92 | 93 | grad_summaries = [] 94 | for g, v in grads_and_vars: 95 | if g is not None: 96 | grad_hist_summary = tf.summary.histogram("{}/grad/hist".format(v.name), g) 97 | sparsity_summary = tf.summary.scalar("{}/grad/sparsity".format(v.name), tf.nn.zero_fraction(g)) 98 | grad_summaries.append(grad_hist_summary) 99 | grad_summaries.append(sparsity_summary) 100 | grad_summaries_merged = tf.summary.merge(grad_summaries) 101 | 102 | timestamp = str(int(time.time())) 103 | # 储存训练好的模型 104 | out_dir = os.path.abspath(os.path.join(os.path.curdir, "runs", timestamp)) 105 | print("Writing to {}\n".format(out_dir)) 106 | 107 | # Summaries for loss and accuracy 108 | loss_summary = tf.summary.scalar("loss", cnn.loss) 109 | acc_summary = tf.summary.scalar("accuracy", cnn.accuracy) 110 | 111 | # Train Summaries 112 | train_summary_op = tf.summary.merge([loss_summary, acc_summary, grad_summaries_merged]) 113 | train_summary_dir = os.path.join(out_dir, "summaries", "train") 114 | train_summary_writer = tf.summary.FileWriter(train_summary_dir, sess.graph) 115 | 116 | # Dev summaries 117 | dev_summary_op = tf.summary.merge([loss_summary, acc_summary]) 118 | dev_summary_dir = os.path.join(out_dir, "summaries", "dev") 119 | dev_summary_writer = tf.summary.FileWriter(dev_summary_dir, sess.graph) 120 | 121 | # Checkpoint directory. Tensorflow assumes this directory already exists so we need to create it 122 | checkpoint_dir = os.path.abspath(os.path.join(out_dir, "checkpoints")) 123 | checkpoint_prefix = os.path.join(checkpoint_dir, "model") 124 | if not os.path.exists(checkpoint_dir): 125 | os.makedirs(checkpoint_dir) 126 | saver = tf.train.Saver(tf.global_variables(), max_to_keep=FLAGS.num_checkpoints) 127 | 128 | # Write vocabulary 129 | vocab_processor.save(os.path.join(out_dir, "vocab")) 130 | 131 | # Initialize all variables 132 | sess.run(tf.global_variables_initializer()) 133 | 134 | # 训练模型 135 | def train_step(x_batch, y_batch): 136 | """ 137 | A single training step 138 | """ 139 | feed_dict = { 140 | cnn.input_x: x_batch, 141 | cnn.input_y: y_batch, 142 | cnn.dropout_keep_prob: FLAGS.dropout_keep_prob 143 | } 144 | _, step, summaries, loss, accuracy = sess.run( 145 | [train_op, global_step, train_summary_op, cnn.loss, cnn.accuracy], 146 | feed_dict) 147 | time_str = datetime.datetime.now().isoformat() 148 | print("{}: step {}, loss {:g}, acc {:g}".format(time_str, step, loss, accuracy)) 149 | train_summary_writer.add_summary(summaries, step) 150 | 151 | # 测试集使用的,因为测试的时候是不需要dropout_keep_prob的,所以和训练的入口分开 152 | def dev_step(x_batch, y_batch, writer=None): 153 | """ 154 | Evaluates model on a dev set 155 | """ 156 | feed_dict = { 157 | cnn.input_x: x_batch, 158 | cnn.input_y: y_batch, 159 | cnn.dropout_keep_prob: 1.0 160 | } 161 | step, summaries, loss, accuracy = sess.run( 162 | [global_step, dev_summary_op, cnn.loss, cnn.accuracy], 163 | feed_dict) 164 | time_str = datetime.datetime.now().isoformat() 165 | print("{}: step {}, loss {:g}, acc {:g}".format(time_str, step, loss, accuracy)) 166 | if writer: 167 | writer.add_summary(summaries, step) 168 | 169 | # Generate batches,这里把训练数据X与标签Y用zip结合在一起了,因为这里需要随机打乱数据,所以需要保证对其 170 | batches = data_helpers.batch_iter( 171 | list(zip(x_train, y_train)), FLAGS.batch_size, FLAGS.num_epochs) 172 | #开始分批次训练 173 | for batch in batches: 174 | # print batch,把打乱顺序后的、已经分批次的组合数据分开 175 | x_batch, y_batch = zip(*batch) 176 | train_step(x_batch, y_batch) 177 | current_step = tf.train.global_step(sess, global_step) 178 | if current_step % FLAGS.evaluate_every == 0: 179 | print("\nEvaluation:") 180 | dev_step(x_dev, y_dev, writer=dev_summary_writer) 181 | print("") 182 | if current_step % FLAGS.checkpoint_every == 0: 183 | path = saver.save(sess, checkpoint_prefix, global_step=current_step) 184 | print("Saved model checkpoint to {}\n".format(path)) 185 | 186 | 187 | -------------------------------------------------------------------------------- /CNN_中文二分类/word2vec_test.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import sys 3 | reload(sys) 4 | sys.setdefaultencoding( "utf-8" ) 5 | # python版的word2vec是包含在gensim工具包里面的,所以请用 pip install gensim 即可 6 | import gensim.models.word2vec as w2v 7 | import logging,gensim,os 8 | import multiprocessing 9 | 10 | # 显示现在可用的内核 11 | print multiprocessing.cpu_count() 12 | model_file_name = 'LW_w2c100.txt' 13 | 14 | #模型训练,生成词向量 15 | print "开始训练!" 16 | sentences = w2v.LineSentence('./file/LW_01cut.txt') 17 | # sentences = w2v.LineSentence('WK_LW_cut.txt') 18 | model = w2v.Word2Vec(sentences, size=100, window=7, min_count=5,workers=multiprocessing.cpu_count()) 19 | 20 | 21 | # 第一种 22 | # model.save(model_file_name) 23 | # 第二种、保存为字典形式的词向量模型,binary=0才可以,否则中文会产生乱码 24 | model.save_word2vec_format(model_file_name, binary=0) 25 | 26 | print 'ok' 27 | print "======================下面是进行比较============================" 28 | 29 | print "======与‘卫星’相关=========" 30 | for x in model.most_similar(u"卫星",topn=7): 31 | print x[0],x[1] 32 | 33 | 34 | print "======与‘遥感’相关=========" 35 | for x in model.most_similar(u"遥感",topn=7): 36 | print x[0],x[1] 37 | 38 | 39 | # [Finished in 46.7s] 40 | # wiki-400M[Finished in 875.6s 41 | # size100 [Finished in 625.8s] 42 | # ''' 43 | 44 | ''' 45 | model = w2v.Word2Vec.load('lw_mac_size100.bin') 46 | 47 | a = "中国" 48 | print model[u'%s' %(a)].shape 49 | print model.wv[u'%s' %(a)] 50 | # for k in model.similar_by_word([u"中国"],topn=3): 51 | # print k[0],k[1] 52 | print "======================下面是进行比较============================" 53 | 54 | print "======与‘卫星’相关=========" 55 | for x in model.most_similar(u"卫星",topn=7): 56 | print x[0],x[1] 57 | 58 | 59 | print "======与‘遥感’相关=========" 60 | for x in model.most_similar(u"遥感",topn=7): 61 | print x[0],x[1] 62 | ''' 63 | 64 | """ 65 | 1102实验结果: 66 | ======与‘卫星’相关========= 67 | 北斗 0.729344725609 68 | 导航 0.713463664055 69 | 测高 0.710172533989 70 | 全球定位系统 0.708398461342 71 | 云图 0.695049464703 72 | 定位系统 0.677260696888 73 | 全球卫星 0.672543406487 74 | 75 | 76 | ======与‘遥感’相关========= 77 | 遥感信息 0.775688707829 78 | 信息提取 0.768172860146 79 | 解译 0.752809762955 80 | 影像 0.75159060955 81 | SAR 0.735499620438 82 | 遥感技术 0.711817026138 83 | MODIS 0.692555189133 84 | [Finished in 3.1s] 85 | 86 | """ 87 | 88 | 89 | """ 90 | ======================下面是进行比较1130[这个是使用关键字字典以及去除停用词、且只是用论文数据集训练的词向量模型]============================ 91 | ======与‘卫星’相关========= 92 | GPS 0.840189158916 93 | TEC 0.742097973824 94 | 观测数据 0.730939686298 95 | 宽频带 0.722171843052 96 | 接收 0.716634392738 97 | 台网 0.69700717926 98 | 自由空气异常 0.693187355995 99 | ======与‘遥感’相关========= 100 | 遥感数据 0.864192664623 101 | 解译 0.829362094402 102 | 信息提取 0.829102158546 103 | 数字高程模型 0.828495025635 104 | 遥感图像 0.825434327126 105 | 遥感影像 0.812215149403 106 | 卫星遥感 0.800514996052 107 | [Finished in 130.9s] 108 | """ -------------------------------------------------------------------------------- /CNN_中文二分类/说明.txt: -------------------------------------------------------------------------------- 1 | 该文本分类模型的说明: 2 | 原paper:Convolutional Neural Networks for Sentence Classification 3 | 简介:是一个基于卷积神经网络的文本分类模型,该简化版代码用于文本的二分类(中英文皆可),文本的数值化使用one-hot的表示方式,CNN模型中使用了dropout机制。 4 | 5 | 代码的执行流程: 6 | 7 | 1、初始数据:按照类别存储在/data文件夹下,每一个类别一个txt,其中每一行代表一条数据,这里总共有两类(数据来源于搜狗开源的新闻分类语料精简版) 8 | 2、中文分类与英文分类的一个主要区别就是中文需要进行分词处理(利用开源的工具JieBa分词) 9 | 3、命令行:python fenci_jieba.py,对原始的中文数据进行分词处理,处理后的结果存储到文件夹/fenci,手动创建了两个分别对应的英文的文件(因为tensorflow不能读取中文文件名) ,分别为jisuanji200.txt、jiaotong214.txt 10 | 11 | 4、训练模型:python train.py 12 | 13 | 5、训练兵保存的模型存储在/runs文件夹下,每一个按照训练时间戳为文件夹名进行存储,例如该次训练的生成的文件夹为:1527400164 14 | 15 | 6、验证模型(使用模型): 16 | python eval.py --eval_train --checkpoint_dir="./runs/1529582704/checkpoints/" 17 | 18 | 7、使用模型预测结果在:/runs/1527400164/prediction.csv中 19 | 20 | 8、可以使用tensorboard工具可视化训练的过程,命令行运行:tensorboard --logdir=./runs/1527400164 ,然后在浏览器中输入:http://127.0.0.1:6006/,既可以可视化我们的模型的训练过程。 21 | 22 | prediction.csv中一个样本的示例: 23 | """ 24 | [计算机],"本期 企鹅 评测 团 产品 — — 华为 MateBookXPro 笔记本电脑 作者 是 一名 普通 公务员 同时 又 是 一名 数码 发烧友 多年 来 一直 沉迷于 各种 新潮 的 数码产品 工作 以后 也 不 忘 通过 数码产品 提升 工作效率 随着 笔记本电脑 市场竞争 的 日益 激烈 再 加上 硬件 性能 不断 提升 越来越 多 的 非 游戏 用户 选择 使用 更加 方便 携带 的 超极本 各大 厂商 自然 也 是 迎合 用户 需求 推出 外观 更加 靓丽 身材 更加 小巧 功能 更加 丰富 的 超极本 25 | """ 26 | 其中[计算机],为后面这段样本的分类标签 27 | 28 | 该数据上分类的结果:二分类的准确率约为0.99左右 29 | """ 30 | Total number of test examples: 416 31 | Accuracy: 0.992788 32 | Saving evaluation to ./runs/1527402855/checkpoints/../prediction.csv 33 | """ 34 | 35 | 关于模型的上线方案: 36 | 1、基于Java的: 37 | 请参考: 38 | https://www.ioiogoo.cn/2018/04/03/java%E8%B0%83%E7%94%A8keras%E3%80%81tensorflow%E6%A8%A1%E5%9E%8B/ 39 | 40 | 2、基于Flask等python的web框架: 41 | 请参考:https://guillaumegenthial.github.io/serving.html 42 | 43 | 3、基于google官方的tensorflow Serving框架: 44 | 请参考:https://www.jianshu.com/p/c1cd2d127ae2 45 | 阿里的基于容器部署的方案:https://yq.aliyun.com/articles/60894?spm=a2c4e.11153959.blogcont60601.11.815eea72lw2ij 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CNN_ChineseTextBinaryClassify 2 | 相关说明可参考博客: 3 | https://www.jianshu.com/p/f69e8a306862 4 | -------------------------------------------------------------------------------- /基于Text-CNN的中文文本二分类实例.md: -------------------------------------------------------------------------------- 1 | 该文本分类模型的说明: 2 | 原paper:Convolutional Neural Networks for Sentence Classification 3 | 简介:是一个基于卷积神经网络的文本分类模型,该简化版代码用于文本的二分类(中英文皆可),文本的数值化使用one-hot的表示方式,CNN模型中使用了dropout机制。 4 | 5 | 代码的执行流程: 6 | 7 | 1、初始数据:按照类别存储在/data文件夹下,每一个类别一个txt,其中每一行代表一条数据,这里总共有两类(数据来源于搜狗开源的新闻分类语料精简版) 8 | 2、中文分类与英文分类的一个主要区别就是中文需要进行分词处理(利用开源的工具JieBa分词) 9 | 3、命令行:python fenci_jieba.py,对原始的中文数据进行分词处理,处理后的结果存储到文件夹/fenci,手动创建了两个分别对应的英文的文件(因为tensorflow不能读取中文文件名) ,分别为jisuanji200.txt、jiaotong214.txt 10 | 11 | 4、训练模型:python train.py 12 | 13 | 5、训练兵保存的模型存储在/runs文件夹下,每一个按照训练时间戳为文件夹名进行存储,例如该次训练的生成的文件夹为:1527400164 14 | 15 | 6、验证模型(使用模型): 16 | python eval.py --eval_train --checkpoint_dir="./runs/1529582704/checkpoints/" 17 | 18 | 7、使用模型预测结果在:/runs/1527400164/prediction.csv中 19 | 20 | 8、可以使用tensorboard工具可视化训练的过程,命令行运行:tensorboard --logdir=./runs/1527400164 ,然后在浏览器中输入:http://127.0.0.1:6006/,既可以可视化我们的模型的训练过程。 21 | 22 | prediction.csv中一个样本的示例: 23 | """ 24 | [计算机],"本期 企鹅 评测 团 产品 — — 华为 MateBookXPro 笔记本电脑 作者 是 一名 普通 公务员 同时 又 是 一名 数码 发烧友 多年 来 一直 沉迷于 各种 新潮 的 数码产品 工作 以后 也 不 忘 通过 数码产品 提升 工作效率 随着 笔记本电脑 市场竞争 的 日益 激烈 再 加上 硬件 性能 不断 提升 越来越 多 的 非 游戏 用户 选择 使用 更加 方便 携带 的 超极本 各大 厂商 自然 也 是 迎合 用户 需求 推出 外观 更加 靓丽 身材 更加 小巧 功能 更加 丰富 的 超极本 25 | """ 26 | 其中[计算机],为后面这段样本的分类标签 27 | 28 | 该数据上分类的结果:二分类的准确率约为0.99左右(仅供参考) 29 | """ 30 | Total number of test examples: 416 31 | Accuracy: 0.992788 32 | Saving evaluation to ./runs/1527402855/checkpoints/../prediction.csv 33 | """ 34 | 35 | 关于模型的上线方案: 36 | 1.基于Java的: 37 | 请参考: 38 | https://www.ioiogoo.cn/2018/04/03/java%E8%B0%83%E7%94%A8keras%E3%80%81tensorflow%E6%A8%A1%E5%9E%8B/ 39 | 40 | 2.基于Flask等python的web框架: 41 | 请参考:https://guillaumegenthial.github.io/serving.html 42 | 43 | 3.基于google官方的tensorflow Serving框架: 44 | 请参考:https://www.jianshu.com/p/c1cd2d127ae2 45 | 阿里的基于容器部署的方案:https://yq.aliyun.com/articles/60894?spm=a2c4e.11153959.blogcont60601.11.815eea72lw2ij 46 | 47 | 48 | 简书博客地址:https://www.jianshu.com/u/c87c7667648a 49 | --------------------------------------------------------------------------------