├── fgom ├── f_hmm │ ├── hmm_user_add_corpus.txt │ ├── tag_num.txt │ ├── init_prob.txt │ └── transition_prob.txt ├── __init__.py ├── f_seg │ └── user_dict.txt ├── common_lib.py ├── HMM.py └── corpus.py ├── .gitignore ├── test ├── pic │ ├── 1.PNG │ ├── 10.PNG │ ├── 11.PNG │ ├── 12.PNG │ ├── 13.PNG │ ├── 14.PNG │ ├── 15.PNG │ ├── 16.PNG │ ├── 17.PNG │ ├── 18.PNG │ ├── 2.PNG │ ├── 3.PNG │ ├── 4.PNG │ ├── 5.PNG │ ├── 7.PNG │ ├── 8.PNG │ └── 9.PNG └── test_crawler.py ├── WaiMaiMiner ├── __pycache__ │ ├── mining.cpython-35.pyc │ ├── crawler.cpython-35.pyc │ └── visualization.cpython-35.pyc ├── mining.py ├── f_corpus │ └── tags │ │ ├── positive_corpus_segment-8.txt │ │ ├── positive_corpus_segment-2.txt │ │ ├── positive_corpus_segment-6.txt │ │ ├── positive_corpus_segment-7.txt │ │ ├── negative_corpus_segment-12.txt │ │ ├── positive_corpus_segment-3.txt │ │ ├── positive_corpus_segment-0.txt │ │ ├── positive_corpus_segment-9.txt │ │ ├── positive_corpus_segment-1.txt │ │ ├── positive_corpus_segment-5.txt │ │ ├── positive_corpus_segment-4.txt │ │ ├── negative_corpus_segment-0.txt │ │ ├── negative_corpus_segment-8.txt │ │ ├── negative_corpus_segment-6.txt │ │ ├── negative_corpus_segment-1.txt │ │ ├── negative_corpus_segment-5.txt │ │ ├── negative_corpus_segment-2.txt │ │ ├── negative_corpus_segment-10.txt │ │ ├── negative_corpus_segment-7.txt │ │ ├── negative_corpus_segment-9.txt │ │ ├── negative_corpus_segment-11.txt │ │ └── negative_corpus_segment-3.txt ├── corpus.py ├── crawler.py ├── visualization.py └── main.py └── README.md /fgom/f_hmm/hmm_user_add_corpus.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | /.idea 3 | -------------------------------------------------------------------------------- /test/pic/1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/1.PNG -------------------------------------------------------------------------------- /test/pic/10.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/10.PNG -------------------------------------------------------------------------------- /test/pic/11.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/11.PNG -------------------------------------------------------------------------------- /test/pic/12.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/12.PNG -------------------------------------------------------------------------------- /test/pic/13.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/13.PNG -------------------------------------------------------------------------------- /test/pic/14.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/14.PNG -------------------------------------------------------------------------------- /test/pic/15.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/15.PNG -------------------------------------------------------------------------------- /test/pic/16.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/16.PNG -------------------------------------------------------------------------------- /test/pic/17.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/17.PNG -------------------------------------------------------------------------------- /test/pic/18.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/18.PNG -------------------------------------------------------------------------------- /test/pic/2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/2.PNG -------------------------------------------------------------------------------- /test/pic/3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/3.PNG -------------------------------------------------------------------------------- /test/pic/4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/4.PNG -------------------------------------------------------------------------------- /test/pic/5.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/5.PNG -------------------------------------------------------------------------------- /test/pic/7.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/7.PNG -------------------------------------------------------------------------------- /test/pic/8.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/8.PNG -------------------------------------------------------------------------------- /test/pic/9.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/test/pic/9.PNG -------------------------------------------------------------------------------- /WaiMaiMiner/__pycache__/mining.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/WaiMaiMiner/__pycache__/mining.cpython-35.pyc -------------------------------------------------------------------------------- /WaiMaiMiner/__pycache__/crawler.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/WaiMaiMiner/__pycache__/crawler.cpython-35.pyc -------------------------------------------------------------------------------- /WaiMaiMiner/__pycache__/visualization.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaoming0625/WaiMaiOpinionMiner/HEAD/WaiMaiMiner/__pycache__/visualization.cpython-35.pyc -------------------------------------------------------------------------------- /fgom/f_hmm/tag_num.txt: -------------------------------------------------------------------------------- 1 | B-E 852 2 | B-N1 703 3 | B-N2 2098 4 | B-P1 1414 5 | B-P2 184 6 | E-E 849 7 | E-N1 685 8 | E-N2 1997 9 | E-P1 1412 10 | E-P2 171 11 | I-E 2168 12 | I-N1 154 13 | I-N2 424 14 | I-P1 774 15 | I-P2 27 16 | M-E 217 17 | M-N1 439 18 | M-N2 3303 19 | M-P1 343 20 | M-P2 413 21 | OT 11138 22 | -------------------------------------------------------------------------------- /test/test_crawler.py: -------------------------------------------------------------------------------- 1 | from WaiMaiMiner import crawler 2 | import json 3 | 4 | 5 | def test1(): 6 | id = "1430806214" 7 | id = "1452459851" 8 | # id = "1438397794" 9 | result = crawler.open(id) 10 | 11 | with open("files/test_crawler.txt", "w", encoding="utf-8") as f: 12 | json.dump(result, f, ensure_ascii=True, indent=4, sort_keys=True, separators=(",", ":")) 13 | 14 | 15 | if __name__ == "__main__": 16 | test1() 17 | -------------------------------------------------------------------------------- /fgom/__init__.py: -------------------------------------------------------------------------------- 1 | from fgom.corpus import * 2 | from fgom.HMM import * 3 | 4 | 5 | def get_to_tag_corpus(input_filename, output_filepath, start=0, end=-1, gap=10): 6 | a = GetToTagCorpus(input_filename, output_filepath, start, end, gap) 7 | a.run() 8 | 9 | 10 | def get_tagged_corpus(input_filepath, output_filename, default='OT'): 11 | a = GetTaggedCorpus(input_filepath, output_filename, default) 12 | a.run() 13 | 14 | 15 | def bootstrapping(bootstrapping_filename, origin_tag_filename): 16 | bootstrap = BootstrappingMaster(bootstrapping_filename, origin_tag_filename) 17 | bootstrap.run() 18 | 19 | 20 | -------------------------------------------------------------------------------- /fgom/f_seg/user_dict.txt: -------------------------------------------------------------------------------- 1 | 快送员 100 n 2 | 不杀之恩 10 n 3 | 凉了 100 n 4 | 外送费 100 n 5 | 付完 100 v 6 | 找不到 100 v 7 | 送餐员 100 n 8 | 快递员 10 n 9 | 大雾霾 10 n 10 | 雾霾天 10 n 11 | 大雪天 10 n 12 | 大雾霾天 10 n 13 | 奥利奥 100 n 14 | 饿了么 100 n 15 | 盐酥鸡 100 n 16 | 好用 1000 a 17 | 夹生米 100 n 18 | 坑爹 1000 n 19 | 糊了 100 a 20 | 断了 200 a 21 | 洒了 20 v 22 | 撒了 200 v 23 | 小炒肉 100 n 24 | 外卖员 100 n 25 | 配送员 100 n 26 | 送餐者 10 n 27 | 全是 500 v 28 | 凉的 100 a 29 | 面筋状 10 a 30 | 粘粘的 10 a 31 | 生的 200 a 32 | 冰的 50 a 33 | 逗逼 10 a 34 | 牛x 10 a 35 | 拔凉 10 a 36 | 靠谱 100 a 37 | 太少 100 a 38 | 手榨 10 a 39 | 给力 100 a 40 | 不够吃 10 a 41 | 送餐人员 10 n 42 | 美团 100 n 43 | 能不能 100 p 44 | 一份餐 10 n 45 | 卷饼 10 n 46 | 叶良辰 10 n 47 | 態度 10 n 48 | 芋圆小丸子 10 n 49 | 作死 200 v 50 | 洒的 200 v 51 | 手滑 10 v 52 | 负责任 10 v 53 | 吃完 50 v 54 | 少送 50 v 55 | 半糖 20 a 56 | 无糖 20 a 57 | 太厚 20 a 58 | 太肥 20 a 59 | 十点半 20 t 60 | 路对面 20 f -------------------------------------------------------------------------------- /fgom/f_hmm/init_prob.txt: -------------------------------------------------------------------------------- 1 | B-E 0.0868922470433639987374974111844494473189115524291992187500000000000000000000000000000000000000000000 529 2 | B-N1 0.0461563731931668858043948944214207585901021957397460937500000000000000000000000000000000000000000000 281 3 | B-N2 0.2140275952693823924288807347693364135921001434326171875000000000000000000000000000000000000000000000 1303 4 | B-P1 0.0987187910643889665607275674119591712951660156250000000000000000000000000000000000000000000000000000 601 5 | B-P2 0.0215177398160315384856300369165182928554713726043701171875000000000000000000000000000000000000000000 131 6 | I-E 0.2222404730617608403786533699530991725623607635498046875000000000000000000000000000000000000000000000 1353 7 | I-N1 0.0103482260183968468453263866990710084792226552963256835937500000000000000000000000000000000000000000 63 8 | I-N2 0.0359724047306176075711192652306635864078998565673828125000000000000000000000000000000000000000000000 219 9 | I-P1 0.0573258869908015791794220206156751373782753944396972656250000000000000000000000000000000000000000000 349 10 | I-P2 0.0027923784494086729100759125543618210940621793270111083984375000000000000000000000000000000000000000 17 11 | OT 0.2040078843626806914812732429709285497665405273437500000000000000000000000000000000000000000000000000 1242 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 一、概述 2 | 3 | ## 1、适用范围 4 | 这是一个实时的、百度外卖评论的细粒度情感分析demo。所有url只适用于百度外卖店铺。 5 | 6 | ## 2、局限与不足 7 | 这个GUI application只是展示基于HMM的细粒度分析可以做到什么效果,只是一个demo,还有很多没有完善的地方,需要优化的地方。比如评价对象分类,比如属性观点对的匹配。 8 | 9 | ## 3、相互学习 10 | 希望大家可以相互分享自己的想法,如果大家有好的算法,可以优化、改进它,希望能联系我,大家相互学习。谢谢! 11 | 12 | # 二、GUI Demo 13 | 14 | ## 1、总体界面 15 | ![17](test/pic/17.PNG) 16 | 17 | ## 2、功能详解 18 | 19 | ### 2.1、实时爬取 20 | 输入百度外卖店铺的一个url地址,实时爬取店铺评论。 21 | 22 |  ![1](test/pic/1.PNG) 23 | 24 | ### 2.2、评论分类、有效性检测 25 |   ![2](test/pic/2.PNG) 26 | 27 | ### 2.3、评价对象分类 28 |   ![3](test/pic/3.PNG) 29 | 30 | ### 2.4、颜色标记 31 |   ![4](test/pic/4.PNG) 32 | 33 | ### 2.5、属性-观点对抽取 34 |   ![5](test/pic/5.PNG) 35 | 36 | ### 2.6、有监督的学习、用户自定义 37 |   ![7](test/pic/7.PNG) 38 | 39 | ### 2.7、统计面板 40 |   ![8](test/pic/8.PNG) 41 | 42 | #### 2.7.1、店铺整体评分分布 43 |   ![9](test/pic/9.PNG) 44 | 45 | #### 2.7.2、商品质量评分分布 46 |   ![10](test/pic/10.PNG) 47 | 48 | #### 2.7.3、配送服务评分分布 49 |   ![11](test/pic/11.PNG) 50 | 51 | #### 2.7.4、各项评价平均指标 52 |   ![12](test/pic/12.PNG) 53 | 54 | #### 2.7.5、整体评价变化趋势 55 |   ![13](test/pic/13.PNG) 56 | 57 | #### 2.7.6、订餐终端分布 58 |   ![14](test/pic/14.PNG) 59 | 60 | #### 2.7.7、商品推荐榜 61 |   ![15](test/pic/15.PNG) 62 | 63 | #### 2.7.7、送餐时间分布 64 |   ![18](test/pic/18.PNG) 65 | 66 | 67 | 68 | 69 | # 三、使用 70 | 直接运行WaiMaiMiner/main.py即可。 71 | 72 | 2016.6.1更新 73 | -------------------------------------------------------------------------------- /WaiMaiMiner/mining.py: -------------------------------------------------------------------------------- 1 | from fgom import common_lib 2 | 3 | 4 | def write_(sentence, which): 5 | cuts = common_lib.cut(sentence) 6 | output = "" 7 | 8 | if which == 1: 9 | tag = "E" 10 | elif which == 2: 11 | tag = "P1" 12 | elif which == 3: 13 | tag = "P2" 14 | elif which == 4: 15 | tag = "N1" 16 | elif which == 5: 17 | tag = "N2" 18 | elif which == 6: 19 | tag = "OT" 20 | else: 21 | return 22 | 23 | if which != 6: 24 | if len(cuts) == 1: 25 | output = "%s/%s" % (cuts[0], "I-" + tag) 26 | else: 27 | i = 0 28 | while True: 29 | if i == 0: 30 | output = "%s/%s\t" % (cuts[i], "B-" + tag) 31 | elif i + 1 == len(cuts): 32 | output += "%s/%s\t" % (cuts[i], "E-" + tag) 33 | break 34 | else: 35 | output += "%s/%s\t" % (cuts[i], "M-" + tag) 36 | i += 1 37 | else: 38 | for i in range(len(cuts)): 39 | output += "%s/%s\t" % (cuts[i], "OT") 40 | 41 | with open(common_lib.miner_hmm_user_add_corpus_filepath, "a", encoding="utf-8") as f: 42 | f.write("%s\n" % output.strip()) 43 | 44 | 45 | def find_pos(clause, word, start=0): 46 | try: 47 | index = clause.index(word, start) 48 | except ValueError: 49 | return -1, -1 50 | return index, index + len(word) 51 | 52 | 53 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-8.txt: -------------------------------------------------------------------------------- 1 | 味道/E 2 | 超/P1 赞/P1 ,/ 3 | 送/E 的/E 也/P1 快/P1 提前/P2 了/P2 半/P2 个/P2 小时/P2 4 | 足不出户/P2 享受/P2 清凉/P2 ,/ 5 | 快递/E 小哥/E 谢谢/P1 啦/P1 ~/ 6 | 速度/E 快/P1 服务/E 态度/E 好/P1 7 | 送货/E 很快/P1 哦/ 8 | 叫/P2 了/P2 好几/P2 次/P2 ,/ 9 | 真心/P1 好喝/P1 10 | 速度/E 很快/P1 哟/P1 ,/ 11 | 女儿/ 的/ 岩盐/E 芝士/E 可可/E 有点/ 咸/ 哈哈/ ,/ 12 | 我的/ 的/ 大满贯/E 还是/ 比较/P1 赞/P1 滴/ !/ 13 | 非常/P1 好/P1 ,/ 14 | 快递/E 非常/P1 不错/P1 15 | 每天/P2 都/P2 会/P2 买上/P2 几/P2 杯/P2 ,/ 16 | 快递/E 非常/P1 棒/P1 17 | 好喝/P1 ,/ 18 | 速度/E 也/P1 很快/P1 ,/ 19 | 值得/P1 赞/P1 20 | 味道/E 很/P1 不错/P1 ,/ 21 | 送餐/E 人员/E 态度/E 也/P1 很/P1 好/P1 ,/ 22 | 很/P1 赞/P1 ,/ 23 | 以后/P2 还/P2 会/P2 来/P2 24 | 一如既往/P1 的/P1 好/P1 25 | 少年/E 很/P1 可爱/P1 —/ 26 | v/ —/ 27 | 非常/P1 的/P1 快/P1 、/ 28 | 有/P1 温馨/P1 提示/P1 !/ 29 | 奶茶/E 很/P1 好喝/P1 30 | 送来/P1 的/P1 挺/P1 快/P1 的/P1 ~/ 31 | 味道/E 不错/P1 32 | 送来/E 的/E 非常/P1 快/P1 ,/ 33 | 饮料/E 都/P1 非常/P1 的/P1 不错/P1 呦/ ,/ 34 | 超级/P1 喜欢/P1 35 | 味道/E 很/P1 浓/P1 ,/ 36 | 而且/ 还/ 可以/ 换/ 不/ 喜欢/ 的/ 布丁/ ,/ 37 | 很/P1 灵活/P1 的/P1 店家/E ,/ 38 | 赞/P1 一个/P1 39 | 速度/E 超级/P1 快/P1 呀/ ,/ 40 | 很/P1 好喝/P1 ,/ 41 | 冰/P1 爽/P1 42 | 好/P1 的/P1 还/P1 可以/P1 43 | 很/P1 棒/P1 !/ 44 | 太/P1 快/P1 了/P1 45 | 送餐/E 快/P1 ,/ 46 | 非常/P1 好/P1 47 | 曲奇/E 很/P1 好喝/P1 48 | 超级/P1 超级/P1 好/P1 49 | 很/P1 准时/P1 !/ 50 | 口味/E 很/P1 好/P1 ,/ 51 | 大/P1 爱/P1 可可/E 小丸/E 子/E 52 | 速度/E 很快/P1 ,/ 53 | 谢谢/P1 送餐员/E ,/ 54 | 辛苦/P1 55 | 挺/P1 好/P1 ,/ 56 | 没/P1 撒/P1 !/ 57 | 岩盐/E 芝士/E 的/E 也好/P1 喝/P1 58 | 好喝/P1 ~/ 59 | 不用/P2 去/P2 外面/P2 买/P2 了/P2 ~/ 60 | 下雨/ 了/ ,/ 61 | 感谢/P1 送餐员/E 62 | 非常/P1 好/P1 ,/ 63 | 辛苦/P1 送餐员/E 64 | 挺/P1 快/P1 的/P1 ,/ 65 | 好/P1 66 | 喜欢/P2 多年/P2 。/ 67 | 非常/P1 好/P1 。/ 68 | 谢谢/P1 外/E 送人/E 员/E 。/ 69 | 在/P2 雨天的/P2 家里/P2 还/P2 能/P2 喝/P2 到/P2 快乐/E 柠檬/E 70 | 东西/E 很/P1 好吃/P1 ,/ 71 | 送餐/E 速度/E 和/ 态度/E 也/P1 很/P1 棒/P1 72 | 本次/E 订餐/E 很/P1 愉快/P1 !/ 73 | 挺/P1 好/P1 的/P1 !/ 74 | 下次/P1 还/P1 定/P1 !/ 75 | 辛苦/P1 送餐/E 小哥/E 76 | 骑士/E 小哥/E 辛苦/P1 啦/P1 !/ 77 | 非常/P1 快/P1 78 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-2.txt: -------------------------------------------------------------------------------- 1 | 味道/E 2 | 还/P1 不错/P1 ,/ 3 | 红烧肉/E 更/P2 软/P2 点/P2 就/P2 更/P2 完美/P2 啦/P2 !/ 4 | 快递/E 员/E 很/P1 好/P1 ,/ 5 | 又/P1 快/P1 ,/ 6 | 又/P1 负责/P1 7 | 味道/E 很/P1 好/P1 ,/ 8 | 送餐/E 速度/E 也/ 很快/P1 。/ 9 | 一直/P2 在/P2 订餐/P2 ,/ 10 | 还/P1 不错/P1 ,/ 11 | 好评/P1 12 | 很/P1 好/P1 ,/ 13 | 送餐/E 小哥/E 服务/P1 不错/P1 ,/ 14 | 态度/E 很/P1 好/P1 ,/ 15 | 准时/P1 ,/ 16 | 饭菜/E 也/ 不错/P1 ,/ 17 | 大冷/P2 天/P2 赞/P2 一个/P2 18 | 挺/P1 好吃/P1 的/P1 ,/ 19 | 不错/P1 ,/ 20 | 送/E 的/E 很快/P2 21 | 美味/P1 ,/ 22 | 送餐/E 人员/E 态度/E 很/P1 不错/P1 。/ 23 | 不错/P1 啊/P1 ,/ 24 | 很/P1 好吃/P1 哦/P1 !/ 25 | 送/E 的/E 好/P2 快/P2 ,/ 26 | 态度/E 很/P1 好/P1 27 | 又/P1 快/P1 又/P1 好/P1 ,/ 28 | 小哥/E 态度/E 很/P1 好/P1 ,/ 29 | 好评/P1 30 | 下雨天/P2 小哥/P2 还/P2 提前/P2 送/P2 过来/P2 了P2/ ,/ 31 | 好/P1 辛苦/P1 ,/ 32 | 好评/P1 33 | 挺/P1 好/P1 的/P1 ,/ 34 | 服务/E 态度/E 也/ 挺/P1 好/P1 的/P1 35 | 配送/E 员/E 人/E 很/P1 好/P1 36 | 不错/P1 ,/ 37 | 好吃/P1 ,/ 38 | 两个/P2 人/P2 没/P2 吃/P2 完/P2 ,/ 39 | 还/P2 会/P2 光顾/P2 !/ 40 | 小炒/E 肉/E 真心/ 不是/ 湖南/E 小炒/E 肉/E ,/ 41 | 坦白/ 讲/ 肉/E 炒/N2 太/N2 老/N2 了/N2 ,/ 42 | 不/N2 推荐/N2 。/ 43 | 鸭/E 头/E 不错/P1 44 | 特别/P1 实在/P1 ,/ 45 | 实惠/P1 ,/ 46 | 量/E 大/P1 ,/ 47 | 良心/P1 餐厅/E 。/ 48 | 味道/E 也/P1 不错/P1 49 | 很/P1 不错/P1 ,/ 50 | 菜品/E 物美价廉/P1 ~/ ~/ ~/ 51 | 空心菜E/ 份量/E 少/N2 了/N2 点/N2 ,/ 52 | 汤/E 不错/P1 53 | 蛮/P1 好吃/P1 的/P1 就是/ 饭/E 太/N2 少/N2 了/N2 54 | 今天/ 送/E 的/E 真/P2 快/P2 ,/ 55 | 好评/P1 56 | 送货/E 时间/E 挺/P1 准/P1 的/P1 就是/ 对路/N2 不/N2 太/N2 熟悉/N2 ~/ 57 | 还/P1 可以/P1 吧/P1 ~/ 58 | 最近/ 迷恋/P1 金桔/E 柠檬茶/E 啊/ !/ 59 | 服务/E 态度/E 不错/P1 ,/ 60 | 骑手/E 辛苦/P1 啦/P1 ~/ 61 | 口味/E 不错/P1 服务/E 态度/E 好/P1 ,/ 62 | 感/P2 谢/P2 你们/P2 63 | 今天/ 真是/ 超级/P1 快/P1 ,/ 64 | 感觉/P2 刚/P2 下单/P2 就/P2 送到/P2 啦/P2 哈哈哈/ 65 | 外/E 送/E 很快/P1 ,/ 66 | 给/P2 赞/P2 一个/P2 ~/ 67 | 非常/P1 好/P1 。/ 68 | 送/E 的/E 也/ 特别快/P2 。/ 69 | 棒棒/P1 哒/P1 !/P1 70 | 好/P 服务/E ,/ 71 | 就是/ 习惯/ 百度/E 外卖/E 的/ 快速/ 72 | 口感/E 好/P1 其他/ 的/ 不能/ 比/ 我喜欢/P2 73 | 态度/E 非常/P1 好/P1 ,/ 74 | 速度/E 快/P1 ,/ 75 | 味道/E 好极/P1 了/P1 !/ 76 | 好喝/P1 ,/ 77 | 不/P1 贵/P1 ,/ 78 | 红红火火/P2 哈哈哈/ 79 | 快递/E 小哥/E 辛苦/P1 80 | 快递/E 很/P1 及时/P1 ,/ 81 | 很/P1 方便/P1 很/P1 好/P1 82 | 服务/E 很/P1 好/P1 ,/ 83 | 下次/P2 还/P2 会/P2 订购/P2 84 | 不错/P1 ,/ 85 | 就/P2 定/P2 他们/P2 家/P2 的/P2 1/ !/ !/ !/ !/ !/ !/ !/ !/ 86 | 送/E 的/E 及时/P2 ,/ 87 | 饮料/E 很/P1 好喝/P1 哦/P1 88 | 不错/P1 啊/P1 。/ 89 | 快递/E 很快/P1 ,/ 90 | 奶茶/E 也/ 还/P1 行/P1 。/ 91 | 很快/P1 。/ 。/ 92 | 布丁/E 奶茶/E 贼/P1 好喝/P1 93 | 超/P1 好喝/P1 ,/ 94 | 快递/E 小哥/E 很/P1 热情/P1 ,/ 95 | 速度/E 很快/P1 …/ 96 | 挺/P1 好/P1 的/P1 ,/ 97 | 挺/P1 好喝/P1 的/P1 ,/ 98 | 不错/P1 99 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-6.txt: -------------------------------------------------------------------------------- 1 | 非常/P1 2 | 喜欢/P1 味道/E 不错/P1 ,/ 3 | 辛苦/P1 了/P1 !/ 4 | 这/P2 大雪/P2 天/P2 的/P2 ,/ 5 | 快递/E 员/E 给/P1 力/P1 !/ 6 | 辛苦/P1 快递/E 员/E 了/ 7 | 还/P1 行/P1 ,/ 8 | 不错/P1 ,/ 9 | 快递/E 也/P1 非常/P1 的/P1 快/P1 10 | 好喝/P1 !/ 11 | 快递/E 小哥/E 这么/P2 大/P2 的/P2 雨/P2 还/P2 送/P2 的/P2 很快/P1 !/ 12 | 看/P2 他/P2 的/P2 湿/P2 哒哒/P2 的/ 了/ !/ 13 | 谢谢/P1 你们/E 啦/ !/ !/ !/ 14 | 很/P1 不错/P1 ,/ 15 | 速度/E 也/P1 很快/P1 。/ 16 | 师傅/E 态度/E 特好/P1 ,/ 17 | 真/P1 暖/P1 心/P1 ,/ 18 | 赞/P1 19 | 大冷/P2 天/P2 的/P2 ,/ 20 | 快递/E 小哥/E 跟/P1 热情/P1 ,/ 21 | 准时/P1 ,/ 22 | 辛苦/P1 辛苦/P1 ,/ 23 | 很/P1 感谢/P1 24 | 红豆/E 布丁/E 奶茶/E 太/P1 甜/P1 。/ 25 | 烤/E 珍珠/E 一直/P1 美味/P1 26 | 还/P1 挺/P1 快/P1 的/ ~/ ,/ 27 | 味道/E 也/P1 不错/P1 。/ 28 | 赞/P1 29 | 都/P1 好喝/P1 。/ 30 | 烤/E 珍珠/E 尤其/P1 好喝/P1 31 | 美味/P1 ,/ 32 | 及时/P1 ,/ 33 | 经常/P2 订/P2 ,/ 34 | 希望/P2 优惠/P2 力度/P2 再/P2 大/P2 些/P2 35 | 百度/E 骑士/E 特别/P1 准时/P1 ,/ 36 | 态度/E 还/P1 特别/P1 好/P1 !/ 37 | 快递/E 员/E 态度/E 好/P1 ,/ 38 | 速度/E 也/P1 很快/P1 39 | 味道/E 很/P1 好/P1 ,/ 40 | 就是/ 手/ 滑/ 点/ 成/ 冰/ 的/ 了/ ,/ 41 | 悲剧/ 42 | 非常/P1 不错/P1 ,/ 43 | 谢谢/P1 送餐/E 的/E 师傅/E 44 | 比/P2 预计/P2 时间/P2 送/P2 的/P2 还/P2 早/P2 十分钟/P2 ,/ 45 | 态度/E 很/P1 好/P1 ,/ 46 | 点/P1 赞/P1 !/ 47 | 快递/E 小伙儿/E 特别/P1 热情/P1 ./ 48 | 很/P1 好/P1 !/ 49 | 大冷/P2 天/P2 的/P2 ,/ 50 | 送餐员/E 辛苦/P1 了/ 51 | 好喝/P1 ,/ 52 | 大雪/P2 天/P2 的/P2 非常/P1 感谢/P1 53 | 。/ 54 | 送餐员/E 特好/P1 的/ 说话/ 。/ 。/ 。/ 。/ 。/ 。/ 55 | 送货/E 挺/P1 快/P1 的/P1 ,/ 56 | 送货/E 挺/P1 快/P1 的/P1 57 | 太/P1 快/P1 了/P1 ,/ 58 | 你/P2 是/P2 飞过/P2 来/P2 送餐/E 的/E 吧/ …/ 59 | 送餐/E 大姐/E 人/P1 可好/P1 了/P1 ,/ 60 | 特别/P1 热情/P1 ,/ 61 | 五星/P1 !/ 62 | 赞/P1 63 | 配送/E 很快/P1 !/ 64 | 送来/P2 还是/P2 烫/P2 的/P2 !/ 65 | 很/P1 好/P1 66 | 几乎/P2 每天/P2 都/P2 喝/P2 !/ …/ …/ …/ …/ 67 | 快递/E 小哥/E 态度/E 特别/P1 好/P1 …/ 68 | 辛苦/P1 啦/P1 谢谢/P1 69 | 热饮/E 有/P2 珍珠/P2 的/P2 。/ 70 | 百度/E 的/E 外/E 送送/E 了/ 小礼/ 品/ !/ 71 | 很/P1 高兴/P1 !/ 72 | 意外/P1 惊喜/P1 !/ 73 | 饮品/E 味道/E 一直/P1 很/P1 棒/P1 ,/ 74 | 有/ 外/ 送/ 太/ 完美/ 啦/ ~/ 75 | 配送/E 大哥/E 服务/E 很/P1 好/P1 ,/ 76 | 热心/P1 帮忙/P1 找零/P1 钱/P1 77 | 服务/E 很/P1 好/P1 !/ 78 | 还/P1 送/P1 了/ 吸吸/P1 冻/P1 !/ 79 | 哈哈/P1 80 | 好喝/P1 。/ 。/ 81 | 速度/P1 快/P1 。/ 。/ 。/ 82 | 非常/P1 方便/P1 !/ 83 | 准时/P1 !/ 84 | 很/P1 好/ !/ 85 | 奶茶/E 好喝/P1 !/ 86 | 送餐/E 准时/P1 ,/ 87 | 到/P2 的/P2 时候/P2 还是/P2 热乎乎/P2 的/P2 !/ 88 | 奶茶/E 超级/P1 好喝/P1 ,/ 89 | 喝/P2 了/P2 好多/P2 次/P2 了/P2 90 | 他家/E 的/E 奶茶/E 超级/P1 好喝/P1 。/ 。/ 。/ 91 | 奶茶/E 超级/P1 好喝/P1 ,/ 92 | 推荐/P1 。/ 93 | 超级/P1 好喝/P1 的/P1 奶茶/E 。/ 。/ 。/ 94 | 送/E 的/E 超/P1 快/P1 !/ !/ 95 | 速度/E 很快/P1 ,/ 96 | 32/P1 个/P1 赞/P1 ,/ 97 | 服务/E 很/P1 好/P1 98 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-7.txt: -------------------------------------------------------------------------------- 1 | 非常/P1 2 | 好/P1 送/E 的/E 很快/ P1,/ ,/ ,/ 3 | 还是/P2 热/P2 的/P2 。/ 4 | 准时/P1 到达/P1 ,/ 5 | 太/P1 给/P1 力/P1 了/P1 !/ 6 | 速度/E 很快/P1 。/ 7 | 而且/ 我/P2 找不/P2 到/P2 钥匙/P2 也/P2 耐心/P2 等/P2 。/ 8 | 还/P2 安慰/P2 我/P2 说不着/P2 急/P2 。/ 9 | 人/P1 很/P1 好/P1 。/ 10 | 东西/E 很/P1 好喝/P1 。/ 11 | 下次/P2 还/P2 会/P2 买/P2 12 | 特别/P1 感谢/P1 快递/E 师傅/E !/ 13 | 这么/P2 大风/P2 天气/P2 还/P2 准时/P1 送到/P1 !/ 14 | 辛苦/P1 辛苦/P1 …/ 15 | 谢谢/P1 啦/P1 !/ 16 | 速度/E 很快/P1 ,/ 17 | 唯一/ 不足/ 就是/ 第一次/ 下单/ 莫名/ 的/ 失败/ 了/ 。/ 。/ 。/ 18 | 很/P1 好喝/P1 !/ 19 | 天天/P2 都/P2 喝/P2 ~/ ~/ 20 | 配送/E 不错/P1 、/ 21 | 态度/E 也/P1 不错/P1 22 | 师傅/E 人/P1 很/P1 好/P1 ,/ ,/ 23 | 送/E 的/E 速度/E 也/P1 很快/P1 。/ 24 | 很/P1 棒/P1 的/P1 骑士/E !/ !/ !/ !/ !/ 25 | 还/P1 不错/P1 ,/ 26 | 绿茶/E 还是/ 个人/ 喝/ 不/ 惯/ 。/ 。/ 。/ 27 | 奶茶/E 给/P1 赞/P1 28 | 小哥/E 长/P1 得/P1 帅/P1 态度/E 还好/P1 ,/ 29 | 好评/P1 30 | 很快/P1 ,/ 31 | 没有/P1 撒/P1 ,/ 32 | 必须/P1 赞/P1 33 | 很快/P1 ,/ 34 | 也/P1 很/P1 好喝/P1 ,/ 35 | 不错/P1 36 | 很/P1 好/P1 送货/E 大哥/E 37 | 奶茶/E 很/P1 好喝/P1 ,/ 38 | 快递/E 小哥/E 也/P1 超/P1 给/P1 力/P1 !/ 39 | 赞/P1 一个/P1 ,/ 40 | 辛苦/P1 了/P1 。/ 41 | 服务/E 热情/P1 !/ 42 | 点/P2 单/P2 时/P2 忘/P2 了/P2 一杯/P2 ,/ 43 | 给/P2 快递/E 小哥/E 打电话/P2 ,/ 44 | 有/P2 帮忙/P2 捎/P2 了/P2 一杯/P2 !/ 45 | 有效率/P1 ,/ 46 | 非常/P1 好/P1 47 | 热情/P1 !/ 48 | 速度/P1 快/P1 !/ 49 | 超/P1 快/P1 !/ 50 | 服务好/P1 热情/P1 51 | 超级/P1 快/P1 ,/ 52 | 送餐员/E 超级/P1 好/P1 53 | 很快/P1 好开/P1 心/P1 54 | 优惠/E 活动/E 不错/P1 55 | 非常/P1 方便/P1 !/ 56 | 很/P1 好/P1 !/ 57 | 杯子/ 坏/ 了/ ,/ 58 | 不过/ 饮料/ 没出/ 来/ ,/ 59 | 其他/P1 都/P1 可以/P1 60 | 赶上/P2 雨/P2 最大/P2 的/P2 时候/P2 ,/ 61 | 外卖/E 小哥/E 很/P1 不容/P1 易/P1 62 | 非常/P1 非常/P1 好/P1 !/ 63 | 服务/E 超级/P1 赞/P1 !/ 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 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-12.txt: -------------------------------------------------------------------------------- 1 | 送餐/E 2 | 者/E 态度/E 极其/N1 不好/N1 !/ !/ !/ !/ 3 | 送/P1 得/P1 很快/P1 。/ 4 | 可是/N1 ,/ 5 | 肘子/E 卷/E 和/N1 以前/N1 吃/N1 的/N1 不一/N1 样/N1 了/N1 ,/ 6 | 全/N1 是/N1 肉/N1 ,/ 7 | 都/N1 漏油/N1 了/N1 ,/ 8 | 只有/N1 几/N1 片/N1 小小的/N1 跟/N1 指甲盖/E 差不多/N1 大/N1 的/N1 青椒/N1 ,/ 9 | 没/N1 吃/N1 完/N1 ,/ 10 | 太/N1 腻/N1 了/N1 …/ 11 | 粥/E 不错/P1 12 | 鱼香肉丝/E 的/N2 肉/N2 呢/N2 ?/ ?/ 13 | 巨/N1 慢/N1 14 | 卷饼/E 的/N1 皮/E 很/N1 硬/N1 ,/ 15 | 肉/E 也/N2 不是/N2 肘子/N2 肉/N2 ,/ 16 | 没有/N1 以前/N1 好吃/N1 了/N1 ,/ 17 | 很/N1 失望/N1 ,/ 18 | 近期/N1 不会/N1 再/N1 点/N1 了/N1 。/ 19 | 送/N1 的/N1 慢/N1 还/N1 难吃/N1 20 | 味道/E 还/N1 可以/N1 ,/ 21 | 就是/N2 等/N2 的/N2 花儿/N2 也/N2 谢/N2 了/N2 ,/ 22 | 近/N1 2/N1 小时/N1 才/N1 送到/N1 …/ 23 | 没有/N2 另一/N2 家/N2 的/N2 好吃/N2 ,/ 24 | 送/N1 的/N1 太/N1 慢/N1 了/N1 25 | 不知/N1 道/N1 怎么/N1 这么/N1 慢/N1 !/ 26 | 看来/N2 以后/N2 订/N2 他们/N2 家/N2 的/N2 午餐/E 应该/N2 从/N2 9/N2 点/N2 开始/N2 才/N2 行/N2 呀/N2 27 | 送餐/E 太/N1 慢/N1 等/N2 一个半/N2 小时/N2 28 | 真的/N1 很/N1 差/N1 ,/ 29 | 11/N2 点/N2 半/N2 订餐/N2 ,/ 30 | 下午/N2 1/N2 点/N2 半/N2 才/N2 给/N2 送餐/N2 ,/ 31 | 差/N1 到/N1 极点/N1 ,/ 32 | 送餐员/ 居然/N2 到/N2 了不/N2 敢/N2 面对/N2 客户/N2 直接/N2 把饭/N2 扔/N2 在/N2 前台/N2 就/N2 走/N2 了/N2 ,/ 33 | 从未/N2 遇到/N2 过/N2 这样的/N2 外卖/E 34 | 卷饼/E 还是/P1 比较/P1 好吃/P1 的/P1 35 | 包装/E 挺/P1 好/P1 ,/ 36 | 土豆/E 肉丝/E 卷饼/E 中/N1 的/N1 肉丝/E 都/N1 是/N1 肥/N1 的/N1 ,/ 37 | 不好/N1 吃/N1 ,/ 38 | 土豆丝/E 也/N1 一般/N1 39 | 好/N1 难吃/N1 啊/N1 ,/ 40 | 都/N1 没/N1 吃/N1 过/N1 这样/N1 子/N1 的/N1 京/E 酱肉/E 丝/E ,/ 41 | 还/N1 送/N1 得/N1 超/N1 慢/N1 ,/ 42 | 差/N1 评/N1 43 | 10/N2 分钟/N2 就/N2 送到/N2 了/N2 ,/ 44 | 但/N1 竟然/N1 是/N1 凉/N1 的/N1 ,/ 45 | 所以/N1 不知/N1 这是/N1 不是/N1 别人/N1 不要/N1 剩下/N1 的/N1 。/ 46 | 吃/N1 完/N1 拉肚子/N1 了/N1 。/ 47 | 速度/P1 很快/P1 ,/ 48 | 味道/N1 一般/N1 49 | 差/N1 !/ 50 | 强烈/N1 不/N1 推荐/N1 !/ 51 | 首先/N1 送/N1 的/N1 东西/N1 少/N1 送/N1 了/N1 ,/ 52 | 还是/N1 自己/ 打电话/ 去/N1 问/N1 ,/ 53 | 问/N1 了/N1 又/N1 告诉/N1 我/N1 打/N1 另一/N1 个/N1 电话/N1 !/ 54 | 为了/N1 退款/N1 自己/N1 打电话/N1 就/N1 打/N1 了/N1 四五/N1 个/N1 !/ 55 | 其次/N1 东西/N1 真的/N1 超级/N1 不好/N1 吃/N1 ,/ 56 | 看着/N1 也/N1 脏/N1 脏/N1 的/N1 !/ 57 | 很/N1 垃圾/N1 58 | 写/N2 的/N2 是/N2 12/N2 点/N2 送/N2 ,/ 59 | 11/N2 点/N2 就/N2 给/N2 我/N2 打电话/N2 说到/N2 了/N2 ,/ 60 | 在/N2 上课/N2 取/N2 不了/N2 ,/ 61 | 12/N2 多点/N2 又/N2 来/N2 的/N2 ,/ 62 | 之前/N2 订/N2 的/N2 外卖/N2 都/N2 能/N2 送/N2 上楼/N2 ,/ 63 | 这个/N2 不/N2 给/N2 送/N2 ,/ 64 | 下课/N2 到/N2 楼下/N2 取/N2 的/N2 ,/ 65 | 肉/E 卷/E 的/P1 味道/P1 倒是/P1 可以/P1 !/ 66 | 生/N1 的/N1 ,/ 67 | 不能/N1 吃/N1 ,/ 68 | 扔掉/ 了/N1 ,/ 69 | 配送/E 还/N1 特/N1 慢/N1 70 | 南瓜/E 粥/E 不错/P1 ,/ 71 | 素菜/E 卷/E 一般/N1 ,/ 72 | 跟/N1 土豆丝/E 差别/N1 不大/N1 ,/ 73 | 就是/N1 加/N1 了/N1 豆芽/E ,/ 74 | 香菇/E ,/ 75 | 味道/N1 不/N1 突出/N1 。/ 76 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-3.txt: -------------------------------------------------------------------------------- 1 | 好喝/P1 ,/ 2 | 也/P1 没有/P1 漏/P1 。/ ,/ ,/ ,/ ,/ 3 | 骑士E/ 很/P1 好/P1 ,/ 4 | 赞/P1 一个/P1 ,/ 5 | 很/P1 礼貌/P1 ,/ 6 | 辛苦/P1 了/P1 !/ 7 | 满意/P1 ,/ 8 | 速度/E 也/P1 非常/P1 快/P1 。/ 9 | 味道/E 很/P1 棒/P1 !/ 10 | 辛苦/P1 送餐员/E 啦/ P1!/ 11 | 经常/P1 定/ ,/ 12 | 特别/P1 好喝/P1 ,/ 13 | 快递/E 给/P1 力/P1 。/ 14 | 大冷/ 天/ 辛苦/P1 快递/E 大哥/ E了/ 。/ 15 | 超级/P1 快/P1 !/ 16 | 奶茶/E 一如既往/P1 的/P1 美味/P1 !/ 17 | 送餐/P1 很快/P1 ,/ 18 | 这么/ 冷/ 的/ 天气/ 辛苦/P1 了/ 19 | 外卖员/ 名字/ 跟我/ 们/ 家名/ 字/ 一样/ 20 | 服务/E 态度/E 很/P1 好/P1 饮料/E 很/P1 棒/P1 !/ 21 | 在/P2 这样/P2 寒冷/P2 大风/P2 的/P2 天气/P2 里/P2 ,/ 22 | 等/P2 了/P2 一下/P2 午/P2 的/P2 奶茶/ 终于/ 到/ 了/ ,/ 23 | 已经/ 从/ 热/ 的/ 变成/ 凉/ 的/ 了/ 。/ 24 | 但/ 仍/ 感谢/P1 骑士/E 的/ 敬业/P1 精神/P1 !/ 25 | 大风/P2 天/P2 ,/ 26 | 不容/P2 易/P2 ,/ 27 | 非常/P1 好/P1 28 | 7/ 点/ 半/ 下单/ ,/ 29 | 9/ 点/ 送到/ ,/ 30 | 今天/ 天/ 冷/ 可以/ 理解/ ,/ 31 | 外/E 送/E 态度/P1 也/P1 非常/P1 好/P1 ,/ 32 | 虽然/ 等/ 了/ 很/ 久/ ,/ 33 | 但是/P1 还是/P1 好评/P1 吧/P1 34 | 快递/E 师傅/E 特别/P1 好/P1 ,/ 35 | 大冷/P2 天真/P2 不容/P2 易/P2 36 | 谢谢/P1 ,/ 37 | 非常/P1 感谢/P1 ,/ 38 | 那么/P2 等/P2 的/P2 天真/P2 是/P2 麻烦/P2 了/P2 ,/ 39 | 虽然/ 等/ 了/ 会/ ,/ 40 | 但/P1 还是/P1 很/P1 感谢/P1 41 | 配送/E 员/E 辛苦/P1 啦/P1 ,/ 42 | 服务/P1 很/P1 好/P1 43 | 喝/ 了/ 好几/ 年/ 快乐/ 柠檬/ ,/ 44 | 第一次/ 喝/ 曲奇/ 奶茶/ ,/ 45 | 个人/ 觉得/ 不好/ 喝/ ,/ 46 | 本人/ 还是/ 更/ 喜欢/ 茶/ 类/ 冰/ 饮/ ,/ 47 | 给/ 配送/ 员/ 赞/ 一个/ ,/ 48 | 大/ 冬天/ 的/ 49 | 一直/P1 都/P1 挺/P1 满意/P1 的/P1 ~/ ,/ 50 | 骑士/E 也/P1 很/P1 棒/P1 ~/ 51 | 能/P1 送/P1 这个/P1 实在/P1 太/P1 好了/P1 ,/ 52 | 外/ 送/ 大哥/E 辛苦/P1 了/P1 53 | 送餐/P1 很快/P1 ,/ 54 | 这么/P2 冷/P2 的/P2 天/P2 辛苦/P1 了/P1 55 | 好喝/P1 ,/ 56 | 百度/E 送/P1 的/P1 很快/P1 ,/ 57 | 非常/P1 感谢/P1 58 | 一如既往/P1 的/P1 味道/P1 我喜欢/P1 的/P1 口味/P1 59 | 送货员/E 态度/P1 很/P1 好/P1 啦/P1 !/ ,/ 60 | 非常/P1 感谢/P1 ,/ 61 | 辛苦/P1 了/ 62 | 大哥/E 很/P1 热情/P1 !/ 63 | 不错/P1 !/ 64 | 好评/P1 65 | 大满贯/E 奶茶/E !/ 66 | 超大/P1 杯/P1 !/ 67 | 快递/E 态度/P1 很/P1 好/P1 ,/ 68 | 大冷/ 天/ 的/ 辛苦/P1 了/ 。/ 69 | 速度/P1 很快/P1 ,/ 70 | 味道/P1 很/P1 好/P1 ,/ 71 | 很/P1 赞/P1 72 | 骑士/E 师傅/E 人好/P1 ,/ 73 | 态度/P1 超级/P1 好/P1 74 | 服务/E 态度/E 好/P1 ,/ 75 | 速度/P1 快/P1 ,/ 76 | 值得/P1 表扬/P1 77 | 师傅/E 人/P1 很/P1 好/P1 ,/ 78 | 送/P1 的/P1 超级/P1 快/P1 79 | 送/P1 的/P1 很快/P1 ,/ 80 | 师傅/E 人/P1 也/P1 很/P1 亲和/P1 81 | 好极/P1 了/P1 !/ 82 | 送来/P1 还是/P1 热/P1 的/P1 !/ 83 | 非常/P1 满意/P1 !/ 84 | 送餐/P1 很快/P1 !/ 85 | 十万/P1 个/P1 赞/P1 !/ 86 | 最好/P1 喝/P1 没有/P1 之一/P1 !/ 87 | 百度/E 骑士服/E 务/E 很/P1 好/P1 ,/ 88 | 全/P1 五分/P1 好评/P1 89 | 非常/P1 好/P1 ,/ 90 | 相当/P1 棒/P1 ,/ 91 | 很快/P1 ,/ 92 | 味道/E 好好/P1 93 | 一直/P1 很/P1 喜欢/P1 他家/P1 的/ 东西/E ,/ 94 | 味好/P1 ,/ 95 | 便宜/P1 96 | 不错/P1 不错/P1 ,/ 97 | 快递/E 师傅/E 也/P1 给/P1 力/P1 98 | 饮料/E 好喝/P1 ,/ 99 | 送餐/E 也/P1 神速/P1 。/ 100 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-0.txt: -------------------------------------------------------------------------------- 1 | 很快/P1 ,/ 2 | 好吃/P1 ,/ 3 | 味道/E 足/P1 ,/ 4 | 量/E 大/P1 5 | 没有/N2 送水/N2 ,/ 6 | 没有/N2 送水/N2 ,/ 7 | 没有/N2 送水/N2 8 | 非常/P1 快/P1 ,/ 9 | 态度/E 好/P1 。/ 10 | 方便/P1 ,/ 11 | 快捷/P1 ,/ 12 | 味道/E 可口/P1 ,/ 13 | 快递/E 给/P1 力/P1 14 | 菜/E 味道/E 很/P1 棒/P1 !/ 15 | 送餐/E 很/P1 及时/P1 !/ 16 | 送餐/E 快/P1 ,/ 17 | 态度/E 也/ 特别/P1 好/P1 ,/ 18 | 辛苦/P1 啦/P1 谢谢/P2 19 | 超级/P1 快/P1 就/ 送到/ 了/ ,/ 20 | 这么/ 冷/ 的/ 天气/ 骑士/E 们/E 辛苦/P1 了/P1 。/ 21 | 谢谢/P2 你们/P2 。/ 22 | 麻辣/E 香/E 锅/E 依然/P1 很/P1 好吃/P1 。/ 23 | 经过/ 上次/ 晚/ 了/ 2/ 小时/ ,/ 24 | 这次/ 超级/P1 快/P1 ,/ 25 | 20/P2 分钟/P2 就/P2 送到/P2 了/P2 …/ …/ 26 | 最后/ 五分钟/ 订/ 的/ ,/ 27 | 卖家/E 特别/P1 好/P1 接/ 单/ 了/ ,/ 28 | 谢谢/P2 。/ 29 | 量/E 大/P1 ,/ 30 | 好吃/P1 ,/ 31 | 每次/P2 点/P2 的/P2 都/P2 够/P2 吃/P2 两次/P2 32 | 挺/ 辣/ 的/ ,/ 33 | 吃着/ 还/P1 可以/P1 吧/ 34 | 味道/E 好/P1 ,/ 35 | 送餐/E 快/P1 ,/ 36 | 分量/E 足/P1 37 | 量/E 足/P1 ,/ 38 | 好吃/P1 ,/ 39 | 送餐/E 也/ 快/P1 40 | 特别/P1 好吃/P1 ,/ 41 | 量/E 特大/P1 ,/ 42 | 而且/ 送餐/E 特别快/P1 ,/ 43 | 特别/P1 特别/P1 棒/P1 44 | 口感/E 好/P1 的/P1 很/P1 ,/ 45 | 速度/E 快/P1 !/ 46 | 相当好/P1 吃/P1 的/ 香/E 锅/E ,/ 47 | 分量/E 够/P1 足/P1 ,/ 48 | 味道/E 也/ 没/P2 的/P2 说/P2 。/ 49 | 好吃/P1 !/ 50 | 速度/P1 !/ 51 | 包装/E 也/ 有/P1 品质/P1 ,/ 52 | 不出/P2 家门/P2 就/P2 能/P2 吃/P2 到/P2 餐厅/P2 的/P2 味道/P2 !/ 53 | 味道/E 好极/P1 啦/P1 ,/ 54 | 送餐/E 很快/P1 师傅/E 辛苦/P1 啦/P1 55 | 量/E 大/P1 味道/E 好/P1 ,/ 56 | 送餐/E 师傅/E 都/ 很/P1 好/P1 57 | 送餐/E 师傅/E 很/P1 好/P1 ,/ 58 | 味道/E 好极/P1 啦/P1 59 | 送货/E 速度/E 很快/P1 ,/ 60 | 一直/P2 定/P2 这家/P2 ,/ 61 | 赞/P2 62 | 很/P1 方便/P1 ,/ 63 | 很快/P2 就/P2 送到/P2 了/P2 。/ 64 | 棒/P1 65 | 好吃/P1 ,/ 66 | 总/P2 点/P2 ,/ 67 | 这么/P1 多/P1 够/P2 五个人/P2 吃/P2 。/ 68 | 送/P2 的/P2 很快/P2 。/ 69 | 很/P1 香/P1 ,/ 70 | 很/P1 美味/P1 ,/ 71 | 下次/P2 还/P2 会/P2 光顾/P2 72 | 送餐/E 特别快/P1 ,/ 73 | 态度/E 也好/P1 ,/ 74 | 辛苦/P1 啦/P1 75 | 服务/E 很/P1 不错/P1 ,/ 76 | 送到/E 的/E 很快/P2 ,/ 77 | 半/P2 小时/P2 不到/P2 就/P2 送来/P2 了/P2 78 | 速度/E 很快/P1 ,/ 79 | 大雾/ 霾/ 天外/ 卖/ 骑士/E 态度/E 都/ 很/P1 好/P1 ,/ 80 | 赞赞/P2 赞/P2 !/ 81 | 味道/E 正宗/P1 ,/ 82 | 量/E 大/P1 内容/E 多/P1 83 | 送餐/E 非常/P1 快/P1 ,/ 84 | 态度/E 特别/P1 好/P1 ,/ 85 | 谢谢/P2 86 | 又/P1 快/P1 又/P1 好/P1 ,/ 87 | 量/E 足/P1 ,/ 88 | 经常/P2 吃/P2 89 | 好大/P2 一/P2 盆/P2 ,/ 90 | 点/ 了/ 7/ 个/ 小/ 份/ 量/E 足/P1 91 | 配送/E 人员/E 态度/E 好/P1 ,/ 92 | 速度/E 快/P1 !/ 93 | 在/ 这种/ 天气/ 里/ 感谢/P2 送餐员/E 的/E 辛苦/E 服务/E ,/ 94 | 谢谢/P2 啦/P2 95 | 送餐/E 特别快/P1 ,/ 96 | 态度/E 好/P1 ,/ 97 | 非常/P1 感谢/P1 98 | 送/E 的/E 非常/P1 快/P1 ,/ 99 | 包装/E 好/P1 !/ 100 | 谢谢/P2 师傅/P2 !/ 101 | 附近/ 最好/P1 吃/P1 的/P1 麻辣/E 香/ 锅/E ,/ 102 | 不开/ 玩笑/ 的/ 103 | 味道/E 不错/P1 ,/ 104 | 份量/E 很/P1 足/P1 ,/ 105 | 建议/ 都/ 点/ 小/ 份/ 。/ 106 | 红薯/E 超/P1 好吃/P1 就是/ 太/N1 烂/N1 了/N1 容易/N2 碎/N2 107 | 还/P1 不错/P1 ,/ 108 | 就是/ 稍微/N1 咸/N1 了/N1 点/N1 109 | 这么/ 晚/ 辛苦/P1 外卖/E 小哥/E 了/ 110 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-9.txt: -------------------------------------------------------------------------------- 1 | 菜/E 2 | 很/P1 好吃/P1 ,/ 3 | 就是/ 炒饭/ 这次/ 给/ 的/ 有点/ 少/ 。/ 4 | 快递/E 小哥/E 服务特/P1 别/P1 好/P1 ,/ 5 | 餐/P2 送到/P2 还/P2 热乎乎/P2 的/P2 ,/ 6 | 正好/P1 吃/P1 。/ 7 | 菜品/E 不错/P1 。/ 8 | 饭/ 很少/ ,/ 9 | 要/ 知道/ 就/ 多/ 定/ 两/ 碗/ 了/ ,/ 10 | 送餐/E 师傅/E 很/P1 棒/P1 11 | 土豆/E 炖/P1 得/P1 特别/P1 好/P1 ,/ 12 | 适合/P2 老人/P2 吃/P2 ,/ 13 | 谢谢/P1 14 | 速度/E 比/P1 预计/P1 快/P1 很多/P1 ,/ 15 | 菜品/E 不错/P1 16 | 送餐/E 小哥/E 真/P1 快/P1 ,/ 17 | 菜/E 也/P1 很/P1 好吃/P1 18 | 好吃/P1 ,/ 19 | 好吃/P1 ,/ 20 | 江山/E 城/E 的/E 烤鸭/E 真是/P1 挺/P1 好吃/P1 的/P1 21 | 挺/P1 好/P1 的/P1 ,/ 22 | 挺/P1 不错/P1 的/ ,/ 23 | 味道/E 不错/P1 24 | 菜/ 有点/ 辣/ ,/ 25 | 菜/E 量/E 挺/P1 好/P1 ,/ 26 | 量/E 大/P1 。/ 27 | 味道/E 挺/P1 好/P1 。/ 28 | 态度/E 很/P1 好/P1 ,/ 29 | 效率/E 很/P1 高/P1 ,/ 30 | 给/P1 十分/P1 赞/P1 31 | 每次/ 量/E 都/P1 很/P1 足/P1 哈/ !/ 32 | 超级/P1 赞/P1 ,/ 33 | 好吃/P1 34 | 送餐/E 很快/P1 ,/ 35 | 可是/ 为啥/ 没/ 餐具/ 呢/ ,/ 36 | 用/ 手/ 吃/ ?/ 37 | 幸好/ 送餐/E 师傅/E 给/P2 了/P2 两/P2 双百/P2 度/P2 餐具/P2 。/ 38 | 百度/E 骑士/E 速度/E 好/P1 快/P1 啊/P1 !/ 39 | 而且/ 服务/E 态度/E 超级/P1 好/P1 ~/ ~/ 40 | 江山/E 城/E 的/E 饭/E 一直/P1 很/P1 好吃/P1 ,/ 41 | 走/P2 了/P2 外卖/P2 很/P2 方便/P2 呢/ !/ 42 | 麻辣/E 香/E 锅/E 做/P1 的/P1 真好/P1 吃/P1 ,/ 43 | 很/P1 棒/P1 。/ 。/ 44 | 很快/P1 。/ 。/ 45 | 很/P1 好吃/P1 46 | 他家/E 菜/E 很/P1 好吃/P1 ,/ 47 | 有求必应/P1 ,/ 48 | 送餐/E 速度/E 很快/P1 ,/ 49 | 赞/P1 50 | 速递/E 小哥/E 辛苦/P1 了/P1 ,/ 51 | 饭菜/E 到手/P1 还是/P1 烫/P1 烫/P1 的/P1 ,/ 52 | 在/P2 这/P2 寒冷/P2 的/P2 日子/P2 ,/ 53 | 谢谢/P1 啦/ !/ 54 | 很/P1 好吃/P1 ,/ 55 | 菜品/E 味道/E 很/P1 好/P1 ,/ 56 | 有/P1 要求/P1 都/P1 很/P1 爽快/P1 满足/P1 ,/ 57 | 赞/P1 58 | 挺/P1 快/P1 的/P1 味道/E 不错/P1 ,/ 59 | 推荐/P2 大家/P2 选择/P2 。/ 60 | 服务/E 热情/P1 ,/ 61 | 送餐/E 高效/P1 ,/ 62 | 很/P1 满意/P1 63 | 味道/E 不错/P1 ,/ 64 | 挺/P1 讲究/P1 的/P1 ,/ 65 | 私房/E 豆腐/E 很/P1 好吃/P1 66 | 在家/P2 附近/P2 吃/P2 了/P2 很多/P2 年/P2 ,/ 67 | 烤鸭/E 一级/P1 棒/ P1。/ 68 | 送餐/E 快/P1 ,/ 69 | 菜品/E 还是/P1 热/P1 的/ ./ 70 | 服务/E 也好/P1 71 | 很/P1 不错/P1 ,/ 72 | 以前/P2 都/P2 在/P2 店里/P2 吃/P2 ,/ 73 | 现在/P2 方便/P2 了/P2 74 | 不错/P1 不错/P1 ,/ 75 | 味道/E 可以/P1 !/ 76 | 速度/E 也/P1 还/P1 可以/P1 77 | 很/P1 棒/P1 的/P1 哦/P1 ,/ 78 | 第二次/P2 订餐/P2 了/P2 79 | 丸子/E 很/P1 嫩/P1 ,/ 80 | 拔丝/E 山药/E 还给/ 配/ 了/ 一/ 袋/ 水/ ,/ 81 | 呵呵/ ,/ 82 | 好/P1 贴心/P1 83 | 很快/P1 很/P1 好吃/P1 更/P1 给/P1 力/P1 会/P2 继续/P2 支持/P2 的/P2 84 | 不错/P1 哦/P1 ,/ 85 | 感谢/P1 百度/E 骑士/E !/ 86 | 速度/E 很快/P1 ,/ 87 | 菜/E 的/E 味道/E 也好/P1 !/ 88 | 不错/P1 !/ 89 | 毛/E 血/E 旺/E 辣/P1 度/P1 正/P1 合适/P1 ,/ 90 | 料/E 很/P1 足/P1 ,/ 91 | 比/P2 眉/P2 州/P2 的/P2 性价比/P2 更/P2 高/P2 92 | 宝宝/ 很/ 爱吃/P1 荷兰豆/E ,/ 93 | 甜甜的/P1 94 | 第二次/ 买/ 了/ ,/ 95 | 挺/P1 好/P1 的/ ,/ 96 | 以后/P1 继续/P1 97 | 很/P1 好吃/P1 ,/ 98 | 送餐/E 速度/E 快/P1 ,/ 99 | 下次/P1 再/P1 来/P1 100 | 送/E 外卖/E 小伙/E 服务/E 真/P1 棒/P1 ,/ 101 | 很/P1 尽责/P1 !/ 102 | 挺/P1 好/P1 ,/ 103 | 继续/P1 保持/P1 !/ 104 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-1.txt: -------------------------------------------------------------------------------- 1 | 超级/P1 2 | 快/P1 就/ 送到/ 了/ ,/ 3 | 谢谢/P2 骑士/E 很快/P1 ,/ 4 | 感谢/P2 骑士/P2 这种/P2 天气/P2 还/P2 在/P2 工作/P2 !/ 5 | 非常/P1 好吃/P1 ,/ 6 | 味道/E 也/ 很/P1 香/P1 ,/ 7 | 推荐/P2 !/ 8 | 很/P1 好吃/P1 ,/ 9 | 速递/E 快/P1 ,/ 10 | 下次/P2 继续/P2 选择/P2 11 | 很快/P1 ,/ 12 | 特别/P1 好/P1 13 | 点/P2 了/P2 太/P2 多次/P2 了/P2 ,/ 14 | 味道/E 很/P1 香/P1 15 | 态度/E 很/P1 好/P1 ,/ 16 | 地址/ 填/ 错/ 了/ 还是/ 给/ 我/ 跑/ 了/ 一/ 趟/ ,/ 17 | 没有/ 表现/ 出/ 不/ 愿意/ 的/ 样子/ ,/ 18 | 为了/ 这个/ 快递/E 员/E ,/ 19 | 我/ 写/ 了/ 评论/ 20 | 快递/E 小哥/E 很快/P1 就/ 送到/ 了/ !/ 21 | 赞/P2 !/ 22 | 水煮/E 牛肉/E 肉质/E 鲜嫩/P1 ,/ 23 | 辣/P2 的/P2 恰到好处/P2 ,/ 24 | 也/ 很/P1 入味/P1 。/ 25 | 不错/P1 ,/ 26 | 挺/P1 好吃/P1 的/P1 !/ 27 | 口味/E 不错/P1 ,/ 28 | 干净/P1 ,/ 29 | 味道/E 好/P1 ,/ 30 | 送货员/E 服务/E 非常/P1 好/P1 !/ 31 | 送餐/E 特别快/P1 ,/ 32 | 态度/E 好/P1 ,/ 33 | 辛苦/P1 啦/P1 ,/ 34 | 谢谢/P2 35 | 送餐/E 快/P1 ,/ 36 | 送餐/E 大哥/E 态度/E 好/P1 ,/ 37 | 辛苦/P1 啦/P1 38 | 送餐/E 很快/P1 ,/ 39 | 态度/E 也/ 很/P1 好/P1 ,/ 40 | 谢谢/P2 41 | 挺/P1 不错/P1 的/P1 !/ 42 | 快递/E 大叔/E 人/E 特别/P1 好/P1 。/ 43 | 就是/ 百度/E 外卖/E 现在/ 连/N2 个/N2 优惠/N2 都/N2 那个/N2 少/N2 ,/ 44 | 真/ 要/ 投奔/ 饿/ 了/ 么/ 了/ 。/ 。/ 。/ 。/ 45 | 感觉/ 没有/N2 在/N2 店里/N2 的/N2 好吃/N2 ,/ 46 | 感谢/P2 送餐/P2 师傅/P2 我们/P2 家/P2 六楼/P2 没/P2 电梯/P2 还/P2 得/P2 爬/P2 楼梯/P2 47 | 菜场/E 好/P1 ,/ 48 | 挺/P1 好吃/P1 的/P1 49 | 快递/E 小哥/E 辛苦/P1 了/P1 !/ 50 | 下雨天/P2 的/P2 真是/P2 辛苦/P2 您/P2 了/P2 !/ 51 | 给/P2 你/P2 点/P2 赞/P2 !/ 52 | 相当好/P1 !/ 53 | 送餐/E 快/P1 ,/ 54 | 一大/E 盒子/E 超/P1 好吃/P1 !/ 55 | 送餐/E 特别快/P1 ,/ 56 | 送餐员/E 态度/E 也/ 特别/P1 好/P1 57 | 速度/E 快/P1 ,/ 58 | 量/E 多/P1 ,/ 59 | 很/P1 香/P1 60 | 味道/E 很/P1 正点/P1 !/ 61 | 餐具/E 很/P1 好用P1/ !/ 62 | 送餐/E 速度/E 快/P1 !/ 63 | 非常/P1 好/P1 !/ 64 | 第一次/ 用/ 百度/ 外卖/ ,/ 65 | 送餐/E 很快/P1 ,/ 66 | 快递/E 小哥/E 也/ 很/P1 礼貌/P1 。/ 67 | 菜品/E 量/E 足/P1 ,/ 68 | 味道/E 不错/P1 ,/ 69 | 下次/P2 再/P2 来/P2 。/ 70 | 味道/E 不错/P1 !/ 71 | 东西/E 还/P1 可以/P1 ,/ 72 | 但是/ 没有/N2 在/N2 店里/N2 吃/N2 的/N2 好吃/N2 73 | 很/P1 香/P1 ,/ 74 | 很/P1 好吃/P1 75 | 很/P1 好/P1 ,/ 76 | 送餐员/E 也/ 很/P1 好/P1 77 | 菜/E 量/E 给/ 的/ 挺/P1 足/P1 的/P1 ,/ 78 | 很/P1 满意/P1 ,/ 79 | 就是/ 墨鱼/E 丸/E 不/N1 太/N1 好/N1 ,/ 80 | 有/N2 股/N2 臭味/N2 ,/ 81 | 其他/E 都/ 很/P1 好吃/P1 。/ 82 | 不错/P1 ,/ 83 | 好吃/P1 ,/ 84 | 就是/ 最后/ 有点/N1 油/N1 85 | 很/P1 合口味/P1 。/ 86 | 女友/ 夸/ 猪蹄/E 好吃/P1 。/ 87 | 过年/P2 期间/P2 都/P2 不容/P2 易/P2 。/ 88 | 给/P2 快递/P2 小哥/P2 个/P2 赞/P2 。/ 89 | 辛苦/P1 。/ 90 | 炒饭/E 有点儿/N1 油/N1 ,/ 91 | 不过/ 菜/E 还是/ 很/P1 好/P1 的/P1 92 | 送餐/E 很/P1 及时/P1 ,/ 93 | 菜品/E 味道/E 不错/P1 !/ 94 | 饭/E 还/ 挺/P1 实在/P1 给/P2 个/P2 好评/P2 送餐/E 挺/P1 快/P1 95 | 骑士/E 服务/E 态度/E 很/P1 好/P1 ,/ 96 | 速度/E 很/P1 迅速/P1 !/ 97 | 最近/P2 一直/P2 订/P2 这家/P2 的/P2 外卖/P2 ,/ 98 | 相当/P1 不错/P1 ,/ 99 | 够味儿/P1 ,/ 100 | 快递/E 小哥/E 也/ 是/ 棒棒/P1 的/P1 !/ 101 | 量/E 很多/P1 ,/ 102 | 就是/ 尖椒/E 豆腐皮/E 的/E 味道/E 差点/N1 ,/ 103 | 不是/ 尖椒/E ,/ 104 | 是/ 大海/E 椒/E ,/ 105 | 一点/N2 辣味/N2 都/N2 没有/N2 呢/N2 !/ 106 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-5.txt: -------------------------------------------------------------------------------- 1 | 隔三差五/P2 2 | 儿/P2 的/P2 就/P2 点/P2 两杯/P2 味道/E 不错/P1 !/ 3 | 送餐员/E 辛苦/P1 啦/P1 !/ 4 | 嗯/ ,/ 5 | 送货/E 师傅/E 依然/P1 很/P1 负责/P1 任/P1 呢/P1 !/ 6 | 速度/E 快/P1 ,/ 7 | 服务好/P1 ,/ 8 | 必须/P1 赞/P1 一个/P1 9 | 还/P1 不错/P1 ,/ 10 | 送货/E 很快/P1 味道/E 也/P1 还好/P1 11 | 喜欢/P1 哦/P1 ,/ 12 | 每天/P2 都/P2 在/P2 喝/P2 ,/ 13 | 就是/ 昨天/ 忘/ 了/ 给/ 我/ 半/ 糖/ 了/ 14 | 百度/E 骑士/E 最/P1 牛/P1 x/P1 !/ !/ !/ !/ !/ 15 | 非常/P1 好/P1 ,/ 16 | 非常/P1 快/P1 17 | 菠萝/E 冻/E 过/ 甜/ ,/ 18 | 柠檬/E 冰冻/E 也/ 不/ 太/ 好/ ,/ 19 | 但/ 大满贯/E 一如既往/P1 的/P1 好/P1 20 | 送餐员/E 辛苦/P1 !/ 21 | 奶茶/E 味道/E 不错/P1 !/ 22 | 很/P1 喜欢/P1 喝/ 他家/ 的/ 饮料/E !/ 23 | 谢谢/P1 送餐/E 小哥/E 大冷/P2 天/P2 送来/P2 !/ 24 | 挺/P1 好/P1 的/P1 ,/ 25 | 辛苦/P1 了/P1 26 | 超级/P1 好喝/P1 ,/ 27 | 几乎/ 老/ 点/ …/ 28 | 送餐员/E 师傅/E 态度/E 很/P1 好/P1 !/ 29 | 赞/P1 !/ 30 | 简直/P1 神速/P1 …/ 31 | 非常/P1 好喝/P1 。/ 32 | 继续/P1 努力/P1 33 | 配送/E 非常/P1 迅速/P1 態/E 度/E 非常/P1 好/P1 给/P1 个/P1 赞/P1 34 | 速度/E 很快/P1 ,/ 35 | 奶茶/E 也/P2 都/P2 封口/P2 了/P2 就/P2 不会/P2 撒/P2 出来/P2 36 | 很/P1 喜欢/P1 ,/ 37 | 一/P2 周/P2 已经/P2 喝/P2 了/P2 四/P2 次/P2 了/P2 。/ 38 | 最爱/P1 手/E 榨/E 柠檬/E 绿/E 39 | 经常/P2 上班/P2 定/P2 这个/P2 喝/P2 ,/ 40 | 好喝/P1 ,/ 41 | 送餐员/E 师傅/E ,/ 42 | 可好/P1 了/P1 。/ 43 | 快递/E 员/E 很/P1 客气/P1 辛苦/P1 ,/ 44 | 因为/P2 食物/P2 破损/P2 还/P2 跑/P2 了/P2 两/P2 趟/P2 ,/ 45 | 谢/P1 了/P1 !/ 46 | 非常/P1 好/P1 ,/ 47 | 现在/P2 每天/P2 都/P2 喝/P2 ,/ 48 | 下午/ 一杯/ 柠檬/E 绿茶/E 提神/P1 醒脑/P1 49 | 喜欢/P1 。/ 50 | 明天/P2 还/P2 会/P2 点/P2 。/ !/ !/ 51 | 好评/P1 啊/P1 ,/ 52 | 配送/E 速度/E 超/P1 快/P1 ,/ 53 | 这/P2 大雾/P2 霾/P2 天/P2 的/ 辛苦/P1 啦/P1 ~/ 54 | 辛苦/P1 送餐员/E ,/ 55 | 填/P2 错/P2 了/P2 地址/P2 又/P2 白/P2 走/P2 了/P2 一/P2 趟/P2 ,/ 56 | 辛苦/P1 了/P1 !/ 57 | 服务/E 态度/E 很/P1 好/P1 !/ 58 | 最好/P1 喝/P1 的/P1 奶茶/E ,/ 59 | 最/P1 给/P1 力/P1 的/P1 快递/E 小哥/E 。/ 60 | 超级/P1 好喝/P1 ,/ 61 | 快递/E 小哥/E 非常/P1 给/P1 力/P1 。/ 62 | 特别/P1 好喝/P1 ,/ 63 | 经常/P1 定/P1 ,/ 64 | 快递/E 小哥/E 非常/P1 好/P1 。/ 65 | 赞赞/P1 !/ 66 | 加/ 红豆/E 味道/P1 更好/P1 !/ 67 | 好喝/P1 哦/P1 ,/ 68 | 但/ 今晚/ 我们/ 作/ 死点/ 的/ 无糖/ ,/ 69 | 感觉/ 好/ 酸/ ,/ 70 | 友情/ 提示/ 减肥/ 的/ 朋友/ 点/ 半/ 糖/ 71 | 快递/E 小哥/E 特别/P1 好/P1 。/ 72 | 奶茶/E 棒棒/P1 哒/P1 !/ 73 | 很/P1 好喝/P1 ,/ 74 | 送餐/E 也/P1 及时/P1 。/ 。/ 。/ 。/ 。/ 75 | 送餐员/E 态度/E 很/P1 好/P1 !/ 76 | 辛苦/P1 啦/ !/ 77 | 奶茶/E 味道/E 棒/P1 ,/ 78 | 谁/ 让/ 我/ 是/ 个/ 奶茶/ 控/ 几乎/ 天天/ 喝/ …/ 79 | 这/P2 几/P2 天都/P2 在/P2 点/P2 ,/ 80 | 今儿/ 给/ 朋友/ 点/ 了/ 几/ 杯/ 她们/ 都/ 赞不绝口/P1 !/ 81 | 赞/P1 !/ 82 | 非常/P1 感谢/P1 !/ 83 | 辛苦/P1 陈/E 骑士/E 啦/ !/ 84 | 好喝/P1 !/ 85 | 味道/E 超/P1 赞/P1 !/ 86 | 送餐员/E 也/P1 很/P1 准时/P1 !/ 87 | 比上/P2 面/P2 提醒/P2 的/P2 时间/P2 早/P2 很多/P2 。/ ,/ 88 | 速度/E 挺/P1 快/P1 的/P1 89 | 味道/E 不错/P1 连着/P2 好几/P2 天/P2 了/P2 都/P2 在/P2 喝/P2 !/ 90 | 全都/P1 很/P1 棒/P1 ,/ 91 | 会/P2 继续/P2 支持/P2 。/ 92 | 点/P2 了/P2 三次/P2 了/P2 ,/ 93 | 很/P1 好喝/P1 ,/ 94 | 送/E 的/E 也/P1 很快/P1 95 | 味道/E 超级/P1 棒/P1 !/ 96 | 送餐员/E 大冷/ 天/ 的/ 也/P1 很/P1 辛苦/P1 !/ 97 | 超/P1 赞/P1 !/ 98 | 好喝/P1 !/ 99 | 味道/E 不错/P1 !/ 100 | 送餐/E 也/P1 很快/P1 !/ 101 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/positive_corpus_segment-4.txt: -------------------------------------------------------------------------------- 1 | 岩盐/E 2 | 芝士/E 绿茶/E 每/P2 单/P2 必/P2 点/P2 3 | 一如既往/P1 的/P1 又/P1 快/P1 又/P1 好/P1 !/ 4 | 每周/P2 都/P2 会/P2 在/P2 百度/P2 外卖/P2 买/P2 快乐/E 柠檬/E 家/E 奶茶/E ,/ 5 | 送餐/P1 快/P1 ,/ 6 | 奶茶/E 好喝/P1 ,/ 7 | 棒棒/P1 哒/P1 ,/ 8 | 开心/P1 ~/ 9 | 快递/E 员/E 速度/P1 快/P1 服务好/P1 ,/ 10 | 辛苦/P1 了/P1 !/ 11 | 元旦/P2 节/P2 晚上/P2 9/P2 点/P2 还/P2 在/P2 送/P2 真的/P2 让/P2 我/P2 感动/P2 ,/ 12 | 一直/ 喜欢/ 柠檬/E 小子/E ./ 13 | 蛋糕/E 珍珠/E 特别/P1 好喝/P1 ,/ 14 | 盐/E 岩/E 芝士/E 加/ 了/ 珍珠/E 很/P1 棒/P1 15 | 非常/P1 好/P1 非常/P1 快/P1 支持/P1 !/ !/ !/ 16 | 百度/E 骑士/E 特别/P1 给/P1 力/P1 ,/ 17 | 奶茶/E 是/P1 经典P1大/P2 家/P2 都/P2 爱/P2 喝/ 。/ 18 | 好喝/P1 好喝/P1 ,/ 19 | 超级/P1 喜欢/P1 这家/E 的/E 饮料/ E,/ 小哥/E 送餐/P1 也/ 很快/ 20 | 外卖/E 小哥/E 很/P1 赞/P1 !/ 21 | 送/ 的/ 很快/P1 养/E 乐/E 多好/E 喝/P1 !/ 22 | 再/E 送/E 小哥/E 超帅/P1 !/ !/ !/ !/ 23 | 超级/P1 给/P1 力/P1 的/P1 骑士/E !/ 24 | 饮料/E 好喝/P1 !/ 25 | 一直/P1 很/P1 好喝/P1 ,/ 26 | 这个/P1 很/P1 好喝/P1 27 | 好喝/P1 ,/ 28 | 送/P1 的/P1 很快/P1 ,/ 29 | 百度/E 外卖/E 我/P1 最/P1 喜欢/P1 用/ 了/ !/ 30 | 每/E 一样/E 的/P1 很/P1 喜欢/P1 !/ 31 | 会/P2 继续/P2 光顾/P2 哒/P2 32 | 非常/P1 好喝/P1 ,/ 33 | 一直/P1 喜欢/P1 ,/ 34 | 布丁/E 好吃/P1 35 | 送货/E 态度/E 非常/P1 好/P1 ,/ 36 | 提前/P2 了/P2 20/P2 多分钟/ P2,/ 送/P1 得/P1 非常/P1 快/P1 ,/ 37 | 百度/E 配送/E ,/ 38 | 靠/P1 谱/P1 !/ ,/ 39 | 奶茶/E 一如既往/P1 的/P1 好喝/P1 ,/ 40 | 棒棒/P1 哒/P1 ~/ 41 | 嘿嘿/P1 把/ 不错/P1 不错/P1 吧吧/ 吧吧/ 吧/ 42 | 第一次/ 买/ 冰/E 沙/E ,/ 43 | 口感/ 真/P1 不错/P1 !/ 44 | 喜欢/P1 45 | 师傅/E 人/P1 特别/P1 好/P1 !/ 46 | 送货/P1 超/P1 认真/P1 47 | 外/E 送/E 小哥/E 态度/P1 很/P1 好/P1 ,/ 48 | 很/P1 辛苦/P1 。/ 49 | 非常/P1 好/P1 !/ 50 | 送货/P1 非常/P1 快/P1 !/ 51 | 比美/E 团/E 和/ 饿/E 了/E 吗/E 好多/P1 了/P1 ,/ 52 | 以后/P2 就/P2 在/P2 这/P2 买/P2 了/P2 !/ 53 | 超/P1 快/P1 就/P1 送到/P1 了/P1 ,/ 54 | 喜欢/P1 百度/E 外卖/E ,/ 55 | 真心/P1 赞/P1 !/ 56 | 天气/P2 这么/P2 不好/P2 的/P2 情况/P2 下/P2 点/P2 外卖/P2 实在/P2 对不住/P2 外卖/E 小哥/E ,/ 57 | 辛苦/P1 啦/P1 58 | 好好好/P1 !/ 59 | 赞赞/P1 赞/P1 !/ 60 | 态度/P1 好/P1 速度/P1 快/P1 !/ 61 | 非常/P1 快/P1 ~/ 62 | 辛苦/P1 了/ ~/ 63 | 很/P1 好喝/P1 64 | 师傅/E 人/P1 很/P1 好/P1 ,/ 65 | 服务/P1 很/P1 好/P1 ,/ 66 | 送/P1 得/P1 快/P1 ~/ 67 | 好评/P1 68 | 大雾/ 霾/ 的/ ,/ 69 | 外/E 送/E 大哥/E 辛苦/P1 了/P1 !/ 70 | 天/P2 冷/P2 注意/P2 身体/P2 !/ 71 | 就是/ 配送/ 大哥/ 忘记/ 给/ 我/ 拿/ 吸管/ 了/ ⋯/ ⋯/ 72 | 其他/P1 都/P1 很/P1 棒/P1 。/ 73 | 很/P1 速度/P1 ,/ 74 | 赞/P1 ,/ 75 | 奶茶/E 也好/P1 喝/P1 。/ 76 | 师傅/E 很/P1 好/P1 ,/ 77 | 服务/P1 很/P1 热情/P1 !/ 78 | 派送员/E 非常/P1 好/P1 。/ ,/ 79 | 速度/P1 快/P1 ,/ 80 | 态度/E 棒棒/P1 的/P1 81 | 建议/ 再/ 出/ 款/ 浓/ 情/ 可可/ ,/ 82 | 与/ 岩岩/ 的/ 区别/ 一下/ 。/ ,/ 83 | 总体/ 很/ 满意/ 啦/ !/ 84 | 百度/E 我/P1 支持/P1 你/P1 哟/P1 !/ 85 | 雾/ 霾/ 天百/E 度/E 小哥/E 辛苦/P1 你/P1 啦/P1 !/ 86 | 百度/E 公司/E 一定/P2 要/P2 发给/P2 他们/P2 口罩/P2 哦/P2 ,/ 87 | 太/P1 不容/P1 易/P1 了/P1 !/ 88 | 送餐员/E 很/P1 热情/P1 ,/ 89 | 很/P1 好吃/P1 谢谢/P1 90 | 小哥/E 态度/P1 很/P1 好/P1 ,/ 91 | 两/E 种/E 饮料/E 都/P1 很/P1 好喝/P1 92 | 太/P1 赞/P1 了/P1 我家/P2 没/P2 电梯/P2 还/P2 能/P2 送/P2 这么/P1 快/P1 好感/P1 动/P1 93 | 送餐员/E 辛苦/P1 ,/ 94 | 奶茶/E 好喝/P1 …/ 95 | 师傅/E 服务/P1 很/P1 好/P1 ./ 96 | 速度/P1 特别快/P1 ./ 97 | 百度/E 骑士/E 很快/P1 就/P1 送到/P1 啦/ !/ 98 | 不错/P1 99 | 热饮/E 也/P2 有大/P2 杯/P2 就/P2 好了/P2 ,/ 100 | 中/ 杯/ 不够/ 喝/ 的/ 101 | -------------------------------------------------------------------------------- /fgom/common_lib.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import jieba 4 | 5 | __init_seg = False 6 | 7 | 8 | def __init(): 9 | user_dict_path = os.path.join(root_filepath, "f_seg/user_dict.txt") 10 | jieba.load_userdict(user_dict_path) 11 | jieba.add_word("快递", 10000) 12 | jieba.suggest_freq(("面", "太厚")) 13 | jieba.suggest_freq(("价格", "便宜")) 14 | jieba.suggest_freq(("服务", "周到")) 15 | jieba.suggest_freq(("速度", "快")) 16 | 17 | 18 | def cut(sentence): 19 | if not __init_seg: 20 | __init() 21 | return jieba.lcut(sentence) 22 | 23 | root_filepath = os.path.dirname(os.path.realpath(__file__)) 24 | miner_hmm_tag_num_filepath = os.path.normpath(os.path.join( 25 | root_filepath, "f_hmm/tag_num.txt")) 26 | miner_hmm_init_filepath = os.path.normpath(os.path.join( 27 | root_filepath, "f_hmm/init_prob.txt")) 28 | miner_hmm_emit_filepath = os.path.normpath(os.path.join( 29 | root_filepath, "f_hmm/emit_prob.txt")) 30 | miner_hmm_transition_filepath = os.path.normpath(os.path.join( 31 | root_filepath, "f_hmm/transition_prob.txt")) 32 | miner_hmm_train_corpus_filepath = os.path.normpath(os.path.join( 33 | root_filepath, "f_hmm/hmm_train_corpus.txt")) 34 | miner_hmm_user_add_corpus_filepath = os.path.normpath(os.path.join( 35 | root_filepath, "f_hmm/hmm_user_add_corpus.txt")) 36 | 37 | re_clause_findall = re.compile(r"([a-zA-Z0-9:\u4e00-\u9fa5]+[,。%、!!??,;~~.… ]*)") 38 | re_space_split = re.compile(r"\s+") 39 | re_han_match = re.compile('[\s\u4e00-\u9fa5]+') 40 | 41 | 42 | def final_tag_position(tags, tag, start): 43 | while start < len(tags): 44 | if tags[start] != tag: 45 | break 46 | start += 1 47 | return start - 1 48 | 49 | 50 | def write_(sentence, which): 51 | cuts = cut(sentence) 52 | output = "" 53 | 54 | if which == 1: 55 | tag = "E" 56 | elif which == 2: 57 | tag = "P1" 58 | elif which == 3: 59 | tag = "P2" 60 | elif which == 4: 61 | tag = "N1" 62 | elif which == 5: 63 | tag = "N2" 64 | elif which == 6: 65 | tag = "OT" 66 | else: 67 | return 68 | 69 | if which != 6: 70 | if len(cuts) == 1: 71 | output = "%s/%s" % (cuts[0], "I-" + tag) 72 | else: 73 | i = 0 74 | while True: 75 | if i == 0: 76 | output = "%s/%s\t" % (cuts[i], "B-" + tag) 77 | elif i + 1 == len(cuts): 78 | output += "%s/%s\t" % (cuts[i], "E-" + tag) 79 | break 80 | else: 81 | output += "%s/%s\t" % (cuts[i], "M-" + tag) 82 | i += 1 83 | else: 84 | for i in range(len(cuts)): 85 | output += "%s/%s\t" % (cuts[i], "OT") 86 | 87 | with open("f_hmm/hmm_user_add_corpus.txt", "a", encoding="utf-8") as f: 88 | f.write("%s\n" % output.strip()) 89 | 90 | 91 | def find_pos(clause, word, start=0): 92 | try: 93 | index = clause.index(word, start) 94 | except ValueError: 95 | return -1, -1 96 | return index, index + len(word) 97 | 98 | 99 | -------------------------------------------------------------------------------- /WaiMaiMiner/corpus.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | import re 4 | from fgom import common_lib 5 | from fgom.corpus import GetTaggedCorpus 6 | from fgom.corpus import BootstrappingMaster 7 | 8 | 9 | def get_tagged_corpus(): 10 | input_filepath = "f_corpus/tags/" 11 | output_filename = "f_corpus/hmm_train_corpus.txt" 12 | 13 | corpus = GetTaggedCorpus(input_filepath, output_filename) 14 | corpus.run() 15 | 16 | 17 | def bootstrapping(): 18 | bootstrapping_filename = "f_corpus/hmm_bootstrapping_corpus.txt" 19 | origin_tag_filename = "f_corpus/hmm_train_corpus.txt" 20 | 21 | bootstrap = BootstrappingMaster(bootstrapping_filename, origin_tag_filename) 22 | bootstrap.run() 23 | 24 | 25 | def deal1(): 26 | path = 'f_corpus/tags/' 27 | for file in os.listdir(path): 28 | with open(os.path.join(path, file), encoding='utf-8') as readf: 29 | lines = [line.strip() for line in readf.readlines()] 30 | 31 | with open(os.path.join(path, file), 'w', encoding='utf-8') as writef: 32 | runout = '' 33 | line_no = 0 34 | while line_no < len(lines): 35 | if lines[line_no] == '' and runout: 36 | writef.write("%s\n" % runout.strip()) 37 | runout = '' 38 | 39 | elif lines[line_no]: 40 | runout += "%s\t" % lines[line_no] 41 | 42 | line_no += 1 43 | 44 | 45 | def deal2(): 46 | default = '' 47 | path = 'f_corpus/tags/' 48 | re_chr = re.compile('[a-zA-Z0-9:\u4e00-\u9fa5]') 49 | 50 | for file in os.listdir(path): 51 | # get all lines 52 | with open(os.path.join(path, file), encoding="utf-8") as readf: 53 | lines = [line.strip() for line in readf.readlines()] 54 | 55 | with open(os.path.join(path, file), 'w', encoding="utf-8") as writef: 56 | for line in lines: 57 | splits = common_lib.re_space_split.split(line.strip()) 58 | words, tags = [], [] 59 | for a_split in splits: 60 | if "/" in a_split: 61 | try: 62 | word, tag = a_split.split("/") 63 | except ValueError: 64 | raise ValueError("Tag wrong! System cannot recognize it.%s" % writef.name) 65 | words.append(word) 66 | tags.append(tag.upper()) 67 | i = 0 68 | punc = False 69 | runout = '' 70 | while i < len(words): 71 | if re_chr.match(words[i]) is None: 72 | runout += "%s/%s\t" % (words[i], tags[i]) 73 | punc = True 74 | 75 | elif punc: 76 | writef.write("%s\n" % runout.strip()) 77 | runout = "%s/%s\t" % (words[i], tags[i]) 78 | punc = False 79 | 80 | else: 81 | runout += "%s/%s\t" % (words[i], tags[i]) 82 | 83 | i += 1 84 | 85 | if runout: 86 | writef.write("%s\n" % runout.strip()) 87 | 88 | 89 | if __name__ == "__main__": 90 | pass 91 | # get_tagged_corpus() 92 | # bootstrapping() 93 | # deal1() 94 | # deal2() 95 | 96 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-0.txt: -------------------------------------------------------------------------------- 1 | 菜品/E 2 | 质量好/P1 ,/ 3 | 味道/E 好/P1 ,/ 4 | 就是/ 百度/ 的/ 问题/ ,/ 5 | 总是/ 用/ 运力/ 原因/ 来/ 解释/ ,/ 6 | 我/ 也/ 不懂/ 这是/ 什么/ 原因/ ,/ 7 | 晚/N2 了/N2 三个/N2 小时/N2 呵呵/ 厉害/ 吧/ !/ 8 | 反正/ 订/N2 了/N2 就/N2 退/N2 不了/N2 ,/ 9 | 只能/N2 干/N2 等/N2 …/ …/ 10 | 分量/E 还/P1 可以/P1 …/ …/ 11 | 就是/ 有点/N2 没/N2 特色/N2 …/ …/ 12 | 下回/N2 不吃/N2 啦/N2 13 | 没什么/N2 味道/N2 ,/ 14 | 送来/N2 的/N2 晚/N2 ,/ 15 | 凉/N1 了/N1 16 | 送餐/E 送/N1 错/N1 ,/ 17 | 还/ 狡辩/N1 ,/ 18 | 不/N2 给/N2 补偿/N2 ,/ 19 | 送餐/E 时间/E 3/N2 个/N2 小时/N2 ,/ 20 | 百度/E 送餐员/E 更是/ 素质/N1 卑劣/N1 ,/ 21 | 额外/N2 还要/N2 加收/N2 17/N2 元/N2 的/N2 外/N2 送/N2 费/N2 。/ 22 | 百度/E 客服/E 也/ 没用/N1 ,/ 23 | 也/ 没有/N2 解决/N2 !/ 24 | 完全/N2 不值/N2 得/N2 信任/N2 ,/ 25 | 出尔反尔/N2 26 | 最差/N2 餐厅/N2 ,/ 27 | 没有/ 之一/ 28 | 感觉/ 不/N1 太/N1 好吃/N1 ,/ 29 | 价格/E 贵/N1 。/ 30 | 但是/ 百度/E 外卖/E 的/E 送餐/E 人员/E 态度/E 很/P1 好/P1 !/ 31 | 没/N2 发票/N2 ,/ 32 | 乱收费/N2 ,/ 33 | 订单/N2 没/N2 到/N2 就/N2 被/N2 完成/N2 了/N2 34 | 量/E 很大/P1 ,/ 35 | 但是/ 味道/E 真的/N1 一般/N1 。/ 36 | 等/N2 了/N2 一个/N2 多/N2 小时/N2 才/N2 送到/N2 ,/ 37 | 达到/ 了/ 超时/ 赔付/ 的/ 时间/ ,/ 38 | 感觉/ 百度/E 超时/E 赔付/E 就是/N1 个/N1 摆设/N1 39 | 头一/ 天/ 看/ 同事/ 点/ 的/ 三/ 份/ 菜/ 就/ 一大/ 盆/ ,/ 40 | 今天/ 点/N2 了/N2 四/N2 份/N2 菜/N2 才/N2 一小/N2 碗/N2 …/ …/ 41 | 差/N2 太/N2 大/N2 吧/N2 ,/ 42 | 辣椒/E 花椒/E 太/N1 多/N1 ,/ 43 | 非常/N1 油腻/N1 …/ …/ 44 | 点/ 了/ 200/ 多/ 块/ 吧/ ,/ 45 | 整/ 份/ 鱿鱼/E 卷/E 只有/N2 3/N2 个/N2 ,/ 46 | 土豆片/E 没/N2 见到/N2 ,/ 47 | 丝瓜/E 没/N2 见到/N2 ,/ 48 | 总之/ 整/ 份/ 比/N2 平时/N2 半/N2 份/N2 还/N2 少/N2 ,/ 49 | 不/ 建议/ 一次/ 点/ 很多/ ,/ 50 | 三种/ 菜品/ 和/ 十几/ 种菜/ 品/ 都/ 是/ 同/ 规格/ 的/ 打包/E 盒/E ,/ 51 | 不会/N2 再/N2 点/N2 了/N2 。/ 52 | 特别/ 写/ 了/ 酱油/E 炒饭/E 不/ 加/ 蛋/ 了/ ,/ 53 | 结果/N2 还是/N2 加/N2 蛋/N2 了/N2 54 | 每次/ 叮嘱/ 别/ 放/ 姜/E ,/ 55 | 回回/N2 都/N2 不当/N2 个/N2 事/N2 56 | 饭菜/E 量/E 很少/N1 ,/ 57 | 价位/E 偏/N1 高/N1 ,/ 58 | 关键/ 是/ 不能/N2 及时/N2 开发/N2 票/N2 ,/ 59 | 让/N2 人/N2 很/N2 无语/N2 60 | 明明/ 点/ 的/ 是/ 土豆/E 红烧肉/E 盖饭/E 送来/ 的/ 却是/ 土豆/E 牛肉/E 盖饭/E ,/ 61 | 是/ 店家/E 太/N1 忙/N1 还是/ 认/N2 不清/N2 字/N2 啊/ !/ 62 | 两个/ 盖饭/E 也/ 不是/N2 一个/N2 价格/N2 ,/ 63 | 多收/N2 了/N2 我/N2 4/N2 元钱/N2 。/ 64 | 不好/N1 吃/N1 ,/ 65 | 不像/N2 厨师/N2 做/N2 的/N2 ,/ 66 | 连家/N2 常/N2 菜/N2 不如/N2 67 | 炒菜/N2 都/N2 不/N2 放/N2 盐/N2 的/N2 ?/ 68 | 咖喱/E 炒饭/E 没/N2 吃/N2 就/N2 扔/N2 了/N2 !/ 69 | 太/N2 失望/N2 ,/ 70 | 差/N1 71 | 完全/N2 送/N2 错/N2 ,/ 72 | 没有/ 一个/ 菜/ 是/ 一样/ 的/ ,/ 73 | 我/ 也/ 真是/ 服/ 了/ 。/ 74 | 送餐员/E 在/N2 还/N2 没有/N2 送到/N2 的/N2 情况/N2 下/N2 就/N2 确认/N2 完成/N2 ,/ 75 | 这/ 都/ 是/ 怎么/ 找/ 的/ 人/ 啊/ 76 | 送餐/E 太/N1 慢/N1 ,/ 77 | 每次/N2 都/N2 超时/N2 ,/ 78 | 商家/N2 都/N2 在/N2 催促/N2 79 | 肉/E 臭/N1 了/N1 ,/ 80 | 态度/E 还/ 十分/N1 恶劣/N1 ,/ 81 | 必须/N2 差/N2 评/N2 82 | 肉/E 臭/N1 了/N1 ,/ 83 | 态度/E 还/ 十分/N1 恶劣/N1 ,/ 84 | 不/ 处理/ ,/ 85 | 不要/N2 再/N2 定/N2 这家/N2 了/N2 86 | 价格/E 太/N1 高/N1 ,/ 87 | 菜/E 量/E 太/N1 少/N1 88 | 1/ ./ 89 | 菜/E 量/E 比/N2 以往/N2 少/N2 太/N2 多/N2 了/N2 !/ !/ !/ ,/ 90 | 2/ ./ 91 | 发票/E 少/N2 开/N2 十几/N2 块钱/N2 。/ ,/ 92 | 真/N1 差劲/N1 ,/ 93 | 以后/N2 不定/N2 这家/N2 了/N2 !/ 94 | 餐厅/E 不/N2 给/N2 送餐/N2 ,/ 95 | 付/N2 完/N2 款/N2 了/N2 告诉/N2 没/N2 看见/N2 ,/ 96 | 再说/ 不/N2 认识/N2 地址/N2 ,/ 97 | 明明/ 过/ 马路/ 就/ 到/ ,/ 98 | 协商/N2 后/N2 还是/N2 不/N2 给/N2 送/N2 ,/ 99 | 服务/E 差/N1 ,/ 100 | 最后/ 是/ 百度/E 物流/E 送/ 的/ 餐/ 101 | 等/N2 了/N2 2/N2 个/N2 小时/N2 ,/ 102 | 送餐员/E 找不/N2 到/N2 餐厅/N2 ,/ 103 | 菜/E 等/N2 得/N2 都/N2 凉/N2 了/N2 。/ 104 | 希望/N2 改进/N2 。/ 105 | 差一/N2 个/N2 菜/N2 没/N2 送/N2 106 | 点/ 了/ 两/ 份/ 米饭/E 放在/ 两个/ 餐盒/E 里/ ,/ 107 | 但/ 都/ 是/ 装/N2 了不/N2 到/N2 一半/N2 ,/ 108 | 我/ 点/ 的/ 锅/E 仔/E 鱼/E 籽/E 豆腐/E ,/ 109 | 不是/ 盖饭/E !/ !/ 110 | 菜/E 量/E 比/N2 之前/N2 的/N2 少/N2 太/N2 多/N2 了/N2 ,/ 111 | 不知/ 道/ 怎么/ 是/ 换/ 厨子/E 了/ 还是/ 换/ 老板/E 了/ ,/ 112 | 比/N2 第一次/N2 点/N2 的/N2 差/N2 太/N2 多/N2 了/N2 113 | 送餐/E 快点/N2 就/N2 更好/N2 了/N2 114 | 等/N2 了/N2 一个/N2 多/N2 小时/N2 ,/ 115 | 饮料/E 盖子/E 都/ 破/N1 了/N1 116 | 非常/N1 慢/N1 ,/ 117 | 其中/ 催/N2 单/N2 也/N2 没/N1 人理/N1 会/N1 118 | 原味/E 奶茶/E 没/N2 加/N2 椰果/N2 ,/ 119 | 而且/ 上面/N2 的/N2 封/N2 模/N2 破/N2 了/N2 120 | 点/ 的/ 岩盐/E 芝士/E 可可/E 和/ 奥利/E 奥/E 奶茶/E ,/ 121 | 送来/ 的/ 两个/ 全/N2 错/N2 了/N2 !/ 122 | 没/N1 给/N1 吸管/N1 ,/ 123 | 怎么/ 喝/ 奶茶/E 124 | 为什么/ 不/N2 给/N2 管/N2 儿/N2 ?/ ?/ ?/ ?/ 125 | 撕开/ 纸/ 喝/ ?/ ?/ ?/ ?/ 126 | 包装/E 太/N1 差/N1 。/ 127 | 全/N2 洒/N2 了/N2 。/ 128 | 送到/N2 只/N2 剩/N2 四分/N2 之一/N2 不到/N2 。/ 129 | 我要/N2 投诉/N2 。/ 130 | 奶茶/E 里/ 有/N2 虫子/N2 131 | 太/N1 差/N1 了/N1 ,/ 132 | 曲奇/E 奶茶/E 味道/E 很/N1 怪/N1 ,/ 133 | 像/N2 粉/N2 泡/N2 的/N2 ,/ 134 | 大满贯/N2 根本/N2 没有/N2 几/N2 粒/N2 东西/N2 ,/ 135 | 珍珠/E 奶茶/E 也/ 不好/N1 喝/N1 。/ 136 | 一杯/N2 送来/N2 都/N2 漏/N2 了/N2 137 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-8.txt: -------------------------------------------------------------------------------- 1 | 嗯/ ,/ 2 | 送餐/ 很/ 及时/ !/ 3 | 菜/E 明显/N2 是/N2 剩菜/E ,/ 4 | 跟/N2 之前/N2 买/N2 的/N2 完全/N2 不一/N2 样/N2 5 | 送餐/E 太/ 慢/N1 了/ ,/ 6 | 我/E 十二点/N2 点/N2 的/N2 餐/E 两点/N2 才/N2 到/N2 ,/ 7 | 没/N2 一样/E 满意/N2 的/N2 8 | 太/N2 慢/N2 ,/ 9 | 而且/N2 不好/N2 吃/N2 ,/ 10 | 只是/N2 辛苦/N2 外卖/E 小哥/E 了/N2 11 | 非常/N1 慢/N1 ,/ 12 | 一分/N2 钟/N2 接/N2 单/N2 ,/ 13 | 两个/N2 小时送/N2 到/N2 。/ 14 | 商家/E 电话/E 一直/ 关机/N2 ,/ 15 | 这是/N2 对/ 顾客/E 的/ 不/N2 尊重/N2 ,/ 16 | 因为/ 天气/ 恶劣/ 送/ 不了/ 就/ 不要/ 接/ 单/E ,/ 17 | 或者/ 提前/ 打电话/ 告知/ 具体/ 多长/ 时间/ 送到/ 也/ 行/ ,/ 18 | 不能/N2 既/N2 不/N2 告知/N2 ,/ 19 | 还/N2 接/N2 单/N2 还/N2 关机/N2 ,/ 20 | 订/N1 外卖/E 以来N1/ 最差/N1 的/N2 体验/N2 ,/ 21 | 卷饼/ 也/ 很难/N2 吃/N2 ,/ 22 | 皮/E 厚/N2 油腻/N2 。/ 23 | 肘子/E 的/ 还/ 不错/ ,/ 24 | 送餐/E 太/N1 慢/N1 ,/ 25 | 到/ 了/ 后/ 粥/E 凉/N2 的/ 彻底/N2 ,/ 26 | 还/N2 不上/N2 门/N2 ,/ 27 | 要/ 下楼/N2 自取/N2 28 | 又/N1 慢/N1 又/N1 难吃/N1 29 | 等/N2 了/ 2/N2 个/N2 半/N2 小时/N2 这/ 也就/ 罢了/ ,/ 30 | 想/ 取消/N2 订单/E 的/ 时候/ 商家/E 竟然/ 还/ 关机/N2 。/ 31 | 派送/N2 的/ 大叔/E 冒雨/ 送来/ 我/ 也/ 是/ 觉得/ 很/ 辛苦/ ,/ 32 | 据说/ 派送/ 大叔/ 不是/ 商家/E 自己的/ 人/ ,/ 33 | 我/ 看/ 他/ 的/ app/ 上/ 显示/ 13/ :/ 24/ 接到/ 商家/ 发出/ 的/ 我的/ 单子/ ,/ 34 | 可是/ ,/ 35 | 我/ 11/ 点/ 19/ 下单/ 的/ 啊/ !/ 36 | 如果/ 以上/ 我/ 说/ 的/ 这些/N2 都/N2 不/N2 叫/N2 事/N2 的话/N2 ,/ 37 | 那/ 我/ 收到/ 的/ 鸡腿/E 肉/E 卷/E 里/ 为什么/ 是/ 猪肉/E 的/ ?/ 38 | 呵呵/N2 嗒/N2 ,/ 39 | 订餐/E 受/ 99/ 点/ 打击/ ,/ 40 | 再也/N2 不来/N2 了/N2 41 | 我/E 很少/ 评论/ 外卖/E ,/ 42 | 但是/ 这个/ 我/ 真的/N2 要说/N2 一/N2 说/N2 ,/ !/ ,/ 43 | 十点/N2 多/ 订/ 的/ 我/ 外卖/ ,/ 44 | 卖家/ 一分/ 钟/ 就/ 接/ 单/ 了/ ,/ 45 | 然后/ 过/ 了/N2 一个半/N2 小时/N2 还/N2 多/N2 我/N2 才/N2 收到/N2 外卖/N2 !/ !/ 46 | 收到/N2 的/N2 时候/N2 粥/E 已经/N2 是/N2 凉/N2 的/N2 ,/ 47 | 锡纸/E 包/N2 着/N2 饼/N2 ,/ 48 | 锡纸/N2 是/N2 热/N2 的/N2 ,/ 49 | 我/ 还/ 想/ 还好/ 还/N2 能/N2 吃/N2 ,/ 50 | 可是/ 打开/ 后/ 饼/N2 已经/N2 凉/N2 了/N2 ,/ 51 | 油/E 也/ 凝固/ 了/ ,/ 52 | 饼/E 也/ 因为/ 凉/ 了/ 变/ 硬/ !/ !/ !/ 53 | 106/N2 分钟/N2 才/N2 送达/N2 ,/ 54 | 送来/ 的/ 还是/ 凉/ 的/ ,/ 55 | 卖家/E 要是/ 你你/ 能/ 满意/ 吗/ !/ !/ !/ 56 | 皮/E 太/ 厚/ ,/ 57 | 不/N2 喜欢/N2 58 | 等/N2 了/N2 近/N2 两个/N2 小时/N2 59 | 虽然/N1 送/E 晚/N1 了/N1 ,/ 60 | 但是/ 商家/E 的/ 太/ 度/ 还是/ 可以/ 的/ 61 | 送餐/E 特别/N1 特/N1 的/N1 慢/N1 !/ 62 | 等到/N2 快/N2 8/N2 点/N2 ,/ 63 | 南瓜/E 粥/E 是/ 凉/N2 的/ ,/ 64 | 卷饼/E 也/ 是/ 凉/N2 的/ !/ 65 | 配送/E 竟然/N2 只/N2 送到/ 1/ 层/ ,/ 66 | 什么/ 服务/E 。/ 。/ 。/ 67 | 太/N1 差/N1 了/N1 ,/ 68 | 以后/N2 不会/N2 再/N2 点/N2 了/N2 69 | 坦白/ 说/ 没什么/N2 味道/N2 ,/ 70 | 就是/N2 肉/E 和/ 饼/E 71 | 送/E 的/N1 有点/N1 慢/N1 ,/ 72 | 味道/E 很/P2 好/P2 !/ 73 | 味道/E 很/N2 不好/N2 ,/ 74 | 都/N2 凉/N2 了/N2 ,/ 75 | 饼/E 都/ 没有/N2 熟/N2 ,/ 76 | 肉/E 也/ 没有/ 味道/E ,/ 77 | 跟/ 在/ 店里/E 吃/ 的/ 差/N2 远/N2 了/N2 78 | 皮蛋/E 瘦肉/E 粥/E 和/ 汇源/E 果汁/E 没/N2 送/N2 ,/ 79 | 投诉/N2 了/N2 也/N2 没用/N2 哈/ ,/ 80 | 然后/N2 让/N2 我/N2 跑/N2 18/N2 层/N2 楼下/N2 去/N2 拿/N2 外卖/E ,/ 81 | 是/ 你/N2 送还/N2 是/N2 我/N2 送/N2 ?/ 82 | 要不/ 剩下/ 的/ 我/N2 都/N2 帮/N2 你/N2 送/N2 了/N2 吧/N2 !/ 83 | 完全/N2 不值/N2 这个/N2 价/N2 ,/ 84 | 一个/N2 素菜/E 卷饼/E 15/ ,/ 85 | 里面/N2 就/N2 两/N2 根/N2 土豆/E 几/N2 块/N2 洋葱/E ,/ 86 | 饼/E 倒是/ 挺/ 大/ 。/ ,/ 87 | 再也/N2 不来/N2 了/N2 88 | 宇宙/N1 最/N1 慢/N1 的/N1 卷饼/E 89 | 有点/N2 咸/N2 ,/ 90 | 包装/E 好/N2 于/N2 食物/E 91 | 下楼/N2 自己/E 取/N2 ,/ 92 | 每次/N2 都/N2 是/N2 自己/ 去/N2 拿/N2 ,/ 93 | 我要/N2 是/N2 有/N2 那时/E 间/E 就/N2 不/N2 叫/N2 外卖/E 了/N2 94 | 买/ 了/ 7/ 次/ ,/ 95 | 我/ 自己/ 下楼/N2 取/N2 了/N2 7/N2 次/N2 ,/ 96 | 而且/ 配送/E 员/E 态度/E 一般/N2 ./ ./ ./ 97 | 不是/ 来不及/ 了/ 就是/ 电梯/E 下不/ 去/ !/ 98 | 请问/ 电梯/E 下不/N2 去/N2 我/E 怎么/N2 下去/N2 ?/ 99 | 盖饭/E 不好/ 吃/ 。/ 100 | 还/N2 等/N2 的/N2 海枯石烂/N2 了/N2 。/ 101 | 不点/N2 了/N2 102 | 送餐/E 打电话/E 跟/N2 要/N2 打架/N2 一样/N2 ,/ 103 | 我/E 还/ 挺/N2 客气/N2 的/N2 说/ 放在/ 门卫/E 那儿/ 就/ 好/ ,/ 104 | 话/N2 还/N2 没/N2 说完/N2 就/N2 给/N2 挂/N2 了/N2 电话/E ,/ 105 | 够/N2 可以/N2 的/N2 106 | 粥/E 还/N2 能/N2 吃/N2 ,/ 107 | 卷饼/E 不好/N2 吃/N2 108 | 不/N2 送到/N2 ,/ 109 | 下楼/N2 去取/N2 110 | 肉/E 少/N2 菜/E 多/N2 ,/ 111 | 菜/E 好像/ 不/N2 太/N2 新鲜/N2 ,/ 112 | 皮蛋/E 瘦肉/E 粥/E 还/N2 可以/N2 便宜/N2 点/N2 ,/ 113 | 送餐/E 还/P2 挺/P2 快/P2 114 | 送/E 的/N1 比较/N1 慢/N1 ,/ 115 | 味道/E 不错/P2 ,/ 116 | 就是/N2 凉/N2 了/N2 !/ 117 | 送/E 得/N1 太/N1 慢/N1 了/N1 ,/ 118 | 险些/N2 饿死/N2 …/ 119 | 垃圾/N2 食品/E 吃/N2 完/N2 中毒/N2 啦/N2 !/ !/ !/ !/ !/ !/ 120 | 味道/E 不好/N2 ,/ 121 | 饮料/E 很难/N1 喝/N1 122 | 就/N2 这/N2 还/N2 想要/N2 意见/N2 ?/ 123 | 找/ 客服/E ,/ 124 | 你/ 没/N2 送到/N2 就/N2 没/N2 送到/N2 ,/ 125 | 找/N2 毛/N2 的/N2 理由/N2 了/N2 ,/ 126 | 我/E 饿/ 了/ 2/ 个/ 小时/ ,/ 127 | 对/ 你/ 态度/E 能/ 好/ ?/ 128 | 直接/ 差/N1 评/N1 ,/ 129 | 以后/N2 不来/N2 买/N2 了/N2 130 | 味道/E 不怎么/ 玩/ 131 | 根本/N2 就/N2 不是/N2 肘子/E 肉/E 132 | 最后一/N2 次/N2 买/N2 你家/E 东西/E 。/ 133 | 味道/E 巨/N1 难吃/N1 ,/ 134 | 肉/E 太/ 肥/N2 了/N2 ,/ 135 | 吃不/N2 下去/N2 136 | 送/E 的/N1 太/N1 慢/N1 了/N1 !/ !/ !/ !/ 137 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-6.txt: -------------------------------------------------------------------------------- 1 | 这个/N1 2 | 很难/N1 吃/N1 3 | 差/N1 评/N1 ,/ 4 | 粥/E 全/N2 撒/N2 了/N2 ,/ 5 | 而且/N2 还/N2 弄/N2 得/N2 卷饼/E 没法/N2 拿/N2 6 | 觉得/N2 只要/N2 在/N2 百度/E 外卖/E 订餐/E ,/ 7 | 就/N1 会/N1 很/N1 慢/N1 。/ 8 | 从未/N2 准时/N2 过/N2 9 | 选/N2 的/N2 送达/N2 时间/E :/ 10 | 11/N2 :/ 45/N2 ,/ 11 | 结果/N2 10/N2 点/N2 58/N2 就/N2 给/N2 我/E 送来/N2 了/N2 。/ 12 | 那/N2 我/E 选择/N2 送达/E 时间/E 还有/N2 什么/N2 意义/N2 。/ 13 | 饭/E 还是/P2 一如既往/P2 的/P2 好吃/P2 ,/ 14 | 干净/P2 卫生/P2 15 | 点/N2 的/N2 肘子/E 卷/E 送/N2 的/N2 土豆/E 卷/N2 ,/ 16 | 打电话/E 说/N2 再/N2 送/N2 过来/N2 也/N2 没/N2 送/N2 。/ 17 | 尖椒/E 土豆/E 卷/E ,/ 18 | 全/N2 是/N2 土豆丝/E ,/ 19 | 大概/N2 有/N2 六七/N2 根/N2 尖椒/E 丝/E ,/ 20 | 上次/E 吃/N2 完/N2 没事/N2 ,/ 21 | 这次/E 吃/N2 完/N2 拉肚子/N2 了/N2 ,/ 22 | 不知/N2 道/N2 是不是/N2 素/N2 拌饭/E 的/N2 问题/N2 。/ 23 | 真真/ 墨迹/N1 ,/ 24 | 服务/E 态度/E 太/E 查/N1 了/N2 25 | 送餐员/E 态度/E 很/N1 不好/N1 26 | 送餐员/E 态度/E 特别/N1 差/N1 27 | 十一/N2 点/N2 半/N2 下单/E ,/ 28 | 显示/N2 十二点/N2 四十/N2 送达/N2 ,/ 29 | 结果/N2 一点半/N2 才/N2 送到/N2 !/ !/ 30 | 送/E 了/N2 快/N2 2/N2 个/N2 小时/N2 。/ 。/ 。/ 31 | 饼/E 一般/N2 ,/ 32 | 肉/E 还/N2 行/N2 ,/ 33 | 辣/E 白菜/E 也/N2 一般/N2 34 | 我/E 10/N2 :/ 33/N2 下单/N2 完成/N2 ,/ 35 | 送达/E 时间/E 是/N2 13/N2 :/ 22/N2 !/ 36 | 差/N2 11/N2 分钟/E 就/N2 三个/N2 小时/N2 !/ 37 | 宇宙速度/N2 !/ 38 | 1/ ./ 39 | 等/N2 1/N2 小时/N2 都/N2 没/N2 送/N2 出/N2 ,/ 40 | 2/ ./ 41 | 东西/E 食/N2 之/N2 无味/N2 ,/ 42 | 弃之可惜/ 。/ 43 | 都/N2 不看/N2 备注/E ,/ 44 | 说好/N2 的/N2 辣椒酱/E 也/N2 没有/N2 放/N2 ,/ 45 | 土豆丝/E 没/N2 放/N2 盐/N2 46 | 肘子/E 卷/E 不好/N1 吃/N2 ,/ 47 | 与/ 实物/E 也/N2 不一/N2 样/N2 48 | 就/N2 在/N2 路/E 对面/N2 ,/ 49 | 送/N2 了/N2 一个/N2 快/N2 一个半/N2 小时/N2 ,/ 50 | 差/N1 评/N1 51 | 虽然/N2 我/E 定/N2 的/N2 很/N2 便宜/N2 ,/ 52 | 但是/N2 能不/N2 能/N2 菜/E 多点/N2 ,/ 53 | 90/N2 的/N2 米饭/E ,/ 54 | 10/N2 的/N2 菜/E ,/ 55 | 我/E 也/N2 是/N2 醉/N2 了/N2 。/ 56 | 点/N2 过好/N2 几次/N2 宇宙/E 卷饼/E 了/N2 ~/ 57 | 这次/E 送/E 的/N2 是/N2 最快/N2 的/ ,/ 58 | 本来/N2 很/N2 开/N2 森/N2 ,/ 59 | 但是/N2 送餐/E 小哥/E 打电话/N2 那个/N2 态度/E ~/ 60 | 我/E 也/N2 是/N2 醉/N2 了/N2 61 | 送餐/E 太/N1 慢/N1 。/ 62 | 不是/N1 一般的/N1 慢/N1 。/ 63 | 11/N2 :/ 04/N2 下/N2 的/N2 单/E ,/ 64 | 最后/ 13/N2 :/N2 20/N2 才/N2 给/N2 送到/N2 !/ 65 | 客户端/E 催/N2 单/N2 三次/N2 没/N2 反应/N2 ,/ 66 | 打电话/N2 给/N2 商家/N2 打/N2 了/N2 两次/N2 ,/ 67 | 光/N2 送餐员/E (/ 68 | 177xxxx0056/ )/ 69 | 打电话/N2 就/N2 打/N2 了/N2 三次/N2 ,/ 70 | 最/N2 开始/N2 地点/E 还给/N2 送/E 错/N2 了/N2 !/ 71 | 我/E 又/N2 告诉/N2 他/E 了/N2 地点/E 在/N2 哪/N2 最后/N2 才/N2 给/N2 送到/N2 。/ 72 | 这时候/N2 给/N2 送来/N2 了/N2 都/N2 开始/N2 上班/N2 了/N2 ,/ 73 | 没/N2 时间/N2 吃饭N2/ 。/ 74 | 强烈/N2 不满/N2 !/ !/ !/ 75 | 看/N2 在/N2 送餐员/E 岁数/N2 不大/N2 ,/ 76 | 一直/N2 在/N2 说/N2 对不起/N2 的/N2 份/N2 上/N2 ,/ 77 | 我/E 还是/N2 把/N2 中间/N2 几/N2 位数/E 字/E 隐藏/N2 了/N2 。/ 78 | 上次/E 到/N2 了/N2 打电话/N2 ,/ 79 | 这次/N2 送到/N2 了不/N2 打电话/N2 ,/ 80 | 害/N1 我一/E 直/N2 等/N2 !/ !/ 81 | 肘子/E 的/N2 那个/N2 吃后/N2 拉肚子/N2 了/N2 ,/ 82 | 孜然/E 肌肉/E 的/P2 还/P2 不错/P2 83 | 送餐/E 少/N2 送/N2 了/N2 粥/E 隔/N2 了/N2 俩/N2 小时/N2 给/N2 我/E 打电话/N2 说/N2 再/N2 送来/N2 84 | 这/N1 送/E 的/N1 也/N1 太/N1 慢/N1 了/N1 ,/ 85 | 来/N2 了之/N2 后/N2 基本/N2 都N2/ 是/N2 凉/N2 的/N2 ,/ 86 | 学校/E 离/N2 着/N2 五道/E 口/E 几百/N2 米/N2 ,/ 87 | 还/N1 这么/N1 慢/N1 ,/ 88 | 1/N2 个/N2 多/N2 小时/N2 啊/N2 !/ 89 | 感觉/N2 不会/N2 再/N2 爱/N2 了/N2 。/ 90 | 再也/N2 不要/N2 点/N2 这家/E 店/E 了/N2 。/ 。/ 91 | 点/N2 的/N2 粥/E 没有/N2 送到/N2 ,/ 92 | 但是/N2 把/N2 钱/E 拿走/N2 了/N2 ,/ 93 | 送餐员/E 说/N2 稍后/N2 给/N2 打电话/N2 解决/N2 ,/ 94 | 可是/N2 也/N2 没/N2 联系/N2 我/E ,/ 95 | 电话/E 也/N2 不/N2 接/N2 。/ 。/ 。/ 96 | 必须/N1 差/N1 评/N1 97 | 慢/N1 的/N1 不行/N1 ,/ 98 | 就是/N1 慢/N1 ,/ 99 | 绝对/N2 不/N2 黑/N2 ,/ 100 | 贼/N1 难吃/N1 ,/ 101 | 等/N2 了/N2 将近/N2 2/N2 小时/N2 ,/ 102 | 好吃/N2 也/N2 行/N2 啊/N2 103 | 一个/N2 字/E ,/ 104 | 慢/N1 105 | 这是/N2 从/N2 宇宙/E 送来/N2 的/N2 ,/ 106 | 快递/E 太/N1 慢/N1 ,/ 107 | 6/N2 点/N2 39/N2 下单/N2 ,/ 108 | 马上/N2 八点/N2 才/N2 到/N2 109 | 太/N1 他妈的/N1 慢/N1 了/N1 110 | 太/N1 TM/N1 慢/N1 了/N1 111 | 两个/N2 小时/N2 还/N2 不/N2 送/N2 过来/N2 ,/ 112 | 最后/N2 也/N2 不通/N2 知我/E 就/N2 不/N2 送/N2 了/N2 ,/ 113 | 没有/N2 碰见/N2 这么/N2 不负/N2 责任/N2 的/N2 商家/E 114 | 很/N1 慢/N1 ,/ 115 | 肉/E 不少/N2 ,/ 116 | 饼/E 不好/N2 吃/N2 117 | 等/N2 太久/N2 了/N2 ,/ 118 | 而且/N2 漏/N2 送/N2 了/N2 一/N2 瓶/N2 王老吉/E ~/ ~/ 119 | 一般/N2 ,/ 120 | 除了/N2 包装/E 好看/N2 真的/N2 没什么/N2 了/N2 121 | 送/E 的/P2 挺/P2 快/P2 ,/ 122 | 半/P2 小时/P2 吧/P2 就/P2 到/P2 了/P2 ,/ 123 | 但是/N2 味道/E 不/N2 太/N2 好吃/N2 124 | 偶尔/P2 吃一/P2 次/P2 还/P2 可以/P2 125 | 送/E 饭/E 速度/E 太/N1 慢/N1 126 | 差劲/N1 的/N1 很/N1 啊/N1 ,/ 127 | 少/N2 送/N2 不说/N2 ,/ ,/ 128 | 还/N2 强制/N2 消费/N2 。/ 。/ 。/ 129 | 想/N2 退款/N2 ,/ 130 | 很/N2 麻烦/N2 的/N2 131 | 第一次/ 在/ 百度/ 外卖/ 上/ 给/ 差/ 评/ 。/ 132 | 两个/ 小时/ 左右/ 才/ 送到/ 。/ 133 | 而且/ 不好/ 吃/ 。/ 134 | 一点/ 酱/ 汁/ 都/ 没有/ ,/ 135 | 鸡肉/ 还有/ 浓浓的/ 焦糊/ 味/ !/ 136 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-1.txt: -------------------------------------------------------------------------------- 1 | 第一次/ 2 | 送来/ ,/ 3 | 龙利/E 鱼/E 送/N2 错/N2 了/N2 ,/ 4 | 点/ 的/ 葱/E 香/E 的/E ,/ 5 | 送/ 成/ 酸/E 汤/E 的/E 了/ ,/ 6 | 给/ 饭店/E 打电话/ ,/ 7 | 那/ 女/ 的/ 没/N2 等/N2 说完/N2 就/N2 给/N2 我/N2 挂/N2 了/N2 ,/ 8 | 再/ 打/ 过去/ ,/ 9 | 说/ 做/ 完/ 让/ 我/ 去取/ ,/ 10 | 她/ 没事儿/ 吧/ ,/ 11 | 这种/ 人/ 赶紧/ 开/ 了/ 吧/ ,/ 12 | 留/N2 着/N2 是/N2 祸害/N2 13 | 之前/ 都/ 两/ 盒/ ,/ 14 | 这次/ 就/ 给/ 装/ 一/ 盒/ 。/ 15 | 还/ 不多/N1 ,/ 16 | 差/N1 评/N1 。/ 17 | 快递/E 小哥/E 辛苦/P1 18 | 恶心/N1 没/ rou/ 19 | 点/ 了/ 宽/E 粉/E ,/ 20 | 但是/ 没/ 放/ ,/ 21 | 点/ 的/ 饭/E 里面/ 没有/ 米饭/E ,/ 22 | 另外/ 加/ 了/ 六/ 块/ 23 | 菜品/E 很/N1 一般/N1 哦/ ,/ 24 | 只能/N2 凑合/N2 25 | 味道/E 非常/N1 一般/N1 ,/ ,/ ,/ ,/ 26 | 你/ 的/ 肉末/E 酸豆/E 角/E 里面/ 怎么/N2 没有/N2 一丁点儿/N2 肉/N2 ?/N2 ?/ 27 | 餐盒/E 好看/P1 ,/ 28 | 菜/E 量/E 也/ 多/P1 ,/ 29 | 但是/ 吃/N2 完/N2 后/N2 下午/N2 反胃/N2 ,/ 30 | 应该/N2 不会/N2 再/N2 订/N2 了/N2 31 | 严重/N2 怀疑/N2 食物/N2 的/N2 质量/N2 !/ 32 | 居然/N2 有/N2 烟头/N2 33 | 配送/E 竟然/N2 没/N2 经过/N2 我/N2 同意/N2 让/N2 别人/N2 代收/N2 了/N2 ,/ 34 | 我/ 不知/ 道/ ,/ 35 | 导致/ 我/ 收到/ 饭/ 比/N2 预定/N2 时间/N2 晚/N2 了/N2 一个/N2 多/N2 小时/N2 。/ 36 | 饭/E 的/E 味道/E 还/P1 可以/P1 ,/ 37 | 只是/ 凉/N1 了/N1 38 | 糟糕/N1 ,/ 39 | 继续/ 努力/ 吧/ 40 | 不好/N1 吃/N1 。/ 41 | 有点/ 甜/ 。/ 42 | 我要/ 的/ 是/ 排骨/E 饭/E ,/ 43 | 结果/ 送/ 的/ 是/ 鸡肉/E 饭/E 44 | 下雨天/ ,/ 45 | 配送/E 慢/N1 ,/ 46 | 可以/ 理解/ ,/ 47 | 商家/E 为什么/N2 不/N2 接/N2 电话/N2 !/ 48 | 送餐/N2 的/N2 没/N2 手机/N2 ,/ 49 | 米饭/N2 全/N2 是/N2 黑斑/N2 ,/ 50 | 也/ 不知/ 道/ 什么/ 东西/ 。/ 51 | 鸡翅/E 炸/N2 的/N2 跟/N2 碳/N2 是的/N2 ,/ 52 | 只/ 剩下/ 黄焖/E 鸡/E 可以/ 吃/ 了/ ,/ 53 | 以后/N2 再也/N2 不会/N2 点/N2 单/N2 ,/ 54 | 更/ 逗/ 的/ 点/N2 的/N2 百度/N2 外卖/N2 送来/N2 的/N2 却是/N2 饿/N2 了/N2 么/N2 ,/ 55 | 拼/ 单子/ 吗/ 。/ 56 | 晕/ 57 | 快递/E 很/P1 不错/P1 。/ 58 | 饭/E 没/N2 啥味/N2 道/N2 !/ !/ 59 | 太/N1 淡/N1 了/N1 !/ !/ 60 | 说好/ 的/ 是/ 鸡蛋/E ,/ 61 | 结果/ 送/ 过来/ 的/ 是/ 香肠/E !/ 62 | 而且/ 都/ 是/ 冷/N1 的/N1 !/ !/ !/ 63 | 严重/N1 差/N1 评/N1 ,/ 64 | 也就/ 1/ 公里/ 不到/ 的/ 距离/ ,/ 65 | 送/N2 了/N2 那么/N2 久/N2 。/ 。/ 。/ 66 | 第二次/ 订/ 这家/ 的/ 饭/ ,/ 67 | 但/ 明显/N2 和/N2 上次/N2 不一/N2 样/N2 。/ 68 | 上次/ 订/ 的/ 很/ 好吃/ ,/ 69 | 但/ 这次/ 像/N2 剩饭/N2 ,/ 70 | 包装/E 上/E 的/E 地址/E 也/N2 不对/N2 。/ 71 | 店里/ 送/N1 错/N1 了/N1 餐/E ,/ 72 | 给/ 店里/ 打电话/ ,/ 73 | 话/ 还/ 没有说/ 完/ ,/ 74 | 对方/ 就/ 挂断/ 了/ ,/ 75 | 特别/N1 没有/N1 礼貌/N1 ,/ 76 | 实在/N1 是/N1 差/N1 77 | 煎蛋/E ,/ 78 | 香肠/E 还/P1 行/P1 。/ 79 | 肥牛/E 太/N1 老/N1 !/ !/ 80 | 菜花/E 难吃/N1 !/ ,/ 81 | 最/ sb/ 的/ 可乐/E 是/N2 热/N2 的/N2 ,/ 82 | 一打/N2 开/N2 喷/N2 的/N2 到处/N2 都/N2 是/N2 !/ ,/ 83 | 盐/E 酥/E 鸡/E 上面/E 的/E 面/E 太/N1 厚/N1 ,/ 84 | 太/N1 硬/N1 !/ !/ 85 | 太/N1 难吃/N1 了/N1 。/ 86 | 大米/E 不好/N1 ,/ 87 | 蒸/N2 的/N2 也/N2 不好/N1 。/ 88 | 鸡/E 都/ 是/ 碎/E 的/E 。/ 89 | 送餐/E 太/N2 晚/N2 了/N2 ,/ 90 | 饿死/N2 !/ 91 | 饭/E 凉/N1 了/N1 ,/ 92 | 咋/N2 吃/N2 啊/N2 ?/N2 93 | 还是/ 本来/N2 就是/N2 剩饭/N2 ?/N2 94 | 满/E 减/E 竟然/ 是/ 页面/ 有/ ,/ 95 | 付款/ 时/ 没有/ 。/ 96 | 肥牛/E 还/P1 不错/P1 ,/ 97 | 黄焖/E 鸡/E 真/N1 差劲/N1 98 | 都/ 点/ 好几/ 次/ 了/ ,/ 99 | 这次/ 怎么/ 夹生/E 米/E ,/ 100 | 没法/N2 吃/N2 101 | 东西/E 跟/N2 图片/N2 完全/N2 不一/N2 样/N2 ,/ 102 | 鸡肉/E 全/N2 是/N2 汤/N2 ,/ 103 | 卤肉/E 也/ 没/N2 几/N2 块/N2 肉/N2 渣/N2 ,/ 104 | 全/N2 是/N2 大白菜/N2 ,/ 105 | 极/N1 差/N1 评/N1 ,/ 106 | 太/N1 坑/N1 爹/N1 了/N1 107 | 饭/E 都/N1 凉/N1 了/N1 -/ -/ 108 | 与/N2 实际/N2 不符/N2 109 | 配送/E 小哥/E 辛苦/P1 了/P1 ,/ 110 | 之所以/ 差/N1 评/N1 ,/ 111 | 是/ 因为/ 饭/N2 里/N2 居然/N2 有/N2 头发/N2 !/ !/ !/ 112 | 受不了/N2 !/N2 !/ !/ 113 | 鸡肉/E 荤/N2 死/N2 了/N2 !/ 114 | 难吃/N1 ,/ 115 | 太/N1 难吃/N1 了/N1 !/ 116 | 不是/N2 现/N2 做/N2 的/N2 没事/ ,/ 117 | 至少/ 您/ 也/ 热/ 一下/ 吧/ 。/ 118 | 快递/E 师傅/E 很/N1 好/N1 ,/ 119 | 可惜/ 饭菜/E 配/ 不上/ 师傅/ 的/ 速度/ ,/ 120 | 太/N1 难吃/N1 ,/ 121 | 油/N1 大/N1 ,/ 122 | 卖相/E 极/N1 差/N1 ,/ 123 | 味道/E 也/N1 差/N1 ,/ 124 | 绝不/N2 再/N2 吃/N2 。/ 125 | 香芹/E 牛肉/E 丝/E 就/ 跟/N2 凉菜/N2 似的/N2 ,/ 126 | 凉拌/E 莴笋/E 丝/E 喂/N2 猫/N2 呢/N2 感觉/ ,/ 127 | 也/ 太/N1 少/N1 了/N1 吧/ 128 | 鱼头/E 感觉/ 比/P2 以前/P2 多/P2 了/P2 ,/ 129 | 虾/E 感觉/ 有点/N1 不大/N1 新鲜/N1 。/ 130 | 吃/ 到/ 一半/ 发现/ 菜/N2 里/N2 有/N2 小强/N2 ,/ 131 | 简直/ 了/ 132 | 米饭/E 4/ 盒/ 。/ ,/ 133 | 为/ 神马/ 变成/ 2/ 盒/ 。/ ,/ 134 | 4/ 个人/ 怎么/ 吃/ 。/ ,/ 135 | 合/ 到/ 一起/ 也/ 不/ 先/ 问一/ 下/ 136 | 手/E 撕/E 包/E 菜/E 大半/N2 盒/N2 油/N2 ,/ 137 | 我/ 还/ 特意/ 写/ 了/ 少油/ 138 | 小炒/E 牛肉/E 那/ 几个/ 热门/E 的/E 菜/E 一开/P2 始/P2 做/P2 的/P2 特别/P2 好/P2 ,/ 139 | 赞/P2 过好/P2 几次/P2 ,/ 140 | 后来/ 就/ 越来越/N1 差/N1 ,/ 141 | 最近/ 的/ 两次/ 直接/ 上/ 猪肉/E 了/ ,/ 142 | 炒/ 包/ 菜/ 干/ 辣椒/ 生/N1 的/N1 ,/ 143 | 菜叶/E 是/ 烂/N1 的/N1 ,/ 144 | 拍照/ 给/ 客服/E ,/ 145 | 客服/E 说/ 炒菜/E 煮/N2 过头/N2 了/N2 ,/ 146 | 没错/ !/ 147 | 说/ 的/ 是/ 煮/ 这个/ 字/ !/ 148 | 而且/ 餐厅/E 电话/E 打/N2 不通/N2 ,/ 149 | 一路/N2 折腾/N2 。/ 150 | 稀烂/N2 的/N2 东西/N2 ,/ 151 | 我/ 吃饭/ 是/ 为什么/ ,/ 152 | 我/ 叫/ 外卖/ 是/ 为什么/ ,/ 153 | 以后/N2 都/N2 不会/N2 定/N2 了/N2 ,/ 154 | 艹/ 155 | 最/ 奇葩/ 的一/ 次/ ,/ 156 | 这/ 米饭/E 少/N2 到/N2 没法/N2 再/N2 少/N2 …/ 157 | 估计/ 成年人/ 能/ 吃/ 五/ 份/ 米饭/ ,/ 158 | 那么/ 大/ 的/ 盒子/ ,/ 159 | 米饭/E 放/N2 了/N2 不到/N2 六分/N2 之一/N2 …/ 160 | 难道/ 你家/ 的/ 米/E 很/ 贵/ 吗/ ?/ 161 | 真是/N2 日/N2 了/N2 狗/N2 了/N2 !/ 162 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-5.txt: -------------------------------------------------------------------------------- 1 | 能不/ 2 | 能不/ 要/ 一/ 份/ 餐/ 等/N2 3/N2 个/N2 小时/N2 ,/ 3 | 是/ 想/ 饿死/N1 顾客/E 吗/ 4 | 宇宙/N2 级/N2 蜗牛/N2 送餐/E 速度/E ,/ 5 | 共/N2 花/N2 2/N2 ./N2 6 | 5/N2 小时/E ,/ 7 | 并且/N2 还/N2 没/N2 到/N2 。/ 8 | 等到/N2 花都/N2 谢/N2 了/N2 ,/ 9 | 真心/N1 太/N1 慢/N1 了/N1 ,/ 10 | 希望/N2 以后/N2 能/N2 快点/N2 11 | 有点/N2 淡/N2 ,/ 12 | 送货/E 速度/E 胎/N1 慢/N1 了/N1 13 | 慢/N1 就/N1 一个/N1 字/E ,/ 14 | 最好/N2 提前/N2 两天/N2 点/N2 餐/E 。/ 15 | 当天/ 点/ 的/ 是不/ 要/ 奢望/ 能/ 当天/ 送达/ 的/ !/ 16 | 送餐/E 时间/E 慢/N1 得不/N1 得了/N1 ,/ 17 | 两个/ 小时/ 能/ 到/ 就/ 烧高香/ 吧/ 18 | 送餐/E 时间/E 远/N2 超/N2 1/N2 个/N2 小时/N2 ,/ 19 | 骗/N1 我/ 说/ 送餐员/E 在/ 路上/ 可是/ 2/ 个/ 小时/ 才/ 到/ 。/ 20 | 爬/N1 也/ 爬/N1 到/ 了/ 吧/ !/ 21 | 差/N1 评/ !/ 22 | 送餐/E 时间/E 乱/N1 写/ ,/ 23 | 一个/ 多/N2 小时/ 才/N2 送到/ 。/ 24 | 差劲/N1 25 | 送/ 的/ 超级/N1 慢/N1 而且/ 巨/N1 难吃/N1 !/ 26 | 我/E 了/N2 个/N2 去/N2 ,/ 27 | 只/ 给/ 我/ 送/ 了/ 个/ 肘子/ 卷/ ,/ 28 | 我的/ 两/ 碗/ 粥/ 根本/ 都/ 没做/ ,/ 29 | 我/ 交/ 得/ 还是/ 所有/ 的/ 钱/ ,/ 30 | 坑/N1 我/ 呢/ ?/ ,/ 31 | 我的/ 粥/ 呢/ ?/ ,/ 32 | 打电话/N2 也/N2 没/N2 人/ 接/N2 ,/ 33 | 什么/N1 玩意/N1 啊/N1 34 | 没/ 给/ 我/ 送/ ,/ 35 | 还/ 成交/ 。/ 36 | 气死/N1 我/E 了/ !/ 37 | 不是/ 一般的/ 慢/N1 38 | 速度/E 慢/N1 ,/ 39 | 卷饼/E 凉/N1 ,/ 40 | 太/ 难吃/N1 41 | 送/E 菜/E 太/N1 慢/N1 。/ 42 | 等/N2 了/N2 快/N2 仨/N2 小时/N2 ,/ 43 | 电话/ 打/ 了/ 好几/ 个/ 。/ 44 | 饿/N1 的/ 不行/N1 了/ 。/ 45 | 以后/ 打死/N1 也/ 不/ 订/ 这家/ 的/ 了/N1 。/ 46 | 速度E/ 真是/N1 超级/N1 慢/N1 ,/ 47 | 等/N2 了/N2 一个/N2 多/N2 小时/N2 ,/ 48 | 送/N2 了/N2 一个半/N2 小时/N2 才/N2 送到/N2 ,/ 49 | 饼/E 还是/N1 凉/N1 的/ ,/ 50 | 差劲/N1 透/N1 了/ 51 | 咸/N1 死/N1 我/E 啦/ …/ …/ 52 | 晚/N2 了/N2 一个半/N2 小时/N2 ,/ 53 | 而且/N2 都/N2 凉/N2 了/N2 54 | 特别/N1 慢/N1 ,/ 55 | 等/N2 了/N2 一个半/N2 小时/N2 56 | 点/ 了/ 三/ 样/ 东西/ ,/ 57 | 还/N2 少/N2 送/N2 一样/N2 58 | 非常/N1 非常/N1 慢/N1 !/ 59 | 不/N2 推荐/N2 !/ 60 | 俩/N2 小时/N2 。/ ,/ 61 | 我醉/N2 啦/N2 !/ !/ !/ !/ 62 | 电话/E 没/N2 人/N2 接/N2 ,/ 63 | 至少/N2 迟/N2 送/N2 了/N2 4/N2 个/N2 小时N2/ ,/ 64 | 以后/N2 再也/N2 不会/N2 买/N2 了/N2 !/ 65 | 幸亏/ 不/ 特别/ 饿/ ,/ 66 | 要不/N1 会/N1 饿死/N1 !/ !/ !/ 67 | 良辰/E 告诫/N2 众/N2 饭/N2 友/N2 ,/ 68 | 此/E 家/E 卷饼/E 极其/N1 不靠/N1 谱/N1 ,/ 69 | 到手/N1 拔/N1 凉/N1 拔/N1 凉/N1 的/ ,/ 70 | 一口咬/N2 下去/N2 半拉/N2 多/N2 都N2/ 是/N2 饼/E !/ 71 | 凉/N2 了/N2 的/ 肘子/E 肉/E 吃/ 起来/ 腻/N1 死/N1 !/ 72 | 最最/N1 可恶/N1 的/ 是/ ,/ 73 | 我/E 九点/N2 下单/N2 预约/N2 十一/N2 点/N2 四十五/N2 送/N1 ,/ 74 | 晚/N1 了/N1 两个/N1 小时/N1 !/ 75 | 要不是/ 看/ 送餐/E 师傅/E 辛苦/ ,/ 76 | 我/E 真想/ 把/ 这/ 破/N1 饼/E 扔/ 店家/E 脸上/E !/ 77 | 记住/ ,/ 78 | 我/ 叫/ 叶/ 良辰/ ,/ 79 | 我/E 叶/E 良辰/E 不是/N2 你/E 能/N2 惹/N2 得/N2 起/N2 的/N2 !/ 80 | 请/ 饭/ 友/ 奔走相告/ 。/ 81 | 一般/N2 吧/N2 ,/ 82 | 不够/N2 吃/N2 ,/ 83 | 价格/E 不便/N2 宜/N2 84 | 等/N2 了/N2 接近/N2 两个/N2 小时/N2 ,/ 85 | 太/N1 慢/N1 了/N1 86 | 两小/N2 时/N2 送到/N2 ,/ 87 | 自己/E 体会/N2 !/ 88 | 太/N1 恶心/N1 了/N1 ./ ./ ./ ./ 89 | 什么/N1 玩意/N1 好/N1 难吃/N1 啊/N1 ,/ 90 | 送/E 的/ 还/N1 巨/N1 慢/N1 91 | 送餐/E 没准/N1 !/ !/ !/ 92 | 想/N2 送/N2 就/N2 送/N2 ,/ 93 | 不想/N2 送/N2 就/N2 不/N2 送/N2 94 | 整体/E 不错/P1 ,/ 95 | 肉/E 少/N2 ,/ 96 | 配菜/E 太/N2 多/N2 。/ 97 | 好评/N2 ,/ 98 | 必须/N2 好评/N2 ,/ 99 | 有点/ 如下/ :/ ,/ 100 | 1/ ,/ 101 | 有/ 创意/ :/ 把/ 肉/E 夹/E 馍/E 的/ 皮去/N2 掉/ ,/ 102 | 换成/ 煎饼/E 包/ 肉/ ,/ 103 | 有/ 创意/N2 。/ ,/ 104 | 2/ ,/ 105 | 量/ 足/ :/ 图片/E 是/N2 两个/N2 ,/ 106 | 实际/N2 只有/N2 一个/ ,/ 107 | 只要/ 吃/ 三个/ 就/ 饱/N2 了/ 。/ ,/ 108 | 3/ ,/ 109 | 便宜/N2 :/ 20/ 块钱/ 买/ 个/ 肉/ 夹/ 馍/ ,/ 110 | 真值/N2 。/ ,/ 111 | 4/ ,/ 112 | 送餐/E 及时/N2 :/ 十一/N2 点/N2 半/N2 订/N2 的/N2 ,/ 113 | 说/ 十二点/ 半/ 到/ ,/ 114 | 结果/N2 一点半/ 就/N2 到/N2 了/N2 。/ ,/ 115 | 必须/N2 赞/N2 !/ !/ !/ 116 | 商务/E 十点/N2 半/N2 左右/N2 定/N2 的/ 餐/N2 ,/ 117 | 到/N2 下午/N2 两点/N2 了/N2 还/N2 没/N2 送到/N2 。/ 118 | 打电话/E 取消/ 订单/ 了/ ,/ 119 | 为什么/ 是/ “/ 120 | 订单/ 已/ 完成/ ”/ 121 | 而且/ 没/ 退钱/ ?/ 122 | 送货/E 太/N1 慢/N1 了/N1 。/ 123 | 花/N2 了/N2 两个/N2 半/N2 小时送/N2 来/N2 …/ …/ 124 | 卷饼/E 都/N2 凉/N2 了/N2 ,/ 125 | 真是/N1 无语/N1 ,/ 126 | 没/N1 见/N1 过/N1 更/N1 差/N1 的/N1 外卖/N1 127 | 没有/N1 勺E,/ 配送/E 好/N1 慢/N1 ,/ 128 | 手套/E 少/N2 一/N2 只/N2 ,/ 129 | 恩/N2 130 | 不/N2 送/N2 上来/N2 ,/ 131 | 让/N2 下去/N2 去/N2 ,/ 132 | 还/N2 没/N2 赶下/N2 去/N2 ,/ 133 | 就/N2 来电/N2 话/N2 了/N2 ,/ 134 | 说/N2 给/N2 放到/N2 大厦/E 大厅/E 口/E 了/N2 ,/ 135 | 真是/N2 太奇/N2 葩/N2 了/N2 ,/ 136 | 遇到/ 过/ 让/ 在/ 楼梯口/ 等/ 的/ ,/ 137 | 遇到/ 过/ 让/ 在/ 一楼/ 等/ 的/ ,/ 138 | 还/ 没/ 遇到/ 过/ 这种/ 的/ ,/ 139 | 服务/E 太/N1 差/N1 !/ !/ ,/ 140 | 卷饼/E 味道/E 一般/N1 ,/ 141 | 很/N1 肥/N1 腻/N1 ,/ 142 | 价格/E 很/N2 高/N2 ,/ 143 | 简单/N2 的一/N2 个/N2 饼/E 卷/E 肉/E ,/ 144 | 一个/N2 最/N2 便宜/N2 的/N2 20/N2 ,/ 145 | 和/ 肉/ 夹/ 馍/ 差不多/ ,/ 146 | 总之/ ,/ 147 | 再也/N2 不会/N2 定/N2 了/ 148 | 肉/E 不/N2 新鲜/N2 ,/ 149 | 面皮/E 也/N2 是/N2 剩/N2 的/N2 ,/ 150 | 不/N2 新鲜/N2 ,/ 151 | 生意/E 咱/N2 能/N2 好好/N2 做/N2 吗/ !/ !/ !/ !/ 152 | 送餐/E 为啥/N2 我要/N2 下楼/N2 拿/N2 。/ 。/ 153 | 但是/P1 味道/E 还好/N2 份量/E 很/P1 足/P1 。/ 154 | 八宝菜/E 竟然/N2 是/N2 咸菜/N2 。/ 。/ 。/ 155 | 太/N1 坑/N1 156 | 很/N2 不开/N2 心/N2 的一/N2 次/N2 !/ !/ !/ 157 | 三点/N2 多下/N2 的/N2 订单/ ,/ 158 | 怕/N2 他们/N2 忙/N2 ,/ 159 | 让/N2 他们/E 五点/N2 送/N2 ,/ 160 | 这个/N2 推/N2 时间/N2 ,/ 161 | 一下子/N2 下班/N2 到/N2 18/ 点/ 20/ 才/ 送到/ 这/ 。/ 162 | 还/N1 各种/N1 找/N1 借口/N1 !/ !/ !/ !/ 163 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-2.txt: -------------------------------------------------------------------------------- 1 | 大/N1 2 | 差/N1 评/N1 ,/ 3 | 米饭/E 是/ 什么/ 啊/ ,/ 4 | 是/N2 剩/N2 了/N2 3/N2 天/N2 的/N2 吗/N2 ,/ 5 | 餐饮/E 行业/E 这么/N1 坑/N1 ,/ 6 | 真/N1 没/N1 人性/N1 ,/ 7 | 直接/N2 扔/N2 了/N2 8 | 米饭/E 太/N1 少/N1 了/N1 !/ 9 | 全/N1 是/N1 垃圾/N1 ,/ 10 | 没法/N1 吃/N1 ,/ 11 | 不/N1 建议/N1 订餐/N1 12 | 汤/E 和面/E 不是/N2 分开/N2 的/N2 ,/ 13 | 面/E 都/N2 糊/N2 了/N2 ,/ 14 | 不好/N1 吃/N1 。/ 15 | 吃/ 个/ 饭/ 等/N2 了/N2 一个半/N2 小时/N2 16 | 百度/E 大哥/E 先是/ 找不/N2 到/N2 地点/N2 ,/ 17 | 找到/ 说/ 多/ 给/ 了/ 几/ 块钱/ 的/ 发票/E ,/ 18 | 我一/ 核对/ ,/ 19 | 是/ 少/N2 给/N2 了/N2 发票/N2 ,/ 20 | 还好/ 意思/ 跟我/ 要好/ 评/ ,/ 21 | 我/ 也/ 是/ 醉/N1 了/N1 ,/ 22 | 醉/N1 了/N1 ,/ 23 | 醉/N1 了/N1 24 | 前/ 几次/ 面是/ 分开/ 的/ !/ 25 | 这次/ 没/ 分/ 一个/N2 多/N2 小时/N2 送/N2 过来/N2 ,/ 26 | 已经/N2 没法/N2 吃/N2 了/N2 !/ 27 | 牛肉面/E 吃/N2 到/N2 了/N2 小/N2 蟑螂/N2 !/ 28 | 无语/N1 !/ 29 | 以后/N2 不能/N2 定/N2 了/N2 30 | 送/E 晚/N1 了/N1 ,/ 31 | 配送/E 员/E 送/N1 错/N1 地方/N1 ,/ 32 | 面/E 都/N2 断/N2 了/N2 !/ 33 | 没/N2 嚼/N2 劲/N2 !/ 34 | 汤/E 洒/N2 的/N2 到处/N2 都/N2 是/N2 !/ 35 | 都/N2 泡/N2 发/N2 了/N2 。/ 36 | 没/N2 醋/N2 味/N2 ,/ 37 | 实在/N1 难吃/N1 38 | 送餐/E 撒/N2 了/N2 ,/ 39 | 漏/N2 的/N2 哪/N2 都/N2 是/N2 油/N2 40 | 这是/N2 我/N2 吃/N2 过/N2 最差/N2 的/N2 一次/N2 外卖/N2 ,/ 41 | 1/ ./ 42 | 外卖/E 盒/E 上/ 裹/N2 着/N2 厚厚的/N2 一/N2 层/N2 凝固/N2 脏/N2 油/N2 ,/ 43 | 2/ ./ 44 | 备注/E 单/E 上/ 特意/ 写/ 着/ 两个/ 卤/E 蛋/E 不要/ 送/ 差/ ,/ 45 | 结果/N2 还是/N2 只/N2 送/N2 了/N2 一个/N2 ,/ 46 | 3/ ./ 47 | 卤/E 蛋/E 上/ 还有/N2 鸡蛋/N2 壳/N2 在/N2 上面/N2 ,/ 48 | 脏乱差/N1 49 | 退款/E 呢/ ,/ 50 | 没收/N2 到/N2 51 | 吃出/N2 苍蝇/N2 和/N2 虫子/N2 了/N2 、/ 52 | 恶心/N1 53 | 说/ 订单/E 满/ 30/ 赠/ 小菜/E ,/ 54 | 结果/N2 没有/N2 !/ 55 | 差差/N1 差/N1 ,/ 56 | 备注/ 了不/ 要/ 辣/ ,/ 57 | 结果/N2 还有/N2 一/N2 盒/N2 很/N2 辣/N2 ,/ 58 | 孩子/E 根本/N2 没法/N2 吃/N2 ,/ 59 | 等/N2 了/N2 那么/N2 久/N2 ,/ 60 | 孩子/E 们/E 已经/N1 饿/N1 坏/N1 了/N1 61 | 送/N2 的/N2 东西/N2 三/N2 盒/N2 都/N2 洒/N2 了/N2 ,/ 62 | 车/E 翻/ 了/ 吗/ ?/ 63 | 除了/ 鸡腿/E 吃/ 完了/ 豆/E 皮/E 和面/E 全/N2 吃/N2 两口/N2 扔/N2 了/N2 。/ 64 | 发票/E 不够/N2 !/ !/ !/ !/ 65 | 大坑/N1 66 | 凉菜/E 有点儿/N1 咸/N1 了/N1 ,/ 67 | 牛/E 杂/E 好吃/N1 ,/ 68 | 没/N2 以前/N2 多/N2 了/N2 69 | 我/ 确实/ 是/ 忘记/ 选择/ 配送/E 时间/E 了/ ,/ 70 | 你们/ 商家/E 从来不/N2 看/N2 买家/N2 的/N2 备注/N2 么/N2 ,/ 71 | 也/ 真是/N1 醉/N1 了/N1 ,/ 72 | 这就是/ 直接/ 吃/ 片/ 汤/ 了/ ,/ 73 | 服气/ 了/ 74 | 红油/E 热/E 干面/E 吃/N2 了/N2 拉肚子/N2 !/ !/ 75 | 难受/N1 !/ 76 | 和/ 老家/E 味道/E 完全/N2 不一/N2 样/N2 啊/ !/ 77 | 忘记/ 说/ 别/ 放/ 辣/ 了/ ,/ 78 | 结果/ 辣/N2 得/N2 我/N2 全/N2 倒/N2 了/N2 !/ 79 | 是不是/ 因为/ 外卖/E 的/E 关系/E ,/ 80 | 怕/ 泡/ 的/ 时间/ 长/ ,/ 81 | 面条/E 都/N1 没/N1 怎么/N1 熟/N1 ,/ 82 | 好/N1 硬/N1 83 | 味道/E 还/P1 可以/P1 ,/ 84 | 只是/N2 送/N2 过来/N2 有点/N2 干/N2 85 | 口味/E 能/N2 再/N2 重/N2 一点/N2 吗/N2 ?/ 86 | 大料/E 不用/N2 钱/N2 买/N2 ?/ 87 | 不/ 喝/ 三杯水/ ,/ 88 | 我/ 是/ 吃不/N2 下去/N2 的/ 89 | 送/E 的/E 倒是/ 真/N1 速度/N1 ~/ 90 | 可是/ 勺/E 也/N2 没/N2 给/N2 餐巾纸/E 也/N2 没有/N2 -/ _/ -/ #/ …/ 91 | 以后/N2 不点/N2 这家/N2 了/N2 …/ 92 | 面不/N2 好吃/N2 ~/ 93 | 一股/ 子/ 很/N1 不/N1 新鲜/N1 的/ 味道/E …/ 94 | 鸡腿/E 也/N2 是/N2 闻起/N2 来不/N2 新鲜/N2 …/ 95 | 酒糟/E 小汤/E 圆/E 好/N1 马马虎虎/N1 …/ 96 | 面/E 太/N1 干/N1 ,/ 97 | 太/N1 硬/N1, ,/ 98 | 不好/N1 吃/N1 ,/ 99 | 除了/N2 面/E 就/N2 有/N2 两/E 片/E 木耳/E ,/ 100 | 差/N1 评/N1 !/ ,/ 101 | 汤水/E 洒/N2 的/N2 满/N2 世界/N2 都/N2 是/N2 102 | 太/N1 慢/N1 !/ 103 | 不会/N2 再/N2 用/N2 百度/N2 外卖/N2 了/ 104 | 热/E 干面/E 没什么/N2 味/N2 ,/ 105 | 油/N1 太重/N1 !/ 106 | 豆/E 皮/E 味道/E 还/P1 可以/P1 ,/ 107 | 豆/E 干/E 比较/P1 多/P1 ,/ 108 | 糯米/E 和/ 肉丁/E 少/N1 。/ 109 | 比/P2 预定/P2 时间/P2 提前/P2 40/P2 分钟/P2 送到/P2 ,/ 110 | 面/E 和/E 汤/E 还/N2 没/N2 给/N2 分开/N2 ,/ 111 | 吃/ 的/ 时候/ 都/N2 泡/N2 坏/N2 了/N2 。/ 112 | 饭/E 没什么/N2 可说/N2 的/N2 ,/ 113 | 外/E 送/E 从/N2 取/N2 餐/N2 到/N2 送到/N2 用/N2 了/N2 40/N2 分钟/N2 ,/ 114 | 实际/ 距离/ 1/ 公里/ 左右/ ,/ 115 | 面条/E 类/E 的/E 东西/E 这样/N2 还/N2 能/N2 吃/N2 ?/N2 116 | 注明/ 了不/ 放/ 香菜/E ,/ 117 | 结果/N2 送来/N2 满满的/N2 全/N2 是/N2 香菜/N2 。/ 118 | 带/E 汤/E 的/E 面条/E ,/ 119 | 汤/E 和面/E 没/N2 分开/N2 盛放/N2 ,/ 120 | 送来/N2 直接/N2 全/N2 糊/N2 了/N2 ,/ 121 | 今天/ 注定/ 要/ 饿/N1 肚子/N1 了/ ,/ 122 | 28/ 块钱/ 2/N2 个/N2 多/N2 小时/N2 等待/N2 打/ 水漂/ 了/ ,/ 123 | 差/N1 到/N1 极致/N1 的/ 外卖/E !/ !/ !/ !/ !/ 124 | 原味/E 鸡/E 能不/ 能/ 差不多/ 点/ 订/ 了/ 六/ 块/ 、/ 125 | 基本上/ 都/ 是/ 一样/ 的/ 、/ 126 | 上次/ 订/ 也/ 是/ 这样/ 问题/ 127 | 服务/E 太/N1 差/N1 !/ 128 | 说/ 半天/ 要/ 番茄酱/E 也/N2 没/N2 给/N2 我/N2 拿/N2 !/ 129 | 后来/N2 说/N2 给/N2 我/N2 送/N2 又/N3 没/N2 送/N2 130 | 送来/E 的/E 东西/E 袋子/E 也/N2 不记/N2 上/N2 、/ 131 | 都/N1 凉/N1 了/N1 、/ 132 | 快递/E 也/N2 不行/N1 啊/N1 133 | 连/N2 个/N2 吸管/N2 都/N2 没有/N2 ,/ 134 | 而且/ 送来/E 的/E 都/N1 凉/N1 了/N1 135 | 速度/E 快/P1 、/ 136 | 质量/E 差/N1 的/N1 很/N1 、/ 137 | 我要/ 九/ 块/ 原味/E 鸡/E 、/ 138 | 四/ 块/ 一样/ 的/ 、/ 139 | 你/N2 他妈的/N2 脑袋/N2 有问题/N2 吧/N2 、/ 140 | 告诉/ 我/ 看见/ 就/ 恶心/N1 、/ 141 | 9/ ⃣/ ️/ 142 | 块/ 都/ 是/ 差不多/ 一样/ 的/ 、/ 143 | 所以/ 说/ 你们/ 有/ 神/N2 经/N2 病/N2 144 | 大/N2 晚上/N2 点/N2 KFC/N2 就是/N2 个/N2 错误/N2 ,/ 145 | 第一次/ 吃/ 到/ 口干/ 这么/N1 差/N1 的/ 汉堡/E ,/ 146 | 肉/E 卷/E 也/ 极/N1 差/N1 。/ 147 | 到点/ 的/ 东西/ 该/ 废/ 要/ 废/ ,/ 148 | 拿/ 这种/ 东西/ 卖/ 给/ 顾客/ 好意思/N2 ?/ 149 | 掉/N2 钱眼/N2 里/N2 了/N2 ?/N2 150 | 总之/ 东西/ 和/ 自己/ 去/ 店/ 买/ 的/ 口感/E 差/N1 很多/N1 !/ 151 | 但是/ 还是/P1 要/P1 谢谢/P1 辛苦/P1 送餐/E 的/E 送餐员/E !/ 152 | 少/N2 送/N2 了/N2 饮料/E 153 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-10.txt: -------------------------------------------------------------------------------- 1 | ~/ 2 | 味道/E 真的/N1 不/N1 太/N1 好/N1 3 | 走路/N2 十分钟/N2 就/N2 到/N2 ,/ 4 | 结果/N1 我/N1 疯/N1 了/N1 一个半/N1 小时/N1 才/N1 送到/N1 ,/ ,/ ,/ 5 | 饼/N1 还/N1 不/N1 熟/N1 6 | 没有N1/ 第一次/N1 吃/N1 的/N1 好/N1 ,/ 7 | 里面/N1 有/N1 小/N1 骨头/N1 渣子/N1 ,/ 8 | 咯/N1 牙/N1 9 | 2/N2 个/N2 半/N2 小时/N2 还有/N2 啥/N2 说/N2 的/N2 ,/ 10 | 最后一/N2 次/N2 11 | 唉/N2 !/ 12 | 让/N2 自己/N2 去/N2 楼下/N2 大厦/N2 门口/N2 拿/N2 餐/N2 ,/ 13 | 没/N2 时间/N2 去/N2 拿/N2 ,/ 14 | 然后/N2 就/N2 这个/N2 点/N2 送到/N2 了/N2 ,/ 15 | 送到/N2 后/N2 都/N2 上班/N2 了/N2 16 | 太油/N1 腻/N1 了/N1 。/ 17 | 送餐/E 极其/N1 差/N1 18 | 东西/E 不错/P1 ,/ 19 | 时间/N1 有点/N1 久/N1 ,/ 20 | 预期/N1 时间/N1 不准/N1 21 | 他家/N2 还是/N2 卷饼/E 好吃/N2 ./ ./ ./ 22 | 蔬菜/E 拌饭/E 太/N1 难吃/N1 了/N1 ./ ./ ./ ./ 23 | 本来/N1 想/N1 吃/N1 点/N1 清淡/N1 的/N1 ,/ 24 | 打开/N1 一/N2 看/N2 一/N2 层/N2 洋葱/E 混/E 着/N2 卷饼/E 里/N2 的/N2 酱/N2 ./ ./ ./ ./ 25 | 下面/N2 依稀/N2 有些/N2 土豆丝/E 豆芽/E 抽/N2 吧/N2 的/N2 蘑菇/E 片/N2 ./ ./ ./ ./ ./ 26 | 真的/N1 很难/N1 吃/N1 啊/N1 ./ ./ ./ ./ 27 | 不过/N2 卷饼/E 是/N2 真的/N2 好吃/N2 ,/ 28 | 下次/N2 还是/N2 点/N2 卷饼/E 好了/N2 ./ ./ ./ ./ 29 | 送餐/N1 特别/N1 慢/N1 !/ !/ 30 | 老板/N1 电话/N2 不/N2 给/N2 说/N2 !/ !/ 31 | 除了/P1 送餐员/P1 还/P1 行/P1 以外/P1 ,/ 32 | 真的/N2 不知/N2 道/N2 说/N2 什么/N2 好/N2 ,/ 33 | 吃/N1 的/N1 还/N1 没/N1 吃/N1 ,/ 34 | 味道/N1 不知/N1 道/N1 ,/ 35 | 100/N1 多分钟/N1 才/N1 送到/N1 ,/ 36 | 就/N1 800/N1 米/N1 …/ …/ 37 | 还有/N1 评价/N1 单/N1 上/N1 的/N1 送达/N1 时间/N1 不对/N1 !/ !/ 38 | 什么/N1 11/N1 点/N1 14/N1 ?/N1 39 | 是/N1 12/N1 点/N1 14/N1 !/ !/ !/ !/ !/ 40 | 味道/P1 还/P1 可以/P1 。/ 41 | 下午/N2 拉肚子/N2 了/N2 42 | 包装/N1 不好/N1 ,/ 43 | 导致/N2 粥/N2 都/N2 撒/N2 了/N2 。/ 44 | 因为/N2 送餐员/N2 放下/N2 就/N2 走/N2 ,/ 45 | 打开/N2 看/N2 才/N2 知道/N2 不能/N2 吃/N2 了/N2 ,/ 46 | 因为/N2 忙/N2 也/N2 没有/N2 让/N2 重新/N2 送/N2 ,/ 47 | 就/N2 这样/N2 吧/N2 48 | 十一/N2 点/N2 半/N2 定/N2 的/N2 ,/ 49 | 说/N2 十二点/N2 半/N2 到/N2 ,/ 50 | 我/N2 知道/N2 我/N2 定/N2 晚/N2 了/N2 ~/ 51 | 我/N2 没/N2 催/N2 你们/N2 吧/N2 ,/ 52 | 理解/N2 你们/N2 吧/N2 ,/ 53 | 结果/N2 两点/N2 多才/N2 到/N2 ,/ 54 | 我/N2 吃/N2 的/N2 是/N2 午饭/N2 么/N2 ?/ !/ 55 | 能不/N2 能干/N2 ?/ 56 | 不能/N2 干/N2 别/N2 接/N2 单/N2 !/ 57 | 很/N1 不好/N1 吃/N1 。/ 58 | 土豆丝/E 还/P1 可以/P1 ,/ 59 | 香菇/E 的/N1 好/N1 难吃/N1 !/N1 60 | 说/N2 句/N2 实话/N2 ,/N2 61 | 确实/N1 一般/N1 ,/ 62 | 如果/N2 不是/N2 因为/N2 优惠/N2 ,/ 63 | 20/N2 的/N2 最后/N2 4/N2 块钱/N2 买/N2 的/N2 ,/ 64 | 我/N2 真想/N2 退货/N2 65 | 鱼香肉丝/E 味道/N1 完全/N1 不对/N1 ,/ 66 | 饼/E 很/N1 硬/N1 67 | 粥/E 的/N2 盒子/N2 都/N2 碎/N2 了/N2 ,/ 68 | 没法/N2 吃/N2 。/ 69 | 等/N2 了/N2 两个/N2 半/N2 小时/N2 才/N2 到/N2 ,/ 70 | 不想/N2 说/N2 什么/N2 了/N2 71 | 还/P1 可以/P1 吧/P1 。/ 72 | 吃着/P1 也就/P1 那样/P1 。/ 73 | 粥/E 不错/P1 ,/ 74 | 挺/P1 好喝/P1 75 | 感觉/P1 味道/E 一般/P1 ,/ 76 | 不是/P1 很/P1 好吃/P1 …/ 77 | 鸡肉/E 很/N1 老/N1 …/ 78 | 等/N1 了/N1 两个/N1 多/N1 小时/N1 ,/N1 79 | 餐/N1 才/N1 送到/N1 ,/ 80 | 以后/N1 不会/N1 再/N1 定/N1 他们/N1 家/N1 了/N1 81 | 说了/N2 不/N2 放/N2 辣/N2 ,/ 82 | 还是/N2 辣/N2 的/N2 83 | 差/N1 评/N1 ,/ 84 | 两个/N2 半/N2 小时/N2 才/N2 送到/N2 !/N2 85 | 太/N1 慢/N1 了/N1 ,/ 86 | 等/N1 了/N1 两个/N1 多/N1 小时/N1 ,/ 87 | 而且/N1 特别/N1 咸/N1 88 | 尼玛/N1 是/N1 生/N1 的/N1 ,/ 89 | 为了/N1 快/N1 也/N1 不能/N1 这样/N1 啊/N1 !/N1 !/N1 90 | 什么/ 也/ 不想/ 说了/ 等/N2 了/N2 两个/N2 小时/N2 ,/ 91 | 而且/ 最重/ 要/ 的/ 我/ 点/ 的/ 东西/N2 不/N2 全/N2 ,/ 92 | 粥/E 和/E 饼/E 有/ ,/ 93 | 但是/ 七元/ 的/ 辣/E 白菜/E 没有/N1 我/ 已经/ 给/ 交款/ 了/ ,/ 94 | 应该/ 给/ 我/ 返还/ 七元/E 真/N1 他妈的/N1 倒霉/N1 ,/ 95 | 差/N1 死/N1 了/N1 96 | 凭/ 良心/ 说/ 味道/E 不错/P1 ,/ 97 | 也/ 没有/ 网友/ 说/ 的/ 饼/E 硬/N1 。/ 98 | 就是/ 以后/ 少/ 放/ 点/ 酱/E ,/ 99 | 一/N2 吃/N2 全/N2 挤出/N2 来/N2 了/N2 ,/ 100 | 锡纸/E 包/ 的/ 不严/N1 汤/E 漏/N1 了/N1 一/E 袋子/E 。/ 101 | 然后/ 快递/E 打/N2 错/N2 电话/N2 ,/ 102 | 把/ 9/ 按/ 成/ 6/ 了/ ,/ 103 | 还/ 一直/ 说/ 打/N2 不通/N2 ,/ 104 | 这个/ 得/ 培训/ 下/ 吧/ ?/ 105 | 土豆丝/E 卷饼/E 太/N1 难吃/N1 了/N1 。/ 。/ 106 | 肥肉/E 太/N1 多吃/N1 的/ 时候/ 还/ 把/ 嘴唇/ 拿破/ 了/ 107 | 里面/ 粥/E 盒/E 碎/N1 的/N1 ,/ 108 | 粥/E 全/N2 撒/N2 了/N2 ;/ 109 | 只/ 剩/ 卷饼/E 淹没/ 在/ 粥/E 当中/ …/ …/ 110 | 没有/N1 很/N1 好吃/N1 111 | 买/ 的/ 饼/E 和/E 粥/E !/ !/ !/ 112 | 粥/E 居然/N2 不/N2 给/N2 送/N2 !/ !/ 113 | 没/N2 见/N2 过/N2 这样的/N2 !/ 114 | 东西/E 还好/P1 ,/ 115 | 餐/E 送/N1 的/N1 很/N1 慢/N1 116 | 送/N2 不到/N2 就/ 不要/ 接/ 单/ 好了/ ,/ 117 | 上午/N2 十点/N2 半/N2 下单/N2 下午/N2 一点半/N2 才/N2 送到/N2 ,/ 118 | 打电话/ 店员/E 态度/E 不应/N2 该/N2 诚恳/N2 点/N2 ?/ 119 | 你/N2 还有/N2 理/N2 了/N2 ?/ 120 | 卷饼/E 味道/E 一般/N1 ,/ 121 | 凉/N1 的/N1 ,/ 122 | 像是/N2 剩菜/N2 。/ 123 | 肉/E 不/N1 新鲜/N1 !/ 124 | 跟/ 网/E 评/E 差/N1 远/N1 了/N1 125 | 送餐/E 速度/E 慢/N1 126 | 总是/N2 不按/N2 正确/N2 的/N2 时间/N2 送达/N2 127 | 包装/E 不错/P1 ,/ 128 | 饼/E 一般/N1 ,/ 129 | 肘子/E 有点/N1 腥/N1 。/ 130 | 首先/ 我/ 想/ 说/ 这/ 送餐/E 服务/E 简直/ 是/ 太/N1 差/N1 了/N1 ,/ 131 | 我/ 选择/ 的/ 送餐/E 时间/E 是/ 12/E 点/E 15/E ,/ 132 | 他/ 11/E 点/E 半/E 就/ 送来/ 了/ ,/ 133 | 但是/ 根本/ 没有/ 联系/ 我/ ,/ 134 | 而是/ 放在/ 了/ 大厅/ ,/ 135 | 直到/ 12/ 点/ 半/ 我/ 也/ 没有/ 收到/ 任何/ 信息/ ,/ 136 | 打电话/ 咨询/ 说是/ 五道/ 口/ 负责/ ,/ 137 | 并/ 给/ 了/ 我/ 电话/ ,/ 138 | 这时/ 一个/ 老师/ 听到/ 了/ 我的/ 电话/ 内容/ 说/ ,/ “/ ,/ 139 | 那/ 有/ 个/ 饭/ 不知/ 道/ 是不是/ 你/ 的/ ,/ ”/ ,/ 140 | 我一/ 看/ 说/ 就是/ ,/ 141 | 他/ 说/ 早/ 送来/ 了/ ,/ 142 | 送餐/E 人员/E 会/ 联系/ 我/ ,/ 143 | 但是/ 根本/N2 没有/N2 联系/N2 我/N2 ,/ 144 | 不论/ 是/ 电话/ 还是/ 短信/ ,/ 145 | 打开/ 饼/E 硬硬/N1 的/N1 ,/ 146 | 粥/E 快/N1 凉/N1 了/N1 ,/ 147 | 我/ 都/ 崩溃/N1 了/N1 ,/ 148 | 请问/ 你们/E 还/N2 能/N2 再不/N2 靠/N2 谱/N2 点/N2 吗/N2 ?/ 149 | 以后/N2 再也/N2 不买/N2 了/N2 150 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-7.txt: -------------------------------------------------------------------------------- 1 | 差/N1 2 | 评/N1 ,/ 3 | 接/N2 单/E 两个/N2 多/N2 小时/N2 没有/N2 送餐/N2 ,/ 4 | 打电话/N2 也/N2 没/N2 人/N2 接听/N2 ,/ 5 | 更/N2 无法/N2 取消/N2 订单/E ,/ 6 | 至今/N2 没有/N2 给予/N2 回复/N2 ,/ 7 | 这是/N2 订/N2 宵夜/E 的/N2 节奏/N2 ,/ 8 | 送来/N2 带着/N2 锡纸/E 都/N2 凉/N2 透/N2 了/N2 ,/ 9 | 你们/E 都/N2 是/N2 只/N2 上/N2 夜班/N2 的/N2 吗/N2 ?/ 10 | 骗子/E !/ !/ !/ 11 | 卷饼/E 和/ 粥/E 送到/N2 都/N2 已经/N2 凉/N2 透/N2 了/N2 12 | 口感/E 一般/N2 ,/ 13 | 卷饼/E 有些/N2 硬/E 14 | 等/N2 了/N2 2/N2 个/N2 多/N2 小时/N2 才/N2 送来/N2 ,/ 15 | 送来/N2 还/N2 都/N2 是/N2 凉/N2 的/N2 ,/ 16 | 差/N1 评/N1 17 | 中分/E 饼/E 根本/N2 吃不/N2 饱/N2 ,/ 18 | 何况/N2 不好/N2 吃/N2 …/ …/ ,/ 19 | 送餐/E 太/N1 慢/N1 …/ …/ 20 | 等/N2 了/N2 2/N2 个/N2 小时/N2 15/N2 ,/ 21 | 让/N2 我/E 去/N2 一楼/E 取/N2 ,/ 22 | 等/ 了/ 10/ 分钟/ ,/ 23 | 也/N2 打/N2 不通/N2 电话/E ,/ 24 | 看不/N2 见/N2 人/E ,/ 25 | 都/N2 一点半/N2 了/N2 送/ 过来/ ,/ 26 | 还/ 让/ 我/ 下楼/N2 去取/N2 !/ 27 | 以后/N2 坚决/N2 不定/N2 28 | 服务/E 态度/E 太/N1 差/N1 了/N1 ,/ 29 | 找不/N2 到/N2 地方/E 还/N2 骂人/N2 ,/ 30 | 挂/N2 我/E 电话/E 。/ 31 | 建议N2/ 换/N2 一个/N2 靠/N2 谱/N2 点N2/ 的/N2 小哥/E 32 | 卷饼/E 两端/ 面/E 太/N2 厚/N2 了/N2 ,/ 33 | 盖饭/E 米饭/E 太/N2 软N2/ 了/N2 ,/ 34 | 配送E/ 员/E 明知/ 道/N2 我/E 在/N2 6/N2 层/N2 ,/ 35 | 要求/N2 我/E 去/N2 4/N2 层N2/ 取/N2 餐/E 36 | 这/N2 破天/E 气/E 我/E 也/N2 理解/N2 ,/ 37 | 但是/N2 这/N2 速度/E 真的/N2 都/N2 凉/N2 了/N2 。/ 。/ 。/ 38 | 味道/E 一般/N2 39 | 太/N1 差劲/N1 了/N1 ,/ 40 | 等/N2 了/N2 一/N2 晚上/N2 也/N2 没/N2 送到/N2 ,/ 41 | 期间/N2 打/N2 了/N2 四个/N2 电话/E ,/ 42 | 店家/E 承诺/E 取消/N2 订单/E ,/ 43 | 最终/N2 也/N2 没/N2 取消/N2 ,/ 44 | 最后/N2 店家/E 居然/N2 确认/N2 订单/E 完成/N2 了/N2 ,/ 45 | 太/N1 差劲/N1 了/N1 46 | 菜/E 难吃/N2 ,/ 47 | 送餐员/E 态度/E 极/N1 差/N1 ,/ 48 | 送/N2 不好/N2 餐/E 回家/N2 种田/N2 去/N2 ,/ 49 | 别/N2 在/N2 这/N2 丢人/N2 50 | 等/N2 了/N2 2/N2 个/N2 多/N2 小时/N2 ,/ 51 | 打电话/N2 取消/N2 了/N2 两次/N2 ,/ 52 | 后来/N2 又/N2 送来/N2 了/N2 ,/ 53 | 真是/N1 无语/N1 了/ !/ 54 | 饼/E 是/N2 粘/N2 的/N2 ,/ 55 | 不好/N2 吃/N2 56 | 要/N2 了/N2 粥/E ,/ 57 | 没/N2 勺子/E 怎么/N2 喝/N2 ?/ 58 | 卷饼/E 味道/E 一般/N2 ,/ 59 | 粥/E 难吃/N2 60 | 不好/N2 吃/N2 还是/N2 不好/N2 吃/N2 ,/ 61 | 都/N2 是/N2 肥肉/E 62 | 皮蛋/E 瘦肉/E 粥/E 不/N2 咋/N2 地/N2 。/ ,/ 63 | 送餐/E 大叔/E 虽然/N2 很/N2 热情/N2 ,/ 64 | 但是/N2 跟/N2 他/E 说/N2 从/N2 六七/N2 号/N2 电梯/E 上来/N2 ,/ 65 | 说/N2 半天/N2 也/N2 说不/N2 N明白/N2 66 | 饼/E 都/N2 泡/N2 的/N2 都/N2 裂开/N2 馅儿/E 全部/N2 出来/N2 了/N2 ,/ 67 | 两个/N2 半/N2 小时/N2 才/N2 送到/N2 ,/ 68 | 尼玛/N2 ,/ 69 | 送/N2 了/N2 三个/N2 小时/N2 70 | 送餐/E 速度/E 慢/N1 ,/ 71 | 口味/E 一般/N2 !/ 72 | 又/N2 贵/N2 又/N2 不好/N2 吃/N2 ,/ 73 | 送/E 的/N1 还/N1 慢/N1 ,/ 74 | 一个半/N2 小时/N2 ,/ 75 | 真是/N2 够/N2 了/N2 ~/ …/ 76 | 这/N2 确定/N2 还是/N2 以前/N2 大/N2 美女/E 老板/E 开/N2 的/N2 那/N2 家店/E 麽/N2 ?/ 77 | 饼/E 没完/N2 全/N2 熟/N2 ,/ 78 | 和/N2 以前/N2 的/N2 饼/E 也/N2 不一/N2 样/N2 ,/ 79 | 肉/E 就/N2 更/N2 别提/N2 了/N2 ,/ 80 | 块儿/E 大/N2 的/N2 要死/N2 ,/ 81 | 还/N2 很难/N2 吃/N2 ,/ 82 | 从前/N2 的/N2 飘香/N2 肘子/E 相当好/N2 吃/N2 啊/N2 ~/ 83 | 给/N2 一星/E 是/N2 因为/N2 没有/N2 办法/N2 给/N2 零星/E ,/ 84 | 真的/N1 ,/ 85 | 差/N1 到/N1 爆/N1 !/ !/ !/ !/ !/ 86 | 太/ 慢/N1 了/ ,/ 87 | 再也/N2 不会/N2 订/N2 了/N2 88 | 快/N2 两个/N2 小时/N2 收到/N2 ,/ 89 | 定/N2 的/N2 牛肉/E 的/N2 ,/ 90 | 牛肉/E 没有/N2 给/N2 其他/N2 的/N2 ,/ 91 | 以后/N2 不定/N2 了/N2 ,/ 92 | 不好/N2 吃/N2 93 | 第一/N2 ,/ 94 | 11/N2 点/N2 下单/N2 12/N2 点/N2 半/N2 送到/N2 ,/ 95 | 偏/N1 慢/N1 。/ 96 | 快递/E 一个劲儿/N2 道歉/N2 ,/ 97 | 让/N2 我/E 有愧/N2 疚/N2 感/N2 。/ 98 | 第二/ ,/ 99 | 卷饼/E 味道/E 不错/P2 ,/ 100 | 但是/N2 漏油/N2 啦/N2 ,/ 101 | 要/N2 的/N2 鱼香肉丝/E 的/N2 ,/ 102 | 吃/N2 完/N2 才/N2 意识/N2 到/N2 送/N2 的/N2 手套/N2 是/N2 干/N2 啥/N2 用/N2 的/N2 。/ 103 | 怪/N2 我/E 。/ 104 | 等/N2 了/N2 两小/N2 时/N2 ,/ 105 | 都/N2 饿/N2 过头/N2 了/N2 106 | 皮蛋/E 瘦肉/E 粥/E 里/N2 没有/N2 皮蛋/E 和/N2 瘦肉/E 107 | 预计/N2 配送/E 时间/E 是/N2 九十/N2 分钟/N2 ,/ 108 | 实际/N2 两个/N2 小时/N2 109 | 以后/N2 送/N2 饭/E 的/N2 能不/N2 能/N2 到/N2 了/N2 再/N2 打电话/N2 ?/ 110 | 特/N2 么/N2 每次/N2 接到/N2 电话/E 下去/N2 得/N2 等/N2 5/ 分钟/N2 以上/N2 是/N2 什么/N2 意思/N2 ?/ 111 | 这是/N2 我/E 吃/N2 过/N2 的/ 全/N1 宇宙/N2 最/ 难吃/N1 的/ 卷N2饼/E ,/ 112 | 没有/ 之一/ ,/ 113 | 而且/ 送餐/E 很/ 慢/ ,/ 114 | 后会无期/N2 了/ 您/ 呐/ 115 | 肥肉/E 太/N2 多/N2 !/ 116 | 送餐/E 太/N1 慢/N1 ,/ 117 | 不会/N2 订/N2 了/ 118 | 不管/N2 口味/E 如何/N2 ,/ 119 | 送/N2 了/N2 两个/N2 多/N2 小时/N2 ,/ 120 | 不/N2 骂街/N2 我/E 已经/N2 是/N2 素质/E 好了/N2 121 | 垃圾/ ,/ 122 | 接/ 单/E 配送/E 慢/ 的/ 要死/ 123 | 连/N2 取消/N2 都/ 取消/ 不了/ ,/ 124 | 电话/E 也/ 不/ 接/ ,/ 125 | 是/ 店家/E 垃圾/N2 还是/ 百度/E 服务/E 跟不上/ ?/ 126 | 人家/ 美/E 团/E 投诉/N2 了/ 还有/ 个/ 回复/ ,/ 127 | 你们/E 呢/ ?/ 128 | 垃圾/ 啊/ 店家/E 更是/ 垃圾/N2 中/ 的/ 垃圾/N2 ,/ 129 | 大家/E 不要/N2 订/ 了/ ,/ 130 | 等待/N2 不起/N2 啊/N2 131 | 送货/E 超/ 慢/N1 ,/ 132 | 已经/N2 都/N2 凉/N2 透/N2 了/N2 ,/ 133 | 饼/E 硬/N2 的/N2 不行/N2 。/ 134 | 晕/N2 了/N2 都/N2 ,/ 135 | 让/ 12/ 点/ 送/ 过来/ ,/ 136 | 你/E 这/ 10/ ./ 137 | 50/ 多/N2 就/ 送/N2 过来/N2 了/N2 ,/ 138 | 让/N2 我/E 情/N2 何以/N2 堪/N2 139 | 不是/N2 肘子/E 肉/E 吧/ ,/ 140 | 而且/N2 送来/N2 的/N2 都/N2 是/ 凉/N2 141 | 很/N2 一般/N2 ,/ 142 | 卷饼/E 是/ 死面/E 的/ ,/ 143 | 较/N2 厚/N2 ,/ 144 | 吃不/N2 惯/N2 145 | 今天/ 定/ 的/ 这个/ 纯/ 素/ 的/ 口味/E 不/N2 太/N2 好/N2 ,/ 146 | 里头/ 放/ 了/ 豆瓣酱/E 还是/N2 什么/N2 的/ 太/N2 浓/N2 了/N2 ,/ 147 | 有点/N2 发/N2 苦/N2 。/ 。/ 148 | 送餐/E 时间/E 太/N2 长/N2 ,/ 149 | 一共/N2 用/N2 了/N2 1/N2 个/N2 半/N2 小时/N2 多/N2 。/ 150 | 皮蛋/E 粥/E 还/P2 不错/P2 。/ 151 | 等/N2 了/N2 100/N2 多分钟/N2 ,/ 152 | 送来/N2 的/ 时候/ 我/E 都/ 快/N2 饿/N2 晕/N2 了/N2 。/ 。/ 。/ 。/ 。/ 153 | 好/ 慢/ 。/ 。/ 。/ 154 | 而且/ 送/ 过来/ 的/ 时候/ 洒/N2 的/N2 不成/N2 样子/N2 。/ 。/ 。/ 155 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-9.txt: -------------------------------------------------------------------------------- 1 | 吃/N2 2 | 了/N2 一半/N2 就/N2 吃不/N2 下去/N2 了/N2 ,/ 3 | 里面/N2 尽/N2 是/N2 肥肉/E ,/ 4 | 吃/N2 完/N2 就/N2 开始/N2 难受/N2 ,/ 5 | 拉/ 了/ 一下/ 午/ 肚子/E ,/ 6 | 再也/N2 不吃/N2 了/N2 !/ 7 | 创造/N2 了/N2 我/E 点/ 外卖/ 的/ 纪录/E ,/ 8 | 167/N2 分钟/N2 等待/N2 ,/ 9 | 都/N2 可以/N2 从北/N2 京/E 到/ 天津/E 买/ 了/ 大麻/E 花/E 回来/N2 了/N2 ,/ 10 | 还/N2 等/N2 卷饼/E 和/ 粥/E 11 | 真的/N1 好/N1 慢/N1 啊/N1 !/ 12 | 等/N2 了/N2 将近/N2 两个/N2 小时/N2 ,/ 13 | 快/N2 饿死/N2 了/N2 ,/ 14 | 只好/N2 自己/E 出去/N2 买/N2 了/N2 ,/ 15 | 刚/N2 买/N2 回来/N2 才/N2 打电话/N2 说/N2 送来/N2 了/N2 …/ …/ 16 | 速度/E 挺/P2 快/P2 ,/ 17 | 但是/N2 味道/E 不/N2 咋/N2 地/N2 ,/ 18 | 东西/E 不/N2 太/N2 干净/N2 ,/ 19 | 吃/N2 的/ 我/ 肠炎/N2 ,/ 20 | 拉肚子/N2 都/N2 要/N2 虚脱/N2 了/ ,/ 21 | 以后/N2 不会/N2 再/N2 定/N2 了/ 22 | 实在/N1 是/N1 太/N1 失望/N1 了/N1 ,/ 23 | 这个/ 店/E 刚/ 开业/N2 的/N2 时候/N2 吃/N2 过/N2 一次/N2 ,/ 24 | 觉得/N1 特别/N1 好吃/N1 ,/ 25 | 今天/N2 送来/N2 后/N2 我/E 都/N2 怀疑/N2 是不是/N2 点/N2 错/N2 店/E 了/ ,/ 26 | 怎么/N2 反差/N2 这么/N2 大/N2 啊/ ,/ 27 | 外面/ 的/ 饼/E 皮/E 就/ 和/ 一团/N1 生/N1 面/N1 一样/N1 28 | 4/N2 个/N2 小时/N2 。/ 。/ 29 | 呵呵/N2 了/N2 30 | 不值/N2 17/N2 元/N2 !/ 31 | 我要/ 的/ 是/ 肘子/E ,/ 32 | 里面/ 加/ 了/ 一半/ 鸡肉/E ,/ 33 | 不如/ 大街/ 上手/ 抓/ 饼/ 加/ 两块/ 里脊/E ,/ 34 | 皮蛋/E 瘦肉/E 粥/E 6/ 元/ 不如/N2 早起/ 2/ ./ 35 | 5/N2 元/N2 的/N2 实在/N2 36 | 没想/N2 象/N2 的/N2 好/N2 ,/ 37 | 粥/E 里/N2 没/N2 硬货/E ,/ 38 | 饼/E 味道/E 还/P1 行/P1 ,/ 39 | 量/E 一般/N1 40 | 十一/N2 点/N2 后/N2 点/N2 餐/E ,/ 41 | 送/E 的/N1 慢/N1 ,/ 42 | 不过/P2 味道/E 确实/P2 不错/P2 43 | 越来越/N2 难吃/N2 了/N2 ,/ 44 | 不会/N2 再/N2 吃/N2 了/N2 45 | 卷饼/E 还/P1 可以/P1 ,/ 46 | 这/ 粥/E 也/N2 太/N2 不值/N2 了/N2 !/ 47 | 皮蛋/E 两三/N2 粒/N2 ,/ 48 | 瘦肉/E 一块/N2 没/N2 吃着/N2 ,/ 49 | 这/N2 能/N2 叫/N2 皮蛋/E 瘦肉/E 粥/E 吗/ ?/ 50 | 就是/N2 普通/N2 的/N2 白米/E 粥/E !/ !/ !/ !/ 51 | 本来/N2 满怀/N2 期待/N2 的/N2 等到/N2 1/ 点多/ ,/ 52 | 结果/N2 不/N2 送/N2 上来/N2 ,/ 53 | 1/ 点多/N2 应该/N2 过/N2 高峰/N2 了/N2 啊/N2 ?/ 54 | 下去/ 拿/ 餐/E ,/ 55 | 发现/N2 只有/N2 我的/N2 那/ 份/ ,/ 56 | 我/E 就/ 呵呵/N2 了/N2 57 | 慢/N1 的/N1 要死/N1 ,/ 58 | 3/N2 个/N2 小时/N2 的/N2 苦苦/N2 等待/N2 …/ …/ 59 | 1/ ./ 60 | 15/ 送达/ 61 | 送/N2 个/N2 餐/E 90/N2 分钟/N2 ,/ 62 | 呵呵/N2 ,/ 63 | 竟然/N2 送餐/N2 不知/N2 道/N2 坐/N2 电梯/N2 去/ ,/ 64 | 呵呵/N2 ,/ 65 | 我/E 自己/ E去/ 拿/ 的/ ,/ 66 | 呵呵/N2 ,/ 67 | 没心/N2 情/N2 吃/N2 ,/ 68 | 呵呵/N2 69 | 根本/N2 不是/N2 肘子/E ,/ 70 | 就是/N2 五花肉/E ,/ 71 | 还/N2 很/N2 硬/N2 ,/ 72 | 很/N1 一般/N1 73 | 也就是/N2 7/N2 块钱/N2 的/N2 卷饼/E 。/ 。/ 74 | 真的/N1 很/N1 慢/N1 …/ 75 | 再也/N2 不会/N2 定/N2 了/N2 ,/ 76 | 不到/N2 十一/N2 点/N2 定/N2 的/N2 ,/ 77 | 快/N2 一点/N2 才/N2 到/N2 ,/ 78 | 中途/N2 打电话/N2 取消/N2 ,/ 79 | 压根/N2 不/N2 接/N2 电话/E ,/ 80 | 太/ 恶劣/ 了/ 。/ 81 | 送来/ 的/ 卷饼/E 包/N2 了/N2 两/N2 层/N2 锡纸/E ,/ 82 | 因为/ 第一/ 层/ 包/ 不住/N2 汤/E ,/ 83 | 又/N2 包/N2 一/N2 层/N2 。/ 84 | 拆开/N2 根本/N2 没法/N2 吃/N2 !/ 85 | 木耳/E 跟/N2 最/N2 开始/N2 的/N2 味道/E 也/N2 不一/N2 样/N2 了/N2 。/ 86 | 良心/E 哪/N2 去/N2 了/N2 ?/ !/ 87 | 送餐/E 速度/E 太/N1 慢/N1 ,/ 88 | 两个/N2 小时/N2 才/N2 到/N2 ,/ 89 | 打电话/ N2也/N2 不/N2 接/N2 !/ 90 | 味道/E 也/N1 很/N1 差/N1 ,/ 91 | 直接/N2 扔掉/N2 了/ 。/ 。/ 。/ 。/ 92 | 点/ 过/ 的/ 最差/N1 的/N1 外卖/E !/ !/ !/ !/ !/ 93 | 料/E 很/N2 足/N2 ,/ 94 | 但是/N2 酱肉/E 太/N2 咸/N2 了/N2 ,/ 95 | 饭/E 点儿/N2 叫/N2 外卖/E 等/N2 了/N2 一个/N2 多/N2 小时/N2 96 | 千万/N2 不要/N2 买/ ,/ 97 | 不好/N2 吃/N2 而且/ 服务/E 太/N1 差/N1 ,/ 98 | 送餐/E 速度/E 三小/N2 时/N2 ,/ 99 | 最/N2 失败/N2 的一/N2 次/ 购买/E 100 | 艹/N2 尼玛/N2 的/N2 ,/ 101 | 打电话/E 不/ 接/N2 什么/N2 意思/N2 ,/ 102 | 耍流氓/N2 么/N2 103 | 慢/N1 ,/ 104 | 送餐/E 态度/E 我/N2 也/N2 是/N2 醉/N2 了/N2 105 | 服务/E 态度/E 特别/N1 差/N1 ,/ 106 | 还/ 发脾气/N2 107 | 从/ 包装/E 到/N2 味道/E 总体/N2 还/N2 可以/N2 ,/ 108 | 就是/N2 小菜/E 不怎么/ N2好吃/N2 ,/ 109 | 木耳/E 还/ 凑合/ ,/ 110 | 辣/ 白菜/E 根本/ 不是/N2 那/ 味儿/N2 !/ 111 | 所以/ 小菜/E 再/ 弄好/N2 点/ 的话/ ,/ 112 | 还/ 会/ 多多/ 支持/ !/ 113 | 粥/E 里面/N2 竟然/N2 有/N2 蛋壳/E ,/N2 114 | 两个/N2 半/N2 小时/N2 才/N2 到/N2 ,/ 115 | 问/N2 商家/E 说/N2 配送/E 员/E 11/ 点/N2 出去/N2 的/N2 ,/ 116 | 一点/N2 才/N2 到/N2 这是/N2 去/N2 送/N2 全北京/E 的/N2 外卖/E 了/N2 吗/N2 ?/ 117 | 问起/N2 来/N2 就/N2 各种/N2 找/N2 理由/N2 ,/ 118 | 又是/N2 单子/N2 多/N2 又是/N2 第一/N2 个/N2 送/N2 的/N2 我的/N2 ,/ 119 | 我/E 十点/N2 半/N2 定/N2 的/N2 也/N2 不算/N2 晚/N2 吧/N2 !/ 120 | 就/N2 不信/N2 两个/N2 半/N2 小时/N2 都/N2 送/N2 不到/N2 !/ 121 | 土豆/E 肉丝/E 没有/N2 一丁点/N2 肉/E ,/ 122 | 怀疑/N2 送/N2 错/N2 了/N2 ,/ 123 | 皮蛋/E 瘦肉/E 粥/E 很/N2 一般/N2 124 | 一个/N2 多/N2 小时/N2 才/N2 送到/N2 ,/ 125 | 也/N1 太/N1 慢/N1 了/N1 126 | 粥/E 没味/N2 …/ …/ 127 | 香菇/E 炖/E 鸡/E 的/N2 鸡/E 竟然/N2 是/N2 鸡肉/E 丝/E 也就/ 算了/ ,/ 128 | 一点/ 味道/ 也/ 没有/N2 …/ …/ 129 | 送餐/E 先/N2 说/ 送/ 不到/ 宿舍/ 要/ 去/ 大南门/E 取/N2 ,/ 130 | 我/N2 到/N2 了/N2 大南门/E 他N2/ 又/N2 说/N2 他/N2 在/N2 宿舍/E 了/ …/ …/ 131 | 这家/E 店/E 一生/N2 黑/N2 132 | 11/N2 点/N2 半点/N2 的/N2 餐/E ,/ 133 | 12/N2 点/N2 45/ 送到/N2 的/N2 !/ !/ 134 | 蜗牛/E 都/ 比/N2 你们/E 快/N2 !/ !/ !/ 135 | 不会/N2 再/N2 定/N2 了/N2 !/ 136 | 根本/N2 不是/N2 肘子/E 肉/E 。/ 。/ 。/ 137 | 卷/N2 的/N2 菜/E 很少/N2 ,/ 138 | 感觉/N1 很/N1 一般/N1 139 | 2/N2 :/ 30/N2 送到/N2 ,/ 140 | 小伙伴/E 们/E ,/ 141 | 看着/N2 办/N2 吧/N2 142 | 我/E 就/N2 搞/N2 不明/N2 白/N2 了/N2 ,/ 143 | 我要/N2 了/N2 一/N2 份/N2 皮蛋/E 瘦肉/E 粥/E 商家/E 为什么/N2 不/N2 给/N2 勺子/E ?/ 144 | 粥/E 还/N2 行/N2 ,/ 145 | 拌饭/E 的/N2 米/E 粘糊糊/N2 的/N2 146 | 挺/P2 不错/P2 ,/ 147 | 就是/N2 时间/E 有点/N2 长/N2 ,/ 148 | 一个半/N2 小时送达/N2 149 | 一个/N2 小时/N2 才/N2 到/N2 ,/ 150 | 粥/E 也/N2 洒/N2 了/N2 ,/ 151 | 饼/E 也/N2 凉/N2 了/N2 152 | 好吃/P1 ,/ 153 | 包装/E 也/P1 很/P1 好/P1 154 | 速度/E 还/P2 可以/P2 ,/ 155 | 口味/E 可/N2 真心/N2 待/N2 提高/N2 啊/N2 156 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-11.txt: -------------------------------------------------------------------------------- 1 | 腻/N1 2 | 的/N1 很/N1 ,/ 3 | 难吃/N1 4 | 好吃/P1 ~/ 5 | 不错/P1 ~/ 6 | 速度/E 快/P1 !/ 7 | 送/E 的/ 慢/N1 1/N1 个/N1 多/N1 小时/N1 ,/ 8 | 卷饼/E 特别/N1 干/N1 ,/ 9 | 没有/ 老/E 北京/E 鸡肉/E 卷/E 好吃/P1 ,/ 10 | 因为/ 里面/E 没有/N2 酱/N2 ,/ 11 | 而且/ 肉/E 不/N1 太/N1 好/N1 ,/ 12 | 感觉/ 不一/ 定/ 是/ 肘子/E 肉/E ,/ 13 | 不会/N2 再/N2 吃/N2 了/N2 14 | 肉质/E 不/N1 新鲜/N1 ,/ 15 | 已经/N2 有味/N2 道/N2 了/N2 ,/ 16 | 不知/ 是不是/ 外卖/ 才/ 这样/ 17 | 不好/N1 吃/N1 ,/ 18 | 饼/E 太/N1 死/N1 19 | 饭/E 真的/N1 很/N1 一般/N1 ,/ 20 | 米饭/E 质量/E 不行/N1 21 | 太/N1 辣/N1 了/N1 ,/ 22 | 送餐/E 速度/E 慢/N1 了/N1 点/N1 ,/ 23 | 等/N2 了/N2 两小/N2 时/N2 24 | 两个/N2 多/N2 小时/N2 才/N2 送到/N2 ,/ 25 | 我/ 也/ 是/ 醉/N1 了/N1 。/ 。/ 。/ 。/ 26 | 打电话/N2 让/N2 我/N2 取/N2 餐/N2 ,/ 27 | 结果/ 他/ 走/N2 错/N2 楼/N2 了/N2 。/ 。/ 。/ 。/ 28 | 第一/E 天/E 11/E :/E 20/E 下/ 的/ 订单/ ,/ 29 | 催/N2 了/N2 好几/N2 遍/N2 还是/ 1/E 点多/E 才/N2 送来/N2 ,/ 30 | 一共/ 订/ 了/ 3/ 样/ 东西/ ,/ 31 | 只/N2 送/N2 了/N2 2/N2 样/N2 。/ 32 | 说得/ 特别/ 好说/ 第二/ 天天/ 再/ 送/ 份/ 原样/ 的/ 订单/ ,/ 33 | 12/E 点/E 前一/ 定/ 送到/ ,/ 34 | 11/E 点多/E 特意/ 打电话/ 问/ 说是/ 送/ 出来/ 了/ ,/ 35 | 还是/ 快/ 1/ 点/ 才/ 到/ ,/ 36 | 以后/N2 不会/N2 再/N2 订/N2 了/N2 。/ 37 | 送餐/E 很快/P1 、/ 38 | 很/P1 好吃/P1 ,/ 39 | 干净/P1 卫生/P1 40 | 差/N1 评/N1 差/N1 评/N1 ,/ 41 | 十点/E 定/ 的/ ,/ 42 | 一点半/E 才/N2 送到/N2 ,/ 43 | 没有/N2 任何/N2 道歉/N2 ,/ 44 | 再也/N2 不会/N2 定/N2 了/N2 45 | 味道/E 还/P1 不错/P1 ,/ 46 | 但是/ 送餐/E 太/N1 慢/N1 了/N1 ,/ 47 | 等/N2 了/N2 接近/N2 2/N2 个/N2 小时/N2 48 | 包装/E 很/P1 精致/P1 ,/ 49 | 可是/ 等/N2 了/N2 近/N2 两个/N2 小时/N2 才/N2 送到/N2 !/ 50 | 和/ 同事/E 一/ 快/ 订/ 的/ ,/ 51 | 送到/E 时间/E 晚半/N2 小时/N2 。/ 52 | 催/N2 了/N2 两次/N2 。/ 53 | 希望/ 安排/ 好/ 送餐/E 时间/E 。/ 54 | 订单/ 在/ 十一/E 点/E 就/ 应该/ 到/ 的/ ,/ 55 | 现在/ 都/ 12/E 点/E 了/ 还/N2 没有/N2 送到/N2 ,/ 56 | 我/ 刚/ 还/ 不小/ 心点/ 错/ 了/ ,/ 57 | 把/ 订单/ 确认/ 了/ ,/ 58 | 还/ 没有/ 催/ 单/ 的/ 电话/ ,/ 59 | 请问/ 我的/ 餐/ 到/ 哪/ 了/ ?/ 60 | 东西/E 不/N1 新鲜/N1 ,/ 61 | 感觉/N2 像是/N2 放/N2 了/N2 好多/N2 天/N2 的/N2 62 | 菜/E 量/E 非常/N1 少/N1 ,/ 63 | 是/N2 给/N2 小孩/N2 准备/N2 的/N2 吗/N2 ?/ ?/ 64 | 太/N1 TM/N1 差/N1 了/N1 ,/ 65 | 点/E 餐/E 到/ 收/E 餐/E 等/N2 了/N2 俩/N2 小时/N2 ,/ 66 | 饭量/E 还/N1 少/N1 ,/ 67 | 还有/ ,/ 68 | 店主/ 没/ 吃/ 过/ 辣/E 白菜/E 吧/ ?/ 69 | 不会/ 做/ 我/ 教你/ 啊/ 。/ 。/ 70 | 吃/N2 了/N2 拉肚子/N2 71 | 11/E :/E 35/E 下单/E '/ 72 | 14/E :/E 20/E 送到/ ,/ 73 | 想/ 吃/ 的/ 自己/ 掂量掂量/ 时间/E !/ 74 | 什么/N1 送餐/E 速度/E ,/ 75 | 你/ 么/ 13/E :/E 76 | 32/E 订餐/E ,/ 77 | 14/E :/E 78 | 36/E 还/N2 没/N2 送来/N2 ,/ 79 | 打电话/E 问/ 人家/ 答复/ 还/ 让再/ 等/N2 半/N2 个/N2 小时/N2 送来/N2 ,/ 80 | 这/ 你/ 么/ 也/ 太/N1 霸王/N1 了/N1 吧/ ,/ 81 | 虽然/ 就/ 点/ 一/ 份/ 也/ 不能/ 用/ 这种/ 服务/E 态度/E 对待/ ,/ 82 | 就算/ 是/ 免费/ 得/ 外/ 送/ ,/ 83 | 人家/ 都/ 是/ 第一/ 时间/ 响应/ ,/ 84 | 服务/E 态度/E 实在/N1 不敢/N1 恭维/N1 !/ !/ !/ 85 | 送餐/E 速度/E 太/N1 恶心/N1 了/N1 !/ 86 | 将近/ 3/E 小时/E 而且/ 没/N2 交代/N2 !/ 87 | 卷饼/E 不错/P1 ,/ 88 | 但/ 等/N2 了/N2 两个/N2 小时/N2 ,/ 89 | 什么/N2 情况/N2 90 | 包装/E 精致/P1 ,/ 91 | 送餐/E 快速/P1 ,/ 92 | 味道/E 一般/P1 93 | 就/ 冲/ 等/N2 了/N2 108/N2 分钟/N2 就要/ 打/ 差/N1 评/N1 ./ ./ ./ ./ 94 | 电话/E 也/ 占线/ ./ ./ ./ ./ ./ 95 | 11/E :/E 96 | 23/E 定/E 的/E ,/ 97 | 13/E :/E 98 | 21/E 送到/E 的/E ,/ 99 | 电话/E 打/ 了/ 18/ 个/ ,/ 100 | 不是/N2 关机/N2 就是/N2 打/N2 不通/N2 ,/ 101 | 偶尔/ 通一/ 次/ ,/ 102 | 还/N2 没/N2 人/N2 接/N2 103 | 东西/E 是/ 还/P1 不错/P1 ,/ 104 | 就是/ 不懂/ 为什么/N2 不能/N2 给/N2 送/N2 上来/N2 ,/ 105 | 我/ 知道/ 你们/ 中午/ 忙/N2 ,/ 106 | 可是/ 也/ 不能/ 天天/N2 让/N2 我/N2 下楼/N2 等/N2 你们/ 给/ 我/ 送/ 过来/ 吧/ ,/ 107 | 我/ 也/ 是在/ 上班/ 呢/ 阿/ ,/ 108 | 以后/N2 还是/N2 不点/N2 了/N2 。/ 109 | 可以/ 用/ 垃圾/N1 来/ 形容/ 了/ ,/ 110 | 能/ 把/ 土豆丝/E 做/ 的/ 这么/N1 难吃/N1 ,/ 111 | 厨师/E 也/ 是/ 很/N2 不容/N2 易/N2 啊/N2 !/ 112 | 送餐/E 很快/P1 ,/ 113 | 味道/E 一般/N1 114 | 包装/E 超级/P1 好/P1 、/ 115 | 味道/E 也/ 不错/P1 116 | 这次/ 不知/ 道/ 怎么/ 了/ ,/ 117 | 两个/N2 多/N2 小时/N2 才/N2 送到/N2 ,/ 118 | 连/N2 个/N2 电话/N2 也/N2 没有/N2 ,/ 119 | 配送/E 员/E 连/N2 句/N2 抱歉/N2 都/N2 没有/N2 !/ 120 | 太/N1 难吃/N1 了/N1 ,/ 121 | 不知/ 道/ 怎么/N2 搞/N2 出来/N2 的/N2 销量/N2 122 | 一个/N2 小时/N2 30/N2 分钟/N2 才/N2 送到/N2 ,/ 123 | 都/N1 凉/N1 了/N1 ,/ 124 | 味道/E 很/N1 一般/N1 ,/ 125 | 再也/N2 不/N2 订/N2 了/N2 。/ 126 | 差/N1 评/N1 !/ !/ !/ 127 | 实在/ 不知/ 道/ 该/ 说/ 什么/ ,/ 128 | 事情/ 太/ 复杂/ ,/ 129 | 送餐/E 人员/E 一开/ 始/ 就/ 打/ 了/ 一个/ 电话/ ,/ 130 | 因为/ 手机/ 静音/ 没有/ 接到/ ,/ 131 | 马上/ 就/ 打/ 回去/ 了/ ,/ 132 | 结果/ 说/ 已经/ 到/ 别的/ 学校/ 了/ ,/ 133 | 好/ 吧/ ,/ 134 | 那就/ 等/ ,/ 135 | 结果/ 期间/ 又/ 打/ 了/ 三个/ 电话/ ,/ 136 | 还是/ 晚/ 了/ 五十/ 分钟/ 送到/ 了/ ,/ 137 | 总共/ 等/N2 了/N2 将近/N2 两个/N2 小时/N2 。/ 138 | 送到/ 了/ 也就/ 没什么/ 了/ ,/ 139 | 结果/ 取/ 餐/ 的/ 时候/ ,/ 140 | 我们/ 还/ 没/ 说/ 什么/ ,/ 141 | 送餐/ 人员/ 直接/ 抢白/ ,/ 142 | 说/ 因为/ 我一/ 开始/ 没有/ 接/ 电话/ ,/ 143 | 他/ 送/ 了/ 一/ 圈/ 饭/ ,/ 144 | 最后/ 又/ 回来/ 我们/ 这边/ 。/ 145 | 我们/ 都/ 能/ 理解/ 送餐/E 人员/E 的/ 辛苦/ ,/ 146 | 可是/ 您/ 态度/E 太/N1 不好/N1 了/N1 吧/N1 !/ 147 | 说/ 句/ 凶残/N1 的话/ ,/ 148 | 怪/N2 我/N2 咯/N2 !/ !/ 149 | 总之/ ,/ 150 | 任性/N1 ,/ 151 | 就/N2 三星/N2 !/ 152 | 都/ 是/ 大/E 肥肉/E ,/ 153 | 吃不了/ !/ 154 | 皮蛋/E 瘦肉/E 粥/E 不错/P1 ,/ 155 | 土豆/E 肉丝/E 盖饭/E 就/ 呵呵/N2 了/ 156 | 餅/E 沒/N2 嚼/N2 勁/N2 ,/ 157 | 味道/E 太/N2 單/N2 薄/N2 158 | 味道/E 还/P1 可以/P1 ,/ 159 | 速度/E 真是/N2 惊人/N2 ,/ 160 | 送/N2 了/N2 快/N2 2/N2 个/N2 小时/N2 161 | 送/E 外卖/E 的/ 呵呵/N2 了/ ,/ 162 | 不/N2 给/N2 送到/N2 我/N2 给/N2 的/N2 地址/N2 ,/ 163 | 还/ 让/N2 我/N2 自己/N2 走老/N2 远去/N2 拿/N2 ,/ 164 | 那/ 我/ 还/ 订/ 外卖/ 干/ 嘛/ 。/ 165 | 卷饼/E 还是/P1 很/P1 好吃/P1 的/P1 。/ 166 | 感觉/ 全部/ 都/ 是/ 甜面酱/E ,/ 167 | 太/N1 甜/N1 了/N1 ,/ 168 | 饼/E 太/N1 厚/N1 ,/ 169 | 菜/E 的/E 汁水/E 流/N2 了/N2 一手/N2 170 | -------------------------------------------------------------------------------- /WaiMaiMiner/f_corpus/tags/negative_corpus_segment-3.txt: -------------------------------------------------------------------------------- 1 | 订单/E 被/N2 取消/N2 了/N2 N/N2 次/N2 ,/ 2 | 相隔/N2 那么/N2 近/N2 竟然/N2 说/N2 配送/E 不再/N2 范围/N2 内/N2 。/ 3 | 最后/N2 填/N2 了/N2 其他/N2 地址/E ,/ 4 | 但是/ 外卖/E 小哥/E 还是/ 送到/ 了/ ,/N2 5 | 态度/E 超级/N1 好/N1 。/ 6 | 另外/ 可乐/E 竟然/P2 是/P2 常温/P2 的/P2 7 | 量/E 越来越少/N2 了/N2 。/ 8 | 不是/N2 59/N2 免/N2 外/N2 送/N2 费/N2 吗/N2 ?/ 9 | 明明/N2 收/N2 了/N2 9/N2 块钱/N2 外/N2 送/N2 费/N2 !/ 10 | 配送/E 地点/E 距离/N2 餐厅/E 不到/N2 2/N2 公里/N2 ,/ 11 | 我/E 用/N2 2/ 小时/N2 40/ 分钟/N2 吃/N2 上/N2 凉/N2 了/N2 餐/N2 (/ 12 | 点击/N2 取消/N2 订单/E ,/ 13 | 我/N2 打电话/N2 给/N2 店家/N2 ,/ 14 | 对方/E 座机/E 是/N2 空/E 号/E ,/ 15 | 无法/N2 取消/N2 订单/N2 )/ 16 | 如此/N2 强的/N2 配送/N2 ,/ 17 | 如此/N2 强的/N2 服务/E ,/ 18 | 从未/N2 见/N2 过/N2 。/ 19 | 晚/N2 了/N2 快/N2 一个/N2 小时/N2 ,/ 20 | 太/N2 过分/N2 了/N2 吧/N2 21 | 量小/N2 ,/ 22 | 送/N2 的/N2 慢/N2 !/ 23 | 量/N2 超小/N2 !/ 24 | 送/N2 的/N2 超/N2 慢/ !/ 25 | 留/N2 的/N2 电话/E 关机/N2 ,/ 26 | 百度/E 电话/N2 客服/N2 忙碌/N2 ,/ 27 | 在线/N2 客服/E 说/N2 帮/N2 催/N2 了/N2 ,/ 28 | 催/N2 单一/N2 直/N2 显示/N2 在/N2 配送/N2 了/N2 ,/ 29 | 等/N2 了/N2 一个半/N2 小时/ 还/ 没来/ ,/ 30 | 上网/E 搜/ 了/ 电话号码/E ,/ 31 | 打/N2 过去/ 说/ 没/ 看到/ 百度/E 外卖/E 下/N2 的/N2 订单/E 32 | 送餐员/E 不/N2 给/N2 送到/N2 公司/E ,/ 33 | 给/ 我/E 打/ 个/ 电话/E 让/ 我/E 去/N2 电梯间/E 取/ ,/ 34 | 还/ 催/ 我/ 快点/ ,/ 35 | 连/ 这么/ 两/N2 步/ 都/ 懒得/ 走/ ,/ 36 | 干什么/N2 送餐员/E 的/ 工作/E 37 | 1/ ./ ,/ 38 | 十一/ 点/ 订/ 的/ 餐/E ,/ 39 | 一点/ 三十/ 才/ 到/ ,/ 40 | 2/ ./ ,/ 41 | 12/ 点/ 催/ 单/ ,/ 42 | 就/ 说/ 配送/ 中/ 了/ 。/ ,/ 43 | 一点/ 二十/ 催/ 单/ ,/ 44 | 还/ 配送/ 中/ 。/ ,/ 45 | 我/E 单位/E 就/ 在/ 边上/ 走路/ 五分钟/ 的/ 地方/E ,/ 46 | 3/ ./ ,/ 47 | 给/ 商家/E 打电话/N2 ,/ 48 | 关机/N2 。/ ,/ 49 | 4/ ./ ,/ 50 | 送/ 过来/ 之后/ 饼/E 凉/ 了/ ,/ 51 | 餐/ 凉/ 了/ ,/ 52 | 5/ ./ ,/ 53 | 肘子/ 肉/E 全/N2 是/N2 大/ 肥肉/E 和/ 青椒/E ,/ 54 | 量/ 也/N2 小/ 的/ 可怜/ 。/ ,/ 55 | 口感/E 我/E 就/ 不说/ 啥/ 了/ 。/ 56 | 千万/N2 别/N2 定/N2 57 | 粥/E 里/N2 的/N2 肉/E 不/N2 新鲜/N2 ,/ 58 | 饼/E 里/N2 有/N2 沙子/N2 ,/ 59 | 都/N2 是/N2 菜/E 都/N2 没/N2 几/N2 块/N2 肉/E 60 | 订/N2 完/N2 餐/E 到/N2 给/N2 我/E 打电话/N2 接/N2 餐/E 用/N2 了/N2 两个/N2 多/N2 小时/N2 ,/ 61 | 给/N2 我/E 打电话/N2 接/N2 餐/N2 到/N2 见到/ 外卖/E 小哥/ 用/N2 了/N2 半/N2 个/N2 小时/N2 ,/ 62 | 东西/E 东西/E 显然/ 已经/ 冰/ 了/ ,/ 63 | 吃/N2 个/N2 屁/N2 啊/N2 还/N2 ?/ ,/ 64 | 科科/N2 65 | 配送/E 员/E 提前/ 太久/ 打/ 了/ 电话/E 吧/ ,/ 66 | 零下/ 十五/ 度/ 让/ 人/ 穿着/ 睡衣/E 拖鞋/E 在外/E 面/ 等/ 了/ 五六/ 分钟/ 67 | 呵呵/N2 吧/N2 。/ 68 | 这/N2 配送/E 。/ 69 | 简直/N2 了/N2 。/ 70 | 没下/N2 次/N2 了/N2 71 | 肉/E 不/N2 烂/N2 ,/ 72 | 吃/N2 起来/N2 很难/N2 吃/N2 ,/ 73 | 唯一/N2 比较/N2 好/N2 的/ 就是/N2 包装/N2 很/N2 不错/N2 74 | 送/E 的/N1 太/N1 慢/N1 了/ ,/ 75 | 到/N2 了/N2 都/N2 不/N2 饿/N2 了/N2 76 | 两个/N2 小时送/N2 到/N2 ,/ 77 | 冰冰凉/N2 透/N2 心/N2 凉/N2 ,/ 78 | 鸡腿/E 肉/E 里/N2 有/N2 猪/E 肥肉/E 好几/N2 大块/N2 ,/ 79 | 品质/E 越来越/N1 差/N1 。/ 80 | 再见/N2 81 | 鸡腿/E 卷/E 没有/N2 以前/N2 好吃/N2 了/N2 82 | 都/N2 是/N2 凉/N2 的/N2 ,/ 83 | 配送/E 很/N2 慢/N2 !/ 84 | 都/N2 要/N2 三个/N2 小时/N2 85 | 竟/N2 让/N2 是/N2 冰凉/N2 的/N2 ,/ 86 | 呵呵/N2 ,/ 87 | 价钱/E 涨/N2 了/N2 ,/ 88 | 东西/E 倒是/N2 越来越/N2 次/N2 了/N2 89 | 2/N2 小时/N2 配送/N2 ?/ 90 | 每次/N1 配送E/你E 都/N1 这么/N1 慢/N1 !/ 91 | 你们/E 要好/N2 好想/N2 想/N2 了/N2 …/ …/ 92 | 差/N1 评/N1 差/N1 评/N1 ,/ 93 | 时间/E 太/N2 长/N2 ,/ 94 | 时间/E 将近/N2 2/N2 个/N2 小时/N2 95 | 粥/E 连/N2 个/N2 勺子/E 都/N2 没有/N2 ,/ 96 | 还/N2 凉/N2 的/N2 97 | 漏/N2 送/N2 了/N2 ,/ 98 | 最后/N2 补/N2 送/N2 了/N2 。/ 99 | 皮蛋/E 粥/E 真心/N2 有些/N2 不好/N2 。/ 100 | 送餐/E 两个/N2 半/N2 小时/N2 ,/ 101 | 别的/N2 不说/N2 了/N2 102 | 吃/N2 到/N2 最后/N2 出现/N2 一块/N2 面筋/E 状物/E 质/N2 ,/ 103 | 吃/N2 了/N2 一口一/N2 股/N2 浓烈/N2 的/ 杏仁/N2 苦味/N2 (/ 104 | 某种/N2 化学制/E 剂/ 的/ 味道/N2 )/ ,/ 105 | 直接/N2 吐/N2 了/N2 出来/N2 。/ 106 | 点/N2 的/N2 中/E 卷/E ,/ 107 | 比/N2 之前/N2 点/N2 的/N2 小/N2 很多/N2 ,/ 108 | 还/N2 慢/N2 ,/ 109 | 一个半/N2 小时/N2 ,/ 110 | 都/N2 凉/N2 了/N2 111 | 不好/N1 吃/N1 ,/ 112 | 而且/N2 感觉/N2 皮/E 粘粘/N2 的/N2 不/N2 熟/N2 似的/N2 113 | 迟到/ 2/N2 小时/N2 !/ ,/ 114 | 我的/N2 午餐/E 送餐员/E ,/ 115 | 已经/N2 迷失/N2 在/N2 帝都/E “/ 116 | 仙境/ ”/N2 117 | 中/N2 了/N2 。/ 。/ 。/ 118 | 眼看/N2 午饭/E 是/N2 吃不/N2 上了/N2 119 | 全/N2 凉/N2 了/N2 ,/ 120 | 面/E 都/N2 硬/N2 了/N2 。/ 121 | 送/N1 的/N1 慢/N1 可以/N1 理解/N1 ,/ 122 | 大冷/N2 天/N2 没用/N2 保温箱/E 还是/N2 奇葩/N2 的/N2 锡纸/E 包装/N2 ,/ 123 | 没法/N2 放/N2 微波炉/E 。/ 124 | 送来/N2 东西/E 都/N2 已经/N2 凉/N2 了/N2 ,/ 125 | 凉/N2 了/N2 味道/E 就/N2 不好/N2 了/N2 ,/ 126 | 太/N1 不靠/N1 谱/N1 127 | 上午/N2 10/N2 点/N2 半/N2 订/N2 的/N2 餐/E ,/ 128 | 一点/N2 才/N2 送到/N2 ,/ 129 | 都/N2 凉/N2 了/N2 ,/ 130 | 粥/E 连/N2 个/N2 勺子/E 都/N2 没有/N2 ,/ 131 | 怎么/N2 喝/N2 ?/ 132 | 南瓜/E 粥/E 淡/N2 的/N2 要死/N2 ,/ 133 | 皮蛋/E 瘦肉/E 粥/E 跟/N2 大米粥/E 差不多/N2 。/ 134 | 没/N2 啥/N2 东西/N2 。/ 135 | 备注/ 不要/ 辣椒/ ,/ 136 | 还是/ 放/ 了/ 辣椒/ ,/ 137 | 所以/ 放弃/ 当/ 吃货/ 的/ 机会/ 138 | 除了/N2 可乐/E ,/ 139 | 其他/N2 都/N2 差/N2 。/ 140 | 还/N2 送/N2 错/N2 了/N2 ,/ 141 | 我要/N2 的/N2 是/N2 鸡腿/E 肉/E ,/ 142 | 两/N2 单/N2 都/N2 送/N2 错/N2 !/ 143 | 快递/E 也/N2 不上/N2 楼/N2 。/ 144 | 粥/E 是/N2 凉/N2 的/N2 ,/ 145 | 卷/E 是/N2 错/N2 的/N2 ,/ 146 | 点/N2 的/N2 鸡腿/E 肉/E ,/ 147 | 给/ 的/ 是/ 红烧肉/E 一样/N2 的/N2 不知/N2 道/N2 什么/N2 卷/ ,/ 148 | 不知/ 道/ 我/E 不吃/ 大肉/E 吗/N2 ?/ 149 | 垃圾/E 送货/N2 电话/E 让/N2 下楼/N2 拿/N2 ,/ 150 | 我/E 问/ 为什么/N2 ,/ 151 | 他/E 笑/N2 一笑/N2 然后/N2 就/N2 上来/N2 送/N2 了/N2 ,/ 152 | 态度/E 反正/N2 很/N2 不爽/N2 ,/ 153 | 服务/E 差/N2 ,/ 154 | 卷/E 味道/E 也/N1 一般/N1 ,/ 155 | 还/N2 送/N2 错/N2 ,/ 156 | 根本/N2 没/N2 吃/N2 ,/ 157 | 都/N2 扔/N2 了/N2 158 | 非常/N1 差劲/N1 ,/ 159 | 饼/E 都/N2 破/N2 了/N2 ,/ 160 | 漏/N2 了/N2 我一/N2 裤子/E 油/N2 161 | 不是/N2 百度/E 吗/N2 ,/ 162 | 怎么/N2 变成/N2 了/N2 达达/E 。/ 163 | 而且/N2 包装/N2 全/N2 是/N2 油/E ,/ 164 | 我/N2 觉得/N2 诚信/N2 还是/N2 很/N2 重要/N2 吧/N2 。/ 165 | 送到/N2 都/N2 凉/N2 了/N2 ,/ 166 | 肥肉/E 多多/N2 多/N2 167 | 木耳/E 有一/N2 股/N2 奇怪/N2 的/N2 味道/E 。/ 168 | 肉/E 也/N1 有/N1 腥味/N1 ,/ 169 | 一般/N1 吧/N1 170 | -------------------------------------------------------------------------------- /WaiMaiMiner/crawler.py: -------------------------------------------------------------------------------- 1 | import re 2 | import json 3 | import requests 4 | 5 | """ 6 | First page url: 7 | http://waimai.baidu.com/waimai/user/address/select?display=json&_=1460210537402 8 | 9 | 1, get the number of the comment page 10 | 2, get the request json 11 | """ 12 | 13 | 14 | class Crawler: 15 | def __init__(self): 16 | self.base_url = "http://waimai.baidu.com/waimai/comment/getshop?display=" \ 17 | "json&shop_id=%s&page=%s&count=60" 18 | 19 | self.shop_id = None 20 | self.page_num = 1 21 | 22 | self.info = {} 23 | 24 | def crawl(self, url=None, shop_id=None): 25 | # get the shop id 26 | self._get_shop_id(url, shop_id) 27 | 28 | # get the fist page comment 29 | i = 0 30 | while i < self.page_num: 31 | self._get_json_request(self.base_url % (self.shop_id, i + 1)) 32 | i += 1 33 | 34 | # init the page_num variable and filter 35 | self.page_num = 1 36 | self._filter() 37 | 38 | return self.info 39 | 40 | def _filter(self): 41 | """ 42 | get the useful comment, get rid of rubbish comment. 43 | 44 | We use the maximum entropy to classify the polarity of the comment. 45 | maxEntClassifier's parameters are wrote into the file 46 | """ 47 | for i, sentence in enumerate(self.info["content"]): 48 | rubbish_comment = False 49 | 50 | if self._is_english(sentence): 51 | rubbish_comment = True 52 | elif self._is_numeric(sentence): 53 | rubbish_comment = True 54 | elif self._is_too_short(sentence): 55 | rubbish_comment = True 56 | elif self._is_word_repeat(sentence): 57 | rubbish_comment = True 58 | 59 | if rubbish_comment: 60 | if self.info["score"][i] >= 4: 61 | self.info["rubbish_comment_id"].append((i, 1)) 62 | else: 63 | self.info["rubbish_comment_id"].append((i, 0)) 64 | 65 | else: 66 | if self.info["score"][i] >= 4: 67 | self.info["useful_comment_id"].append((i, 1)) 68 | else: 69 | self.info["useful_comment_id"].append((i, 0)) 70 | 71 | @staticmethod 72 | def _is_too_short(sentence): 73 | """judge if the f_waimai is too short or the chinese characters are few 74 | if True, write to the abandoned file 75 | :param sentence: a f_waimai 76 | :return: True or False 77 | """ 78 | if len(sentence) < 5: 79 | return True 80 | if len(re.findall(r'[\u4e00-\u9fa5]', sentence)) <= len(sentence) * 0.4: 81 | return True 82 | return False 83 | 84 | @staticmethod 85 | def _is_numeric(sentence): 86 | """judge if the f_waimai's characters are all or almost numbers 87 | if True, write to the abandoned file 88 | :param sentence: a f_waimai 89 | :return: True or False 90 | """ 91 | match = re.findall("\d+", sentence) 92 | if match is not None and sum([len(m) for m in match]) >= len(sentence) * 0.75: 93 | return True 94 | return False 95 | 96 | @staticmethod 97 | def _is_english(sentence): 98 | """judge if the f_waimai's characters are all English 99 | if True, write to the abandoned file 100 | :param sentence: a f_waimai 101 | :return: True or False 102 | """ 103 | match = re.findall("[a-zA-Z]+", sentence) 104 | if match is not None and sum([len(m) for m in match]) >= len(sentence) * 0.75: 105 | return True 106 | return False 107 | 108 | @staticmethod 109 | def _is_word_repeat(sentence): 110 | """check if the f_waimai is always the repeat word 111 | :param sentence: a f_waimai 112 | :return: True or False 113 | """ 114 | repeat_words, length = [], 0 115 | for word in sentence: 116 | times = sentence.count(word) 117 | if times >= 4 and word not in repeat_words: 118 | repeat_words.append(word) 119 | length += times 120 | if length > len(sentence) / 2: 121 | return True 122 | return False 123 | 124 | def _get_shop_id(self, url, id): 125 | if url is not None: 126 | shop_id = re.search("\d+", url) 127 | if shop_id is None: 128 | raise ValueError("Bad url") 129 | 130 | self.shop_id = shop_id.group() 131 | 132 | elif id is not None: 133 | self.shop_id = id 134 | 135 | else: 136 | raise ValueError("Bad url") 137 | 138 | def _get_json_request(self, url): 139 | try: 140 | result = requests.get(url) 141 | except requests.ConnectionError: 142 | raise ValueError("requests.ConnectionError") 143 | 144 | content = json.loads(result.text) 145 | result = content["result"] 146 | if self.page_num == 1: 147 | self._get_initial_info(result) 148 | 149 | content = result["content"] 150 | 151 | for a_json in content: 152 | self._get_a_json_info(a_json) 153 | 154 | def _get_initial_info(self, result): 155 | # get the page number 156 | self.page_num = result["comment_num"] // 60 + 1 157 | 158 | # get the average score information 159 | average_score = {} 160 | average_score["average_dish_score"] = float(result["average_dish_score"]) 161 | average_score["average_service_score"] = float(result["average_service_score"]) 162 | average_score["average_score"] = float(result["average_score"]) 163 | self.info["average_score"] = average_score 164 | 165 | # get the score detail 166 | self.info["score_detail"] = result["score_detail"] 167 | 168 | # get the weeks score 169 | weeks_score = {} 170 | for key, value in result["weeks_score"].items(): 171 | weeks_score[key] = float(value) 172 | self.info["weeks_score"] = weeks_score 173 | 174 | # get the recommend dished 175 | self.info["recommend_dishes"] = result["recommend_dishes"] 176 | 177 | # get the comment num 178 | self.info["comment_num"] = result['comment_num'] 179 | 180 | # initialize the self.info variable 181 | self.info["content"] = [] 182 | self.info["cost_time"] = [] 183 | self.info["service_score"] = [] 184 | self.info["dish_score"] = [] 185 | self.info["sfrom"] = [] 186 | self.info["score"] = [] 187 | self.info["create_time"] = [] 188 | self.info["arrive_time"] = [] 189 | self.info["useful_comment_id"] = [] 190 | self.info["rubbish_comment_id"] = [] 191 | 192 | def _get_a_json_info(self, a_json): 193 | self.info["content"].append(a_json["content"]) 194 | self.info["cost_time"].append(a_json["cost_time"]) 195 | self.info["service_score"].append(int(a_json["service_score"])) 196 | self.info["dish_score"].append(int(a_json["dish_score"])) 197 | self.info["score"].append(int(a_json["score"])) 198 | self.info["sfrom"].append(a_json["sfrom"][3:] if "na-" in a_json["sfrom"] else a_json["sfrom"]) 199 | self.info["create_time"].append(a_json["create_time"]) 200 | self.info["arrive_time"].append(a_json["arrive_time"]) 201 | 202 | 203 | _crawler = Crawler() 204 | crawl = _crawler.crawl 205 | 206 | 207 | def __test1(): 208 | shop_id = "1430806214" 209 | shop_id = "1452459851" 210 | # id = "1438397794" 211 | crawler = Crawler() 212 | a = crawler.crawl(shop_id) 213 | pass 214 | 215 | 216 | if __name__ == "__main__": 217 | pass 218 | __test1() 219 | -------------------------------------------------------------------------------- /WaiMaiMiner/visualization.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | from pylab import mpl 3 | from random import choice 4 | 5 | # set the font 6 | mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 7 | mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 8 | 9 | 10 | def score_detail(result): 11 | if result is not None: 12 | # plt.clf() 13 | 14 | label_scores = sorted(result["score_detail"].items()) 15 | 16 | # labels 17 | labels = "1分", "2分", "3分", "4分", "5分" 18 | # sizes 19 | sizes = [pair[1] for pair in label_scores] 20 | # explode 21 | the_max = max(sizes) 22 | the_index = sizes.index(the_max) 23 | explode = [0, 0, 0, 0, 0] 24 | explode[the_index] = 0.1 25 | explode = tuple(explode) 26 | # colors 27 | colors = ['yellowgreen', "gold", "lightskyblue", "lightcoral", "blueviolet"] 28 | # patches and texts 29 | plt.pie(sizes, explode=explode, labels=labels, colors=colors, 30 | autopct="%1.2f%%", shadow=True, startangle=0) 31 | plt.title("店铺整体评分分布", loc="left", fontsize=20) 32 | plt.axis("equal") 33 | 34 | plt.show() 35 | 36 | 37 | def dish_score_detail(result): 38 | if result is not None: 39 | # plt.clf() 40 | 41 | label_scores = result["dish_score"] 42 | 43 | # labels 44 | labels = "1分", "2分", "3分", "4分", "5分" 45 | # sizes 46 | sizes = [label_scores.count(i) for i in range(5)] 47 | # explode 48 | the_max = max(sizes) 49 | the_index = sizes.index(the_max) 50 | explode = [0, 0, 0, 0, 0] 51 | explode[the_index] = 0.1 52 | explode = tuple(explode) 53 | # colors 54 | colors = ['yellowgreen', "gold", "lightskyblue", "lightcoral", "blueviolet"] 55 | # patches and texts 56 | plt.pie(sizes, explode=explode, labels=labels, colors=colors, 57 | autopct="%1.2f%%", shadow=True, startangle=0) 58 | plt.title("商品质量评分分布", loc="left", fontsize=20) 59 | plt.axis("equal") 60 | 61 | plt.show() 62 | 63 | 64 | def service_score_detail(result): 65 | if result is not None: 66 | # plt.clf() 67 | 68 | label_scores = result["service_score"] 69 | 70 | # labels 71 | labels = "1分", "2分", "3分", "4分", "5分" 72 | # sizes 73 | sizes = [label_scores.count(i) for i in range(5)] 74 | # explode 75 | the_max = max(sizes) 76 | the_index = sizes.index(the_max) 77 | explode = [0, 0, 0, 0, 0] 78 | explode[the_index] = 0.1 79 | explode = tuple(explode) 80 | # colors 81 | colors = ['yellowgreen', "gold", "lightskyblue", "lightcoral", "blueviolet"] 82 | # patches and texts 83 | plt.pie(sizes, explode=explode, labels=labels, colors=colors, 84 | autopct="%1.2f%%", shadow=True, startangle=0) 85 | plt.title("配送服务评分分布", loc="left", fontsize=20) 86 | plt.axis("equal") 87 | 88 | plt.show() 89 | 90 | 91 | def bar_auto_label(rects, suffix="分"): 92 | colors = ["g", "r", "c", "m", "y", "b", "chartreuse", "lightgreen", "skyblue", 93 | "dodgerblue", "slateblue", "blueviolet", "purple", "mediumorchid", 94 | "fuchsia", "hotpink", "lightcoral", "coral", "darkorange", "olive", 95 | "lawngreen", "yellowgreen", "springgreen", "cyan", "indigo", "darkmagenta", 96 | "orchid", "lightpink", "darkred", "orangered", "goldenrod", "lime", "aqua", 97 | "steelblue", "plum", "m", "tomato", "greenyellow", "darkgreen", "darkcyan", 98 | "violet", "crimson"] 99 | 100 | for i, rect in enumerate(rects): 101 | height = rect.get_height() 102 | plt.text(rect.get_x() + rect.get_width() / 2, 1.01 * height, "%s%s" % (float(height), suffix)) 103 | color = choice(colors) 104 | colors.remove(color) 105 | rect.set_color(color) 106 | 107 | 108 | def average_score(result): 109 | if result is not None: 110 | # plt.clf() 111 | 112 | average_scores = result["average_score"] 113 | 114 | title = "各项评价平均指标" 115 | y_label = "分数" 116 | 117 | labels = ("商品质量", "配送服务", "整体评价") 118 | label_pos = (0, 1, 2) 119 | heights = (average_scores["average_dish_score"], 120 | average_scores["average_service_score"], 121 | average_scores["average_score"]) 122 | 123 | plt.title(title, fontsize=20) 124 | plt.ylabel(y_label) 125 | plt.ylim(0, 5) 126 | 127 | plt.xticks(label_pos, labels) 128 | rects = plt.bar(left=label_pos, height=heights, width=0.35, align="center") 129 | bar_auto_label(rects) 130 | 131 | plt.show() 132 | 133 | 134 | def weeks_score(result): 135 | if result is not None: 136 | # plt.clf() 137 | 138 | weeks_score_ = result["weeks_score"] 139 | 140 | title = "整体评价变化趋势" 141 | y_label = "分数" 142 | labels = ("近三周总体评价", "近两周总体评价", "近一周总体评价") 143 | label_pos = tuple(range(len(labels))) 144 | heights = (weeks_score_["last_three_week"], 145 | weeks_score_["last_two_week"], 146 | weeks_score_["last_one_week"]) 147 | plt.title(title, fontsize=20) 148 | plt.ylabel(y_label) 149 | plt.ylim(0, 5) 150 | plt.xticks(label_pos, labels) 151 | 152 | rects = plt.bar(left=label_pos, height=heights, width=0.35, align="center") 153 | bar_auto_label(rects) 154 | 155 | plt.show() 156 | 157 | 158 | def s_from(result): 159 | if result is not None: 160 | # plt.clf() 161 | 162 | sfrom = result["sfrom"] 163 | # title 164 | title = "订餐终端分布" 165 | # total sources 166 | sources = tuple(set(sfrom)) 167 | # size 168 | sizes = [sfrom.count(source) for source in sources] 169 | # colors 170 | colors = ['yellowgreen', "gold", "lightskyblue", "lightcoral", "blueviolet"] 171 | # pie 172 | plt.pie(sizes, labels=sources, colors=colors, 173 | autopct="%1.2f%%", shadow=True, startangle=0) 174 | plt.title(title, loc="left", fontsize=20) 175 | plt.axis("equal") 176 | plt.show() 177 | 178 | 179 | def recommend_dishes1(result): 180 | if result is not None: 181 | # plt.clf() 182 | 183 | recommend_dishes = sorted(result["recommend_dishes"].items(), 184 | key=lambda dish: dish[1], reverse=True)[:20] 185 | title = "菜品推荐榜" 186 | y_label = "次数" 187 | labels = [dish[0] for dish in recommend_dishes] 188 | label_pos = tuple(range(len(labels))) 189 | heights = tuple([dish[1] for dish in recommend_dishes]) 190 | 191 | plt.title(title, fontsize=20) 192 | plt.ylabel(y_label) 193 | # plt.margins(0.05) 194 | plt.xticks(label_pos, labels, rotation=40) 195 | 196 | rects = plt.bar(left=label_pos, height=heights, width=0.35, align="center") 197 | bar_auto_label(rects, "次") 198 | plt.subplots_adjust(bottom=0.2) 199 | 200 | plt.show() 201 | 202 | 203 | def barh_auto_label(rects, suffix="次"): 204 | colors = ["g", "r", "c", "m", "y", "b", "chartreuse", "lightgreen", "skyblue", 205 | "dodgerblue", "slateblue", "blueviolet", "purple", "mediumorchid", 206 | "fuchsia", "hotpink", "lightcoral", "coral", "darkorange", "olive", 207 | "lawngreen", "yellowgreen", "springgreen", "cyan", "indigo", "darkmagenta", 208 | "orchid", "lightpink", "darkred", "orangered", "goldenrod", "lime", "aqua", 209 | "steelblue", "plum", "m", "tomato", "greenyellow", "darkgreen", "darkcyan", 210 | "violet", "crimson"] 211 | 212 | for i, rect in enumerate(rects): 213 | width = rect.get_width() 214 | plt.text(1.01 * width, rect.get_y(), "%s%s" % (int(width), suffix)) 215 | color = choice(colors) 216 | colors.remove(color) 217 | rect.set_color(color) 218 | 219 | 220 | def recommend_dishes2(result): 221 | if result is not None: 222 | # plt.clf() 223 | 224 | recommend_dishes = sorted(result["recommend_dishes"].items(), 225 | key=lambda dish: dish[1])[-30:] 226 | title = "菜品推荐榜(前30)" 227 | x_label = "次数" 228 | labels = [dish[0] for dish in recommend_dishes] 229 | label_pos = tuple(range(len(labels))) 230 | heights = tuple([dish[1] for dish in recommend_dishes]) 231 | 232 | plt.title(title, fontsize=20) 233 | plt.xlabel(x_label) 234 | plt.yticks(label_pos, labels) 235 | 236 | rects = plt.barh(bottom=label_pos, width=heights, alpha=0.35, align="center") 237 | barh_auto_label(rects) 238 | 239 | plt.show() 240 | 241 | 242 | def cost_time(result): 243 | if result is not None: 244 | # plt.clf() 245 | 246 | cost_times = result["cost_time"] 247 | 248 | title = "送餐时间分布" 249 | 250 | sources = ("非常快\n(15min内)", "比较快\n(15-30min内)", "比较慢\n(30-60min内)", 251 | "很慢\n(60-100min内)", "简直无法忍受\n(大于100min)") 252 | sizes = [0] * len(sources) 253 | for a_time in cost_times: 254 | if a_time <= 15: 255 | sizes[0] += 1 256 | elif a_time <= 30: 257 | sizes[1] += 1 258 | elif a_time <= 60: 259 | sizes[2] += 1 260 | elif a_time <= 100: 261 | sizes[3] += 1 262 | else: 263 | sizes[4] += 1 264 | colors = ['yellowgreen', "gold", "lightskyblue", "lightcoral", "blueviolet"] 265 | # explode 266 | the_max = max(sizes) 267 | the_index = sizes.index(the_max) 268 | explode = [0, 0, 0, 0, 0] 269 | explode[the_index] = 0.1 270 | explode = tuple(explode) 271 | # pie 272 | plt.pie(sizes, labels=sources, colors=colors, explode=explode, 273 | autopct="%1.2f%%", shadow=True, startangle=0) 274 | plt.title(title, loc="left", fontsize=20) 275 | plt.axis("equal") 276 | plt.show() 277 | 278 | 279 | def topic(result): 280 | from random import randint 281 | if result: 282 | 283 | fig, ax = plt.subplots() 284 | 285 | index = tuple(range(5)) 286 | h1 = [] 287 | h2 = [] 288 | for i in range(5): 289 | h1.append(randint(20, 50)) 290 | h2.append(randint(-10, -2)) 291 | 292 | a = ax.barh(index, h1, color="r", alpha=.5) 293 | b = ax.barh(index, h2, color="b", alpha=.5) 294 | ax.set_yticks([i + 0.5 for i in index]) 295 | ax.set_yticklabels(("服务", "份量", "配送", "味道", "其他")) 296 | ax.margins(0.2) 297 | ax.legend((a[0], b[0]), ('好评', '差评')) 298 | plt.show() 299 | 300 | 301 | def _test(): 302 | from WaiMaiMiner import crawler 303 | 304 | # get the crawler info 305 | shop_id = "1452459851" 306 | result = crawler.crawl(shop_id) 307 | 308 | score_detail(result) 309 | dish_score_detail(result) 310 | service_score_detail(result) 311 | average_score(result) 312 | weeks_score(result) 313 | s_from(result) 314 | # recommend_dishes1(result) 315 | recommend_dishes2(result) 316 | cost_time(result) 317 | 318 | 319 | if __name__ == "__main__": 320 | pass 321 | _test() 322 | # topic(1) 323 | 324 | 325 | -------------------------------------------------------------------------------- /fgom/f_hmm/transition_prob.txt: -------------------------------------------------------------------------------- 1 | B-E 0.7894117647058823683536843418551143258810043334960937500000000000000000000000000000000000000000000000 E-E 671 2 | B-E 0.2105882352941176594018912737737991847097873687744140625000000000000000000000000000000000000000000000 M-E 179 3 | B-N1 0.5899999999999999689137553104956168681383132934570312500000000000000000000000000000000000000000000000 E-N1 413 4 | B-N1 0.4099999999999999755750934582465561106801033020019531250000000000000000000000000000000000000000000000 M-N1 287 5 | B-N2 0.2603068072866730475745100648055085912346839904785156250000000000000000000000000000000000000000000000 E-N2 543 6 | B-N2 0.7396931927133268969143387039366643875837326049804687500000000000000000000000000000000000000000000000 M-N2 1543 7 | B-P1 0.8109065155807365643525486120779532939195632934570312500000000000000000000000000000000000000000000000 E-P1 1145 8 | B-P1 0.1890934844192634634030270035509602166712284088134765625000000000000000000000000000000000000000000000 M-P1 267 9 | B-P2 0.1147540983606557402074699325567053165286779403686523437500000000000000000000000000000000000000000000 E-P2 21 10 | B-P2 0.8852459016393442459147422596288379281759262084960937500000000000000000000000000000000000000000000000 M-P2 162 11 | E-E 0.0012195121951219512184544369048921907960902899503707885742187500000000000000000000000000000000000000 B-E 1 12 | E-E 0.1085365853658536577919235810441023204475641250610351562500000000000000000000000000000000000000000000 B-N1 89 13 | E-E 0.1329268292682926899672679610375780612230300903320312500000000000000000000000000000000000000000000000 B-N2 109 14 | E-E 0.2317073170731707432157264747729641385376453399658203125000000000000000000000000000000000000000000000 B-P1 190 15 | E-E 0.0158536585365853660567481142606993671506643295288085937500000000000000000000000000000000000000000000 B-P2 13 16 | E-E 0.0097560975609756097476354952391375263687223196029663085937500000000000000000000000000000000000000000 I-E 8 17 | E-E 0.0207317073170731717979275998686716775409877300262451171875000000000000000000000000000000000000000000 I-N1 17 18 | E-E 0.0256097560975609740696601335230297991074621677398681640625000000000000000000000000000000000000000000 I-N2 21 19 | E-E 0.0743902439024390210731141337419103365391492843627929687500000000000000000000000000000000000000000000 I-P1 61 20 | E-E 0.0060975609756097563091126190215618407819420099258422851562500000000000000000000000000000000000000000 I-P2 5 21 | E-E 0.3731707317073170715460150859144050627946853637695312500000000000000000000000000000000000000000000000 OT 306 22 | E-N1 0.0136752136752136752018138565745175583288073539733886718750000000000000000000000000000000000000000000 B-E 8 23 | E-N1 0.0205128205128205128027207848617763374932110309600830078125000000000000000000000000000000000000000000 B-N1 12 24 | E-N1 0.0358974358974358948026761595428979489952325820922851562500000000000000000000000000000000000000000000 B-N2 21 25 | E-N1 0.0017094017094017094002267320718146947911009192466735839843750000000000000000000000000000000000000000 B-P1 1 26 | E-N1 0.0410256410256410256054415697235526749864220619201660156250000000000000000000000000000000000000000000 I-E 24 27 | E-N1 0.0051282051282051282006801962154440843733027577400207519531250000000000000000000000000000000000000000 I-N1 3 28 | E-N1 0.0051282051282051282006801962154440843733027577400207519531250000000000000000000000000000000000000000 I-N2 3 29 | E-N1 0.8769230769230769162447813869221135973930358886718750000000000000000000000000000000000000000000000000 OT 513 30 | E-N2 0.0300333704115684080315773485381214413791894912719726562500000000000000000000000000000000000000000000 B-E 54 31 | E-N2 0.0111234705228031149210066175214706163387745618820190429687500000000000000000000000000000000000000000 B-N1 20 32 | E-N2 0.0228031145717463856747997397178551182150840759277343750000000000000000000000000000000000000000000000 B-N2 41 33 | E-N2 0.0027808676307007787302516543803676540846936404705047607421875000000000000000000000000000000000000000 B-P1 5 34 | E-N2 0.0011123470522803114487325748527268842735793441534042358398437500000000000000000000000000000000000000 B-P2 2 35 | E-N2 0.1256952169076751835152805369943962432444095611572265625000000000000000000000000000000000000000000000 I-E 226 36 | E-N2 0.0050055617352614016277168040858214226318523287773132324218750000000000000000000000000000000000000000 I-N1 9 37 | E-N2 0.0038932146829810899621437947359936515567824244499206542968750000000000000000000000000000000000000000 I-N2 7 38 | E-N2 0.0005561735261401557243662874263634421367896720767021179199218750000000000000000000000000000000000000 I-P1 1 39 | E-N2 0.7969966629588431938913117846823297441005706787109375000000000000000000000000000000000000000000000000 OT 1433 40 | E-P1 0.0231213872832369930765405996453409898094832897186279296875000000000000000000000000000000000000000000 B-E 28 41 | E-P1 0.0008257638315441783241621642730478924931958317756652832031250000000000000000000000000000000000000000 B-N1 1 42 | E-P1 0.0363336085879438497325821799677214585244655609130859375000000000000000000000000000000000000000000000 B-P1 44 43 | E-P1 0.0082576383154417832416216427304789249319583177566528320312500000000000000000000000000000000000000000 B-P2 10 44 | E-P1 0.0404624277456647404860312633445573737844824790954589843750000000000000000000000000000000000000000000 I-E 49 45 | E-P1 0.0115606936416184965382702998226704949047416448593139648437500000000000000000000000000000000000000000 I-P1 14 46 | E-P1 0.0008257638315441783241621642730478924931958317756652832031250000000000000000000000000000000000000000 I-P2 1 47 | E-P1 0.8786127167630057854808001138735562562942504882812500000000000000000000000000000000000000000000000000 OT 1064 48 | E-P2 0.0602409638554216864125834263177239336073398590087890625000000000000000000000000000000000000000000000 B-E 10 49 | E-P2 0.0120481927710843379764060756542676244862377643585205078125000000000000000000000000000000000000000000 B-N2 2 50 | E-P2 0.0783132530120481951119160157759324647486209869384765625000000000000000000000000000000000000000000000 B-P1 13 51 | E-P2 0.0120481927710843379764060756542676244862377643585205078125000000000000000000000000000000000000000000 B-P2 2 52 | E-P2 0.0602409638554216864125834263177239336073398590087890625000000000000000000000000000000000000000000000 I-E 10 53 | E-P2 0.0240963855421686759528121513085352489724755287170410156250000000000000000000000000000000000000000000 I-P1 4 54 | E-P2 0.7530120481927711217906562524149194359779357910156250000000000000000000000000000000000000000000000000 OT 125 55 | I-E 0.0004725897920604915061933148923145608932827599346637725830078125000000000000000000000000000000000000 B-E 1 56 | I-E 0.0973534971644612473484770021059375721961259841918945312500000000000000000000000000000000000000000000 B-N1 206 57 | I-E 0.2008506616257088872590230721471016295254230499267578125000000000000000000000000000000000000000000000 B-N2 425 58 | I-E 0.2183364839319470729339656145384651608765125274658203125000000000000000000000000000000000000000000000 B-P1 462 59 | I-E 0.0080340264650283557679166790421732002869248390197753906250000000000000000000000000000000000000000000 B-P2 17 60 | I-E 0.0056710775047258982911602132048756175208836793899536132812500000000000000000000000000000000000000000 I-E 12 61 | I-E 0.0137051039697542540590768922470488178078085184097290039062500000000000000000000000000000000000000000 I-N1 29 62 | I-E 0.0534026465028355420971983846811781404539942741394042968750000000000000000000000000000000000000000000 I-N2 113 63 | I-E 0.1455576559546313819559770763589767739176750183105468750000000000000000000000000000000000000000000000 I-P1 308 64 | I-E 0.0004725897920604915061933148923145608932827599346637725830078125000000000000000000000000000000000000 I-P2 1 65 | I-E 0.2561436672967863925620690679352264851331710815429687500000000000000000000000000000000000000000000000 OT 542 66 | I-N1 0.0139860139860139860018550805875747755635529756546020507812500000000000000000000000000000000000000000 B-E 2 67 | I-N1 0.0069930069930069930009275402937873877817764878273010253906250000000000000000000000000000000000000000 B-N1 1 68 | I-N1 0.0559440559440559440074203223502991022542119026184082031250000000000000000000000000000000000000000000 B-N2 8 69 | I-N1 0.1048951048951048958812748423952143639326095581054687500000000000000000000000000000000000000000000000 I-E 15 70 | I-N1 0.0069930069930069930009275402937873877817764878273010253906250000000000000000000000000000000000000000 I-N1 1 71 | I-N1 0.0279720279720279720037101611751495511271059513092041015625000000000000000000000000000000000000000000 I-N2 4 72 | I-N1 0.0069930069930069930009275402937873877817764878273010253906250000000000000000000000000000000000000000 I-P1 1 73 | I-N1 0.7762237762237762517258943262277171015739440917968750000000000000000000000000000000000000000000000000 OT 111 74 | I-N2 0.0595533498759305210401571173406409798189997673034667968750000000000000000000000000000000000000000000 B-E 24 75 | I-N2 0.0347394540942928056748151277588476659730076789855957031250000000000000000000000000000000000000000000 B-N1 14 76 | I-N2 0.0372208436724565730480129843726899707689881324768066406250000000000000000000000000000000000000000000 B-N2 15 77 | I-N2 0.3647642679900744422383240816998295485973358154296875000000000000000000000000000000000000000000000000 I-E 147 78 | I-N2 0.0049627791563275434200130931117200816515833139419555664062500000000000000000000000000000000000000000 I-N2 2 79 | I-N2 0.4987593052109181024356132638786220923066139221191406250000000000000000000000000000000000000000000000 OT 201 80 | I-P1 0.0335766423357664253734888859526108717545866966247558593750000000000000000000000000000000000000000000 B-E 23 81 | I-P1 0.0014598540145985400545008969785953922837506979703903198242187500000000000000000000000000000000000000 B-N2 1 82 | I-P1 0.0350364963503649665121919554167106980457901954650878906250000000000000000000000000000000000000000000 B-P1 24 83 | I-P1 0.0072992700729927004893449193900778482202440500259399414062500000000000000000000000000000000000000000 B-P2 5 84 | I-P1 0.0481751824817518228827317727791523793712258338928222656250000000000000000000000000000000000000000000 I-E 33 85 | I-P1 0.0014598540145985400545008969785953922837506979703903198242187500000000000000000000000000000000000000 I-N1 1 86 | I-P1 0.0058394160583941602180035879143815691350027918815612792968750000000000000000000000000000000000000000 I-P1 4 87 | I-P1 0.8671532846715328535225353334681130945682525634765625000000000000000000000000000000000000000000000000 OT 594 88 | I-P2 0.1538461538461538546940232663473580032587051391601562500000000000000000000000000000000000000000000000 B-E 4 89 | I-P2 0.1538461538461538546940232663473580032587051391601562500000000000000000000000000000000000000000000000 B-P1 4 90 | I-P2 0.2692307692307692179589651004789629951119422912597656250000000000000000000000000000000000000000000000 I-E 7 91 | I-P2 0.0384615384615384636735058165868395008146762847900390625000000000000000000000000000000000000000000000 I-P1 1 92 | I-P2 0.3846153846153846367350581658683950081467628479003906250000000000000000000000000000000000000000000000 OT 10 93 | M-E 0.8240740740740740699621369458327535539865493774414062500000000000000000000000000000000000000000000000 E-E 178 94 | M-E 0.1759259259259259300378630541672464460134506225585937500000000000000000000000000000000000000000000000 M-E 38 95 | M-N1 0.6415094339622641195219898690993431955575942993164062500000000000000000000000000000000000000000000000 E-N1 272 96 | M-N1 0.3584905660377358249668588996428297832608222961425781250000000000000000000000000000000000000000000000 M-N1 152 97 | M-N2 0.4523957685127567018845695656636962667107582092285156250000000000000000000000000000000000000000000000 E-N2 1454 98 | M-N2 0.5476042314872433536265816655941307544708251953125000000000000000000000000000000000000000000000000000 M-N2 1760 99 | M-P1 0.7784256559766763450269877466780599206686019897460937500000000000000000000000000000000000000000000000 E-P1 267 100 | M-P1 0.2215743440233236272174366376930265687406063079833984375000000000000000000000000000000000000000000000 M-P1 76 101 | M-P2 0.3740648379052369243424891465110704302787780761718750000000000000000000000000000000000000000000000000 E-P2 150 102 | M-P2 0.6259351620947630756575108534889295697212219238281250000000000000000000000000000000000000000000000000 M-P2 251 103 | OT 0.0284987277353689581749218717732219374738633632659912109375000000000000000000000000000000000000000000 B-E 168 104 | OT 0.0134011874469889737809813468061292951460927724838256835937500000000000000000000000000000000000000000 B-N1 79 105 | OT 0.0293469041560644600119545089000894222408533096313476562500000000000000000000000000000000000000000000 B-N2 173 106 | OT 0.0118744698897370656170968672427079582121223211288452148437500000000000000000000000000000000000000000 B-P1 70 107 | OT 0.0006785411365564037247666284713432105490937829017639160156250000000000000000000000000000000000000000 B-P2 4 108 | OT 0.0481764206955046653257923594537714961916208267211914062500000000000000000000000000000000000000000000 I-E 284 109 | OT 0.0052586938083121290837818051500107685569673776626586914062500000000000000000000000000000000000000000 I-N1 31 110 | OT 0.0093299406276505514323815759780700318515300750732421875000000000000000000000000000000000000000000000 I-N2 55 111 | OT 0.0052586938083121290837818051500107685569673776626586914062500000000000000000000000000000000000000000 I-P1 31 112 | OT 0.0005089058524173027935749713535074079118203371763229370117187500000000000000000000000000000000000000 I-P2 3 113 | OT 0.8476675148430873329985502095951233059167861938476562500000000000000000000000000000000000000000000000 OT 4997 114 | -------------------------------------------------------------------------------- /fgom/HMM.py: -------------------------------------------------------------------------------- 1 | import os 2 | from math import log 3 | 4 | from fgom import common_lib 5 | 6 | 7 | class OpinionMinerHMM: 8 | """ 9 | The supervised fine-grain (aspect) opinion mining 10 | """ 11 | def __init__(self): 12 | # the import parameters 13 | self._tags = {} 14 | self._init_prob = {} 15 | self._emit_prob = {} 16 | self._transition_prob = {} 17 | 18 | # the filepath parameters 19 | self._infinitesimal = 1e-20 20 | self._tag_num_filepath = common_lib.miner_hmm_tag_num_filepath 21 | self._init_filepath = common_lib.miner_hmm_init_filepath 22 | self._emit_filepath = common_lib.miner_hmm_emit_filepath 23 | self._transition_filepath = common_lib.miner_hmm_transition_filepath 24 | self._hmm_train_corpus = common_lib.miner_hmm_train_corpus_filepath 25 | self._hmm_user_add_corpus = common_lib.miner_hmm_user_add_corpus_filepath 26 | 27 | # check if there exists the init file 28 | self._check() 29 | 30 | def _check(self): 31 | prob_file_exist = True 32 | if not os.path.exists(self._tag_num_filepath): 33 | prob_file_exist = False 34 | if not os.path.exists(self._init_filepath): 35 | prob_file_exist = False 36 | if not os.path.exists(self._emit_filepath): 37 | prob_file_exist = False 38 | if not os.path.exists(self._transition_filepath): 39 | prob_file_exist = False 40 | 41 | if not prob_file_exist: 42 | print("Need Train OpinionMinerHMM") 43 | else: 44 | self._init() 45 | 46 | def _init(self): 47 | with open(self._tag_num_filepath, encoding="utf-8") as f: 48 | for line in f: 49 | splits = line.strip().split("\t") 50 | word = splits[0] 51 | num = int(splits[1]) 52 | self._tags[word] = num 53 | 54 | with open(self._init_filepath, encoding="utf-8") as f: 55 | for line in f: 56 | splits = line.strip().split("\t") 57 | tag = splits[0] 58 | prob = float(splits[1]) 59 | self._init_prob[tag] = prob 60 | 61 | with open(self._emit_filepath, encoding="utf-8") as f: 62 | for line in f: 63 | splits = line.strip().split("\t") 64 | tag = splits[0] 65 | prob = float(splits[1]) 66 | word = splits[2] 67 | if tag not in self._emit_prob: 68 | self._emit_prob[tag] = {} 69 | self._emit_prob[tag][word] = prob 70 | 71 | with open(self._transition_filepath, encoding="utf-8") as f: 72 | for line in f: 73 | splits = line.strip().split("\t") 74 | tag1 = splits[0] 75 | prob = float(splits[1]) 76 | tag2 = splits[2] 77 | if tag1 not in self._transition_prob: 78 | self._transition_prob[tag1] = {} 79 | self._transition_prob[tag1][tag2] = prob 80 | 81 | def train(self, corpus_filename=None): 82 | if corpus_filename is not None: 83 | self._hmm_train_corpus = os.path.join(os.getcwd(), corpus_filename) 84 | 85 | if self._hmm_train_corpus is None: 86 | raise ValueError("HMM need train.") 87 | 88 | # declare some variables 89 | tags_num = {} # record the number of each tag 90 | init_num = {} # record the number of the initial number 91 | transition_num = {} # record the number of the transition numbers between tags 92 | emit_num = {} # record the number of the the emit numbers between word and tag 93 | 94 | # open the file, read each line one by one 95 | for filepath in [self._hmm_train_corpus, self._hmm_user_add_corpus]: 96 | if not os.path.exists(filepath): 97 | continue 98 | 99 | with open(filepath, encoding="utf-8") as f: 100 | for line in f: 101 | # split the line into the several splits 102 | splits = common_lib.re_space_split.split(line.strip()) 103 | 104 | # establish two lists to record the word and the tag 105 | line_words = [] 106 | line_tags = [] 107 | 108 | for a_split in splits: 109 | # split every previous split into word and tag 110 | results = a_split.split("/") 111 | line_words.append(results[0]) 112 | line_tags.append(results[1]) 113 | 114 | # get the length of two lists 115 | length = len(line_words) 116 | assert length == len(line_tags) 117 | 118 | # count the number of init, emit and transition 119 | 120 | # count the init 121 | tag = line_tags[0] 122 | init_num[tag] = init_num.get(tag, 0) + 1 123 | 124 | # count the transition 125 | for i in range(length - 1): 126 | tag1 = line_tags[i] 127 | tag2 = line_tags[i + 1] 128 | if tag1 not in transition_num: 129 | transition_num[tag1] = {} 130 | transition_num[tag1][tag2] = transition_num[tag1].get(tag2, 0) + 1 131 | 132 | # count the emit and tag's number 133 | for i in range(length): 134 | tag = line_tags[i] 135 | word = line_words[i] 136 | if tag not in emit_num: 137 | emit_num[tag] = {} 138 | emit_num[tag][word] = emit_num[tag].get(word, 0) + 1 139 | tags_num[tag] = tags_num.get(tag, 0) + 1 140 | 141 | # count the probability of the self.init_prob, self.emit_prob, self.transition_prob 142 | # and write them into the file 143 | 144 | # write the tag num 145 | with open(self._tag_num_filepath, mode="w", encoding="utf-8") as f: 146 | self._tags = tags_num 147 | for tag, num in sorted(tags_num.items()): 148 | f.write("%s\t%d\n" % (tag, num)) 149 | 150 | # write the init probability 151 | with open(self._init_filepath, mode="w", encoding="utf-8") as f: 152 | total = sum(init_num.values()) 153 | for tag, num in sorted(init_num.items()): 154 | prob = num / total 155 | self._init_prob[tag] = prob 156 | f.write("%s\t%.100f\t%d\n" % (tag, prob, num)) 157 | 158 | # write the transition probability 159 | with open(self._transition_filepath, mode="w", encoding="utf-8") as f: 160 | # get the tag and the transition tag 161 | for tag1 in sorted(transition_num.keys()): 162 | tag_dict = transition_num[tag1] 163 | total = sum(tag_dict.values()) 164 | self._transition_prob[tag1] = {} 165 | for tag2 in sorted(tag_dict.keys()): 166 | num = tag_dict[tag2] 167 | prob = num / total 168 | self._transition_prob[tag1][tag2] = prob 169 | f.write("%s\t%.100f\t%s\t%d\n" % (tag1, prob, tag2, num)) 170 | 171 | # write the emit probability 172 | with open(self._emit_filepath, mode="w", encoding="utf-8") as f: 173 | for tag in sorted(emit_num.keys()): 174 | tag_dict = emit_num[tag] 175 | total = sum(tag_dict.values()) 176 | self._emit_prob[tag] = {} 177 | for word in sorted(tag_dict.keys()): 178 | num = tag_dict[word] 179 | prob = num / total 180 | self._emit_prob[tag][word] = prob 181 | f.write("%s\t%.100f\t%s\t%d\n" % (tag, prob, word, num)) 182 | 183 | def _viterbi(self, observation): 184 | # record the first path and first probability 185 | prob_a = {} 186 | path_a = {} 187 | 188 | # initialize 189 | for tag in self._tags.keys(): 190 | path_a[tag] = [tag] 191 | prob_a[tag] = log(self._init_prob.get(tag, self._infinitesimal)) + \ 192 | log(self._emit_prob[tag].get(observation[0], self._infinitesimal)) 193 | 194 | # traversal the observation 195 | for i in range(1, len(observation)): 196 | # copy the previous prob and path 197 | # and initialize the new prob and path 198 | prob_b = prob_a 199 | path_b = path_a 200 | 201 | path_a = {} 202 | prob_a = {} 203 | 204 | # get the previous max prob and corresponding tag 205 | for tag in self._tags.keys(): 206 | max_prob, pre_tag = max( 207 | [(pre_prob + log(self._transition_prob[pre_tag].get(tag, self._infinitesimal)) + 208 | log(self._emit_prob[tag].get(observation[i], self._infinitesimal)), 209 | pre_tag) for pre_tag, pre_prob in prob_b.items()]) 210 | 211 | prob_a[tag] = max_prob 212 | path_a[tag] = path_b[pre_tag] + [tag] 213 | 214 | final_tag, final_prob = max(prob_a.items(), key=lambda a_item: a_item[1]) 215 | return path_a[final_tag] 216 | 217 | def _tag(self, sequence, tag_only=True): 218 | if not isinstance(sequence, list): 219 | print("Error. Not word list.") 220 | elif tag_only: 221 | return self._viterbi(sequence) 222 | else: 223 | return list(zip(sequence, self._viterbi(sequence))) 224 | 225 | def tag(self, sentence, tag_only=True): 226 | """ 227 | This is viterbi algorithm 228 | """ 229 | tags = [] 230 | sentence = sentence.strip() 231 | if sentence: 232 | clauses = common_lib.re_clause_findall.findall(sentence) 233 | for clause in clauses: 234 | cuts = common_lib.cut(clause) 235 | tags += self._tag(cuts, tag_only) 236 | return tags 237 | 238 | def parse(self, sentence): 239 | analysis = {"entity": [], "pos1": [], "neg1": [], "pos2": [], "neg2": []} 240 | 241 | tags = self.tag(sentence, tag_only=False) 242 | 243 | cuts = [a[0] for a in tags] 244 | tags = [a[1] for a in tags] 245 | 246 | word = "" 247 | length = len(tags) 248 | for i in range(length): 249 | if "-" in tags[i]: 250 | splits = tags[i].split("-") 251 | type_ = splits[1] 252 | pos_ = splits[0] 253 | else: 254 | type_ = "OT" 255 | 256 | if type_ == "E": 257 | if pos_ == "I": 258 | word = cuts[i] 259 | analysis["entity"].append(word) 260 | word = "" 261 | elif pos_ == "B": 262 | word = cuts[i] 263 | elif pos_ == "E": 264 | word += cuts[i] 265 | analysis["entity"].append(word) 266 | word = "" 267 | elif pos_ == "M": 268 | if i + 1 < length and "-E" in tags[i + 1]: 269 | word += cuts[i] 270 | else: 271 | word += cuts[i] 272 | analysis["entity"].append(word) 273 | word = "" 274 | elif type_ == "P1": 275 | if pos_ == "I": 276 | word = cuts[i] 277 | analysis["pos1"].append(word) 278 | word = "" 279 | elif pos_ == "B": 280 | word = cuts[i] 281 | elif pos_ == "E": 282 | word += cuts[i] 283 | analysis["pos1"].append(word) 284 | word = "" 285 | elif pos_ == "M": 286 | if i + 1 < length and "-P1" in tags[i + 1]: 287 | word += cuts[i] 288 | else: 289 | word += cuts[i] 290 | analysis["pos1"].append(word) 291 | word = "" 292 | elif type_ == "P2": 293 | if pos_ == "I": 294 | word = cuts[i] 295 | analysis["pos2"].append(word) 296 | word = "" 297 | elif pos_ == "B": 298 | word = cuts[i] 299 | elif pos_ == "E": 300 | word += cuts[i] 301 | analysis["pos2"].append(word) 302 | word = "" 303 | elif pos_ == "M": 304 | if i + 1 < length and "-P2" in tags[i + 1]: 305 | word += cuts[i] 306 | else: 307 | word += cuts[i] 308 | analysis["pos2"].append(word) 309 | word = "" 310 | elif type_ == "N1": 311 | if pos_ == "I": 312 | word = cuts[i] 313 | analysis["neg1"].append(word) 314 | word = "" 315 | elif pos_ == "B": 316 | word = cuts[i] 317 | elif pos_ == "E": 318 | word += cuts[i] 319 | analysis["neg1"].append(word) 320 | word = "" 321 | elif pos_ == "M": 322 | if i + 1 < length and "-N1" in tags[i + 1]: 323 | word += cuts[i] 324 | else: 325 | word += cuts[i] 326 | analysis["neg1"].append(word) 327 | word = "" 328 | elif type_ == "N2": 329 | if pos_ == "I": 330 | word = cuts[i] 331 | analysis["neg2"].append(word) 332 | word = "" 333 | elif pos_ == "B": 334 | word = cuts[i] 335 | elif pos_ == "E": 336 | word += cuts[i] 337 | analysis["neg2"].append(word) 338 | word = "" 339 | elif pos_ == "M": 340 | if i + 1 < length and "-N2" in tags[i + 1]: 341 | word += cuts[i] 342 | else: 343 | word += cuts[i] 344 | analysis["neg2"].append(word) 345 | word = "" 346 | return analysis 347 | 348 | 349 | _hmm = OpinionMinerHMM() 350 | parse = _hmm.parse 351 | tag = _hmm.tag 352 | train = _hmm.train 353 | 354 | -------------------------------------------------------------------------------- /WaiMaiMiner/main.py: -------------------------------------------------------------------------------- 1 | import re 2 | import tkinter as tk 3 | from threading import Thread 4 | 5 | from WaiMaiMiner import visualization 6 | from WaiMaiMiner.crawler import crawl 7 | from WaiMaiMiner.mining import write_ 8 | from fgom.HMM import parse, train 9 | 10 | 11 | # some variable 12 | ALL = "all comments" 13 | GOOD = "good comments" 14 | MEDIUM = "medium comments" 15 | BAD = "bad comments" 16 | TASTE = "about taste" 17 | SPEED = "about speed" 18 | WEIGHT = "about weight" 19 | SERVICE = "about service" 20 | OTHER = "others" 21 | 22 | TOPIC_BG = "#FF00FF" 23 | POSITIVE_BG1 = "#f90b38" 24 | POSITIVE_BG2 = "#FF7F00" 25 | NEGATIVE_BG1 = "#00CD66" 26 | NEGATIVE_BG2 = "#0000EE" 27 | 28 | taste_keywords = ["味", "口感", "吃"] 29 | speed_keywords = ["速度", "送"] 30 | weight_keywords = ["量", "很多"] 31 | service_keywords = ["服务", "态度"] 32 | 33 | start = 7 34 | height = 30 35 | width = 60 36 | re_space = re.compile('(\s+)') 37 | 38 | all_direction = tk.E + tk.N + tk.W + tk.S 39 | result = None 40 | 41 | 42 | def get_result(): 43 | global result 44 | try: 45 | result = crawl(url_tv.get()) 46 | prompt_text.set("爬取完毕\(^o^)/YES!") 47 | except ValueError: 48 | prompt_text.set("错误的URL,请重新输入。") 49 | 50 | 51 | def analyse_button_event(): 52 | prompt_text.set("正在爬取评论,请稍等......") 53 | t = Thread(target=get_result) 54 | t.start() 55 | 56 | 57 | def test_tag(parse_result, sentence, type_, foreground, i, check_tv, j): 58 | index = start 59 | if check_tv.get(): 60 | result = parse_result[type_] 61 | # print(i, type_, result) 62 | for a in result: 63 | index = sentence.index(a, index) 64 | text.tag_add("tag%d_%d" % (i, j), "%d.%d" % (i, index), "%d.%d" % (i, index + len(a))) 65 | text.tag_config("tag%d_%d" % (i, j), foreground=foreground) 66 | index += len(a) 67 | j += 1 68 | return j 69 | 70 | 71 | def text_tag_config(sentence, i): 72 | sentence = re_space.sub(r' ', sentence) 73 | # print(i, sentence) 74 | sentence = "%5d. %s" % (i, sentence) 75 | text.insert(tk.END, "%s\n" % sentence) 76 | if sentence: 77 | parse_result = parse(sentence[start:]) 78 | j = test_tag(parse_result, sentence, "entity", TOPIC_BG, i, check_tv1, 0) 79 | j = test_tag(parse_result, sentence, "pos1", POSITIVE_BG1, i, check_tv2, j) 80 | j = test_tag(parse_result, sentence, "pos2", POSITIVE_BG2, i, check_tv3, j) 81 | j = test_tag(parse_result, sentence, "neg1", NEGATIVE_BG1, i, check_tv4, j) 82 | test_tag(parse_result, sentence, "neg2", NEGATIVE_BG2, i, check_tv5, j) 83 | 84 | 85 | def all_button_event(which): 86 | if result is not None: 87 | text.delete(1.0, tk.END) 88 | 89 | comments = result["content"] 90 | scores = result["score"] 91 | 92 | if check_var.get() is True: 93 | comments = [comments[a[0]] for a in result["useful_comment_id"]] 94 | scores = [scores[a[0]] for a in result["useful_comment_id"]] 95 | 96 | if which == ALL: 97 | i = 1 98 | for comment in comments: 99 | text_tag_config(comment, i) 100 | i += 1 101 | 102 | elif which == GOOD: 103 | j = 1 104 | for i in range(len(scores)): 105 | if scores[i] >= 4: 106 | text_tag_config(comments[i], j) 107 | j += 1 108 | 109 | elif which == MEDIUM: 110 | j = 1 111 | for i in range(len(scores)): 112 | if 2 <= scores[i] <= 3: 113 | text_tag_config(comments[i], j) 114 | j += 1 115 | 116 | elif which == BAD: 117 | j = 1 118 | for i in range(len(scores)): 119 | if scores[i] <= 1: 120 | text_tag_config(comments[i], j) 121 | j += 1 122 | 123 | elif which == TASTE: 124 | j = 1 125 | for i in range(len(scores)): 126 | for keyword in taste_keywords: 127 | if keyword in comments[i]: 128 | text_tag_config(comments[i], j) 129 | j += 1 130 | 131 | elif which == SPEED: 132 | j = 1 133 | for i in range(len(scores)): 134 | for keyword in speed_keywords: 135 | if keyword in comments[i]: 136 | text_tag_config(comments[i], j) 137 | j += 1 138 | 139 | elif which == WEIGHT: 140 | j = 1 141 | for i in range(len(scores)): 142 | for keyword in weight_keywords: 143 | if keyword in comments[i]: 144 | text_tag_config(comments[i], j) 145 | j += 1 146 | 147 | elif which == SERVICE: 148 | j = 1 149 | for i in range(len(scores)): 150 | for keyword in service_keywords: 151 | if keyword in comments[i]: 152 | text_tag_config(comments[i], j) 153 | j += 1 154 | 155 | elif which == OTHER: 156 | j = 1 157 | yes = False 158 | for i in range(len(scores)): 159 | for keyword in taste_keywords: 160 | if keyword in comments[i]: 161 | yes = True 162 | for keyword in speed_keywords: 163 | if keyword in comments[i]: 164 | yes = True 165 | for keyword in weight_keywords: 166 | if keyword in comments[i]: 167 | yes = True 168 | for keyword in service_keywords: 169 | if keyword in comments[i]: 170 | yes = True 171 | if not yes: 172 | text_tag_config(comments[i], j) 173 | j += 1 174 | 175 | 176 | def write_into_file(sentence, which): 177 | if sentence: 178 | write_(sentence, which) 179 | error_tv.set("OK, 纠错成功!") 180 | 181 | 182 | def retrain_thread(): 183 | train() 184 | error_tv.set("训练完毕 (*^-^*)") 185 | 186 | 187 | def retrain(): 188 | error_tv.set("正在重新训练模型,请稍等......") 189 | t = Thread(target=retrain_thread) 190 | t.start() 191 | 192 | 193 | # get the root 194 | root = tk.Tk() 195 | 196 | # fix the window size 197 | root.resizable(False, False) 198 | 199 | # Frame 1 200 | frame1 = tk.Frame(root, bd=2, relief=tk.SUNKEN) 201 | frame1.pack(fill=tk.BOTH, expand=tk.YES, anchor=tk.CENTER) 202 | 203 | # URL StringVar, URL Entry, Button and corresponding event function 204 | row_num = 0 205 | url_tv = tk.StringVar() 206 | url_tv_column_span = 9 207 | tk.Entry(frame1, textvariable=url_tv).grid(row=row_num, column=0, columnspan=url_tv_column_span, 208 | padx=2, sticky=all_direction) 209 | tk.Button(frame1, text="分析", command=analyse_button_event).grid( 210 | row=row_num, column=url_tv_column_span, sticky=all_direction) 211 | 212 | # Label 213 | row_num = 1 214 | tk.Label(frame1, text="提示:").grid( 215 | row=row_num, column=0, columnspan=2, pady=10, sticky=all_direction) 216 | prompt_text = tk.StringVar() 217 | tk.Label(frame1, textvariable=prompt_text).grid( 218 | row=row_num, column=2, columnspan=8, pady=5, sticky=all_direction) 219 | prompt_text.set("请输入店铺URL.") 220 | 221 | # Buttons and Checkbutton 222 | row_num = 2 223 | columnspan = 2 224 | tk.Button(frame1, text="All", command=lambda: all_button_event(ALL)).grid( 225 | row=row_num, column=columnspan * 0, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 226 | tk.Button(frame1, text="好评", command=lambda: all_button_event(GOOD)).grid( 227 | row=row_num, column=columnspan * 1, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 228 | tk.Button(frame1, text="中评", command=lambda: all_button_event(MEDIUM)).grid( 229 | row=row_num, column=columnspan * 2, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 230 | tk.Button(frame1, text="差评", command=lambda: all_button_event(BAD)).grid( 231 | row=row_num, column=columnspan * 3, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 232 | check_var = tk.BooleanVar() 233 | check_button = tk.Checkbutton(frame1, text="有效评论", variable=check_var) 234 | check_button.select() 235 | check_button.grid(row=row_num, column=columnspan * 4, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 236 | row_num = 3 237 | tk.Button(frame1, text="味道", command=lambda: all_button_event(TASTE)).grid( 238 | row=row_num, column=columnspan * 0, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 239 | tk.Button(frame1, text="送餐", command=lambda: all_button_event(SPEED)).grid( 240 | row=row_num, column=columnspan * 1, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 241 | tk.Button(frame1, text="份量", command=lambda: all_button_event(WEIGHT)).grid( 242 | row=row_num, column=columnspan * 2, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 243 | tk.Button(frame1, text="服务", command=lambda: all_button_event(SERVICE)).grid( 244 | row=row_num, column=columnspan * 3, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 245 | tk.Button(frame1, text="其它", command=lambda: all_button_event(OTHER)).grid( 246 | row=row_num, column=columnspan * 4, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 247 | 248 | # Radiobutton 249 | row_num = 4 250 | columnspan = 2 251 | check_tv1 = tk.BooleanVar() 252 | c = tk.Checkbutton(frame1, text="评价对象", variable=check_tv1, onvalue=True, fg=TOPIC_BG) 253 | c.grid(row=row_num, column=columnspan * 0, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 254 | c.select() 255 | check_tv2 = tk.BooleanVar() 256 | tk.Checkbutton(frame1, text="正向评价", variable=check_tv2, onvalue=True, fg=POSITIVE_BG1).grid( 257 | row=row_num, column=columnspan * 1, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 258 | check_tv3 = tk.BooleanVar() 259 | tk.Checkbutton(frame1, text="正向描述", variable=check_tv3, onvalue=True, fg=POSITIVE_BG2).grid( 260 | row=row_num, column=columnspan * 2, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 261 | check_tv4 = tk.BooleanVar() 262 | tk.Checkbutton(frame1, text="负向评价", variable=check_tv4, onvalue=True, fg=NEGATIVE_BG1).grid( 263 | row=row_num, column=columnspan * 3, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 264 | check_tv5 = tk.BooleanVar() 265 | tk.Checkbutton(frame1, text="负向描述", variable=check_tv5, onvalue=True, fg=NEGATIVE_BG2).grid( 266 | row=row_num, column=columnspan * 4, columnspan=columnspan, padx=2, pady=2, sticky=all_direction) 267 | 268 | # Text Widget and associated Scrollbar Widget 269 | row_num = 5 270 | text = tk.Text(frame1, height=height, width=width) 271 | text.grid(row=row_num, column=0, columnspan=10, padx=2, pady=2) 272 | scrollbar = tk.Scrollbar(frame1, orient=tk.VERTICAL, command=text.yview) 273 | scrollbar.grid(row=row_num, column=10, rowspan=1, sticky=all_direction) 274 | text.configure(yscrollcommand=scrollbar.set) 275 | 276 | # Frame 2: labelFrame 277 | row_num = 6 278 | frame2 = tk.LabelFrame(root, text="改进面板") 279 | # frame2.grid(row=row_num, column=0, columnspan=11, sticky=all_direction) 280 | frame2.pack(fill=tk.BOTH, expand=tk.YES) 281 | 282 | # Entry 283 | error_tv = tk.StringVar() 284 | row_num = 0 285 | tk.Entry(frame2, textvariable=error_tv).grid(row=row_num, column=0, columnspan=12, sticky=all_direction) 286 | 287 | # Radiobutton 288 | row_num = 1 289 | columnspan = 3 290 | padx = 15 291 | radio_iv = tk.IntVar() 292 | tk.Radiobutton(frame2, text="正向评价", variable=radio_iv, value=2).grid( 293 | row=row_num, column=columnspan * 0, columnspan=columnspan, sticky=all_direction, padx=padx) 294 | tk.Radiobutton(frame2, text="正向描述", variable=radio_iv, value=3).grid( 295 | row=row_num, column=columnspan * 1, columnspan=columnspan, sticky=all_direction, padx=padx) 296 | tk.Radiobutton(frame2, text="负向评价", variable=radio_iv, value=4).grid( 297 | row=row_num, column=columnspan * 2, columnspan=columnspan, sticky=all_direction, padx=padx) 298 | tk.Radiobutton(frame2, text="负向描述", variable=radio_iv, value=5).grid( 299 | row=row_num, column=columnspan * 3, columnspan=columnspan, sticky=all_direction, padx=padx) 300 | 301 | row_num = 2 302 | tk.Radiobutton(frame2, text="评价对象", variable=radio_iv, value=1).grid( 303 | row=row_num, column=columnspan * 0, columnspan=columnspan, sticky=all_direction, padx=padx) 304 | tk.Radiobutton(frame2, text="其他", variable=radio_iv, value=6).grid( 305 | row=row_num, column=columnspan * 1, columnspan=columnspan, sticky=all_direction, padx=padx) 306 | tk.Button(frame2, text=" 确定 ", command=lambda: write_into_file(error_tv.get(), radio_iv.get())).grid( 307 | row=row_num, column=columnspan * 2, padx=padx, sticky=all_direction) 308 | tk.Button(frame2, text="重新训练", command=lambda: retrain()).grid( 309 | row=row_num, column=columnspan * 3, padx=padx, sticky=all_direction) 310 | 311 | # Frame 3: LabelFrame 312 | frame3 = tk.LabelFrame(root, text="统计面板", padx=2, pady=2, relief=tk.GROOVE) 313 | frame3.pack(fill=tk.BOTH, expand=tk.YES) 314 | 315 | # Buttons 316 | columnspan = 3 317 | padx = 20 318 | tk.Button(frame3, text="店铺整体评分分布", command=lambda: visualization.score_detail(result)).grid( 319 | row=0, column=columnspan * 0, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 320 | tk.Button(frame3, text="商品质量评分分布", command=lambda: visualization.dish_score_detail(result)).grid( 321 | row=0, column=columnspan * 1, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 322 | tk.Button(frame3, text="配送服务评分分布", command=lambda: visualization.service_score_detail(result)).grid( 323 | row=0, column=columnspan * 2, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 324 | tk.Button(frame3, text="各项评价平均指标", command=lambda: visualization.average_score(result)).grid( 325 | row=1, column=columnspan * 0, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 326 | tk.Button(frame3, text="整体评价变化趋势", command=lambda: visualization.weeks_score(result)).grid( 327 | row=1, column=columnspan * 1, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 328 | tk.Button(frame3, text="订餐终端分布", command=lambda: visualization.s_from(result)).grid( 329 | row=1, column=columnspan * 2, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 330 | tk.Button(frame3, text="商品推荐榜", command=lambda: visualization.recommend_dishes2(result)).grid( 331 | row=2, column=columnspan * 0, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 332 | tk.Button(frame3, text="送餐时间分布", command=lambda: visualization.cost_time(result)).grid( 333 | row=2, column=columnspan * 1, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 334 | # tk.Button(frame3, text="各评价对象分布", command=lambda: visualization.topic(result)).grid( 335 | # row=2, column=columnspan*2, columnspan=columnspan, sticky=all_direction, padx=padx, pady=3) 336 | 337 | # main loop 338 | root.mainloop() 339 | -------------------------------------------------------------------------------- /fgom/corpus.py: -------------------------------------------------------------------------------- 1 | # -*- coding: -*- 2 | 3 | import re 4 | import os 5 | import math 6 | from random import choice 7 | 8 | from fgom import common_lib 9 | 10 | root_path = os.getcwd() 11 | 12 | 13 | class GetToTagCorpus: 14 | def __init__(self, input_filename, output_filepath, start=0, end=-1, gap=10): 15 | """ 16 | :param input_filename: 需要标记的语料文件 readf 17 | :param output_filepath: 输出文件夹 18 | :param start: readf从哪一行开始输出 19 | :param end: readf从哪一行结束输出 20 | :param gap: 多少语料数写进一个文件 21 | """ 22 | self._input_filename = os.path.join(root_path, input_filename) 23 | 24 | out_path = os.path.join(root_path, output_filepath) 25 | if not os.path.exists(out_path): 26 | os.makedirs(out_path) 27 | self._output_filepath = os.path.join(out_path, "to_tag_corpus-%s.txt") 28 | 29 | self._start = start 30 | self._end = end 31 | self._gap = gap 32 | 33 | def run(self): 34 | with open(self._input_filename, encoding="utf-8") as readf: 35 | i = 0 36 | for line in readf: 37 | if i >= self._start: 38 | # get the clauses 39 | clauses = common_lib.re_clause_findall.findall(line.strip()) 40 | 41 | # write the clause's segments 42 | with open(self._output_filepath % ((i - self._start) // self._gap), 43 | "a", encoding="utf-8") as writef: 44 | for clause in clauses: 45 | segments = common_lib.cut(clause) 46 | writef.write("%s\n" % "\t".join([segment + "/" for segment in segments])) 47 | writef.write("\n" * 2) 48 | 49 | i += 1 50 | if 0 < self._end == i: 51 | break 52 | 53 | 54 | class GetTaggedCorpus: 55 | def __init__(self, input_filepath, output_filename, default='OT'): 56 | self.input_filepath = os.path.join(root_path, input_filepath) 57 | self.output_filename = os.path.join(root_path, output_filename) 58 | 59 | self.default = default 60 | 61 | def run(self): 62 | with open(self.output_filename, "w", encoding='utf-8') as writef: 63 | for file in os.listdir(self.input_filepath): 64 | # get all lines 65 | with open(os.path.join(self.input_filepath, file), encoding="utf-8") as readf: 66 | lines = [line.strip() for line in readf.readlines()] 67 | 68 | # analyse each line 69 | line_no = 0 70 | runout = "" 71 | while line_no < len(lines): 72 | if lines[line_no] == "" and runout: 73 | writef.write("%s\n" % runout.strip()) 74 | runout = "" 75 | 76 | elif lines[line_no]: 77 | # get words and tags 78 | splits = common_lib.re_space_split.split(lines[line_no]) 79 | words, tags = [], [] 80 | for a_split in splits: 81 | if "/" in a_split: 82 | try: 83 | word, tag = a_split.split("/") 84 | except ValueError: 85 | raise ValueError("Tag wrong! System cannot recognize it.") 86 | words.append(word) 87 | tags.append(tag.upper()) 88 | 89 | seq_tag = False 90 | final_pos = -1 91 | for i in range(len(words)): 92 | if not seq_tag: 93 | if tags[i] == "": 94 | runout += "%s/%s\t" % (words[i], self.default) 95 | else: 96 | final_pos = common_lib.final_tag_position(tags, tags[i], i) 97 | if final_pos != i: 98 | runout += "%s/%s\t" % (words[i], "B-" + tags[i]) 99 | seq_tag = True 100 | else: 101 | runout += "%s/%s\t" % (words[i], "I-" + tags[i]) 102 | else: 103 | if i == final_pos: 104 | runout += "%s/%s\t" % (words[i], "E-" + tags[i]) 105 | seq_tag = False 106 | else: 107 | runout += "%s/%s\t" % (words[i], "M-" + tags[i]) 108 | 109 | if runout and not common_lib.re_han_match.match(words[-1]): 110 | writef.write("%s\n" % runout.strip()) 111 | runout = "" 112 | 113 | line_no += 1 114 | 115 | 116 | class BootstrappingHMM: 117 | def __init__(self): 118 | # the import parameters 119 | self.__tags = {} 120 | self.__init_prob = {} 121 | self.__emit_prob = {} 122 | self.__transition_prob = {} 123 | 124 | # the filepath parameters 125 | self.__infinitesimal = 1e-100 126 | 127 | def train(self, filepath): 128 | print("I'm training ...") 129 | 130 | # declare some variables 131 | tags_num = {} # record the number of each tag 132 | init_num = {} # record the number of the initial number 133 | transition_num = {} # record the number of the transition numbers between tags 134 | emit_num = {} # record the number of the the emit numbers between word and tag 135 | 136 | # the pattern for split 137 | pattern = re.compile("\s+") 138 | 139 | # open the file, read each line one by one 140 | with open(filepath, encoding="utf-8") as f: 141 | for line in f: 142 | # split the line into the several splits 143 | splits = pattern.split(line.strip()) 144 | 145 | # establish two lists to record the word and the tag 146 | line_words = [] 147 | # line_poses = [] 148 | line_tags = [] 149 | 150 | for a_split in splits: 151 | # split every previous split into word and tag 152 | results = a_split.split("/") 153 | line_words.append(results[0]) 154 | # line_poses.append(results[1]) 155 | line_tags.append(results[-1]) 156 | 157 | # get the length of two lists 158 | length = len(line_words) 159 | assert length == len(line_tags) 160 | 161 | # count the number of init, emit and transition 162 | 163 | # count the init 164 | tag = line_tags[0] 165 | init_num[tag] = init_num.get(tag, 0) + 1 166 | 167 | # count the transition 168 | for i in range(length - 1): 169 | tag1 = line_tags[i] 170 | tag2 = line_tags[i + 1] 171 | if tag1 not in transition_num: 172 | transition_num[tag1] = {} 173 | transition_num[tag1][tag2] = transition_num[tag1].get(tag2, 0) + 1 174 | 175 | # count the emit and tag's number 176 | for i in range(length): 177 | tag = line_tags[i] 178 | word = line_words[i] 179 | if tag not in emit_num: 180 | emit_num[tag] = {} 181 | emit_num[tag][word] = emit_num[tag].get(word, 0) + 1 182 | tags_num[tag] = tags_num.get(tag, 0) + 1 183 | 184 | # count the probability of the self.init_prob, self.emit_prob, self.transition_prob 185 | # and write them into the file 186 | 187 | # write the tag num 188 | self.__tags = tags_num 189 | 190 | # write the init probability 191 | total = sum(init_num.values()) 192 | for tag, num in sorted(init_num.items()): 193 | prob = num / total 194 | self.__init_prob[tag] = prob 195 | 196 | # write the transition probability 197 | # get the tag and the transition tag 198 | for tag1 in sorted(transition_num.keys()): 199 | tag_dict = transition_num[tag1] 200 | total = sum(tag_dict.values()) 201 | self.__transition_prob[tag1] = {} 202 | for tag2 in sorted(tag_dict.keys()): 203 | num = tag_dict[tag2] 204 | prob = num / total 205 | self.__transition_prob[tag1][tag2] = prob 206 | for key in self.__tags: 207 | if key not in self.__transition_prob: 208 | self.__transition_prob[key] = {} 209 | 210 | # write the emit probability 211 | for tag in sorted(emit_num.keys()): 212 | tag_dict = emit_num[tag] 213 | total = sum(tag_dict.values()) 214 | self.__emit_prob[tag] = {} 215 | for word in sorted(tag_dict.keys()): 216 | num = tag_dict[word] 217 | prob = num / total 218 | self.__emit_prob[tag][word] = prob 219 | for key in self.__tags: 220 | if key not in self.__emit_prob: 221 | self.__emit_prob[key] = {} 222 | 223 | print("Trains over ...") 224 | 225 | def __viterbi(self, observation): 226 | # record the first path and first probability 227 | prob_a = {} 228 | path_a = {} 229 | 230 | # initialize 231 | for tag in self.__tags.keys(): 232 | path_a[tag] = [tag] 233 | prob_a[tag] = math.log(self.__init_prob.get(tag, self.__infinitesimal)) + \ 234 | math.log(self.__emit_prob[tag].get(observation[0], self.__infinitesimal)) 235 | 236 | # traversal the observation 237 | for i in range(1, len(observation)): 238 | # copy the previous prob and path 239 | # and initialize the new prob and path 240 | prob_b = prob_a 241 | path_b = path_a 242 | 243 | path_a = {} 244 | prob_a = {} 245 | 246 | # get the previous max prob and corresponding tag 247 | for tag in self.__tags.keys(): 248 | max_prob, pre_tag = max( 249 | [(pre_prob + math.log(self.__transition_prob[pre_tag].get(tag, self.__infinitesimal)) + 250 | math.log(self.__emit_prob[tag].get(observation[i], self.__infinitesimal)), pre_tag) 251 | for pre_tag, pre_prob in prob_b.items()]) 252 | 253 | prob_a[tag] = max_prob 254 | path_a[tag] = path_b[pre_tag] + [tag] 255 | 256 | final_tag, final_prob = max(prob_a.items(), key=lambda a_item: a_item[1]) 257 | return path_a[final_tag] 258 | 259 | def tag(self, sequence, tag_only=False): 260 | """ 261 | This is viterbi algorithm 262 | """ 263 | # judge whether the sequence is a list 264 | if not isinstance(sequence, list): 265 | raise ValueError("Error. Not word list.") 266 | elif tag_only: 267 | return self.__viterbi(sequence) 268 | else: 269 | return list(zip(sequence, self.__viterbi(sequence))) 270 | 271 | 272 | class BootstrappingMaster: 273 | """BootstrappingMaster""" 274 | 275 | def __init__(self, bootstrapping_filename, origin_tag_filename): 276 | self.hmm1 = BootstrappingHMM() 277 | self.hmm2 = BootstrappingHMM() 278 | 279 | self.train_corpus_filepath = os.path.join(root_path, origin_tag_filename) 280 | self.bootstrapping_corpus_filepath = os.path.join(root_path, bootstrapping_filename) 281 | self.hmm_path = 'f_hmm/' 282 | self.hmm1_filepath = "f_hmm/hmm1_corpus.txt" 283 | self.hmm2_filepath = "f_hmm/hmm2_corpus.txt" 284 | 285 | if not os.path.exists(self.hmm_path): 286 | os.makedirs(self.hmm_path) 287 | 288 | self.bootstrap_contents = [] 289 | self.added = False 290 | self.load_bootstrap() 291 | 292 | def __del__(self): 293 | if os.path.exists(self.hmm1_filepath): 294 | os.remove(self.hmm1_filepath) 295 | if os.path.exists(self.hmm2_filepath): 296 | os.remove(self.hmm2_filepath) 297 | if os.path.exists(self.hmm_path): 298 | os.rmdir(self.hmm_path) 299 | 300 | def load_bootstrap(self): 301 | with open(self.bootstrapping_corpus_filepath, encoding="utf-8") as bootstrap_f: 302 | for line in bootstrap_f: 303 | self.bootstrap_contents.append(line.strip()) 304 | 305 | @staticmethod 306 | def check_filepath(filepath): 307 | if os.path.exists(filepath): 308 | return True 309 | else: 310 | return False 311 | 312 | def distribute(self): 313 | """Distribute the tagged corpus.""" 314 | if self.check_filepath(self.train_corpus_filepath): 315 | print("Distributing.") 316 | 317 | hmm1_file = open(self.hmm1_filepath, "w", encoding="utf-8") 318 | hmm2_file = open(self.hmm2_filepath, "w", encoding="utf-8") 319 | 320 | with open(self.train_corpus_filepath, encoding="utf-8") as f: 321 | contents = f.readlines() 322 | index_list = list(range(len(contents))) 323 | 324 | turn = 0 325 | 326 | while len(index_list) > 0: 327 | index = choice(index_list) 328 | index_list.remove(index) 329 | if turn == 0: 330 | hmm1_file.write("%s" % contents[index]) 331 | turn += 1 332 | else: 333 | hmm2_file.write("%s" % contents[index]) 334 | turn = 0 335 | 336 | hmm1_file.close() 337 | hmm2_file.close() 338 | else: 339 | print("Please check. Can not find the corpus path.") 340 | 341 | def run(self): 342 | while True: 343 | # randomly get the train corpus and distribute to each hmm file 344 | self.distribute() 345 | # train each hmm 346 | self.hmm1.train(self.hmm1_filepath) 347 | self.hmm2.train(self.hmm2_filepath) 348 | 349 | # tag each test corpus 350 | # if two tags are equal, then add it into corpus file, and change the state of self.added 351 | with open(self.train_corpus_filepath, 'a', encoding="utf-8") as train_f: 352 | for line in self.bootstrap_contents: 353 | hmm1_tags = [] 354 | hmm2_tags = [] 355 | clauses = [] 356 | for clause in common_lib.re_clause_findall.findall(line.strip()): 357 | segments = common_lib.cut(clause) 358 | clauses.append(segments) 359 | hmm1_tags.append(self.hmm1.tag(segments, tag_only=True)) 360 | hmm2_tags.append(self.hmm2.tag(segments, tag_only=True)) 361 | 362 | if hmm1_tags == hmm2_tags: 363 | self.added = True 364 | print("Add a new data.") 365 | runout = "" 366 | for i in range(len(hmm1_tags)): 367 | content = "" 368 | for j in range(len(hmm1_tags[i])): 369 | content += "%s/%s\t" % (clauses[i][j], hmm1_tags[i][j]) 370 | runout += "%s\n" % content.strip() 371 | train_f.write("%s\n" % runout.strip()) 372 | self.bootstrap_contents.remove(line) 373 | 374 | print("Length of remaining corpus: %d" % len(self.bootstrap_contents)) 375 | # check whether there are new data added 376 | if not self.added: 377 | break 378 | else: 379 | # change the sate of self.added 380 | self.added = False 381 | 382 | 383 | 384 | --------------------------------------------------------------------------------