├── result ├── log │ ├── best_model │ │ ├── error_tag.json │ │ └── PR.json │ ├── 3plus3arr.plk │ ├── logfile.plk │ └── ml_rate.plk ├── show │ ├── result.xlsx │ └── result.csv └── vector │ ├── resultX.npz │ └── resultY.npz ├── clean_data ├── __init__.py ├── clean_html.py └── langconv.py ├── data ├── emdict │ ├── negword.plk │ ├── posword.plk │ ├── stopword.plk │ ├── material │ │ ├── 台湾大学NTUSD - 简体中文情感极性词典.rar │ │ ├── __pycache__ │ │ │ └── emotion_word.cpython-36.pyc │ │ ├── NTUSD_simplified │ │ │ ├── NTUSD_negative_simplified.txt │ │ │ ├── NTUSD_positive_simplified.txt │ │ │ └── pos.txt │ │ └── stopword.txt │ ├── collect_dict.py │ └── stopword └── trainset │ ├── pos_595121.txt │ ├── pos_595330.txt │ ├── README.md │ ├── neu_589528.txt │ ├── neg_2592_05_04.txt │ ├── neg_2593_05_04.txt │ ├── neg_2406_04_29.txt │ ├── pos_595249.txt │ ├── pos_595252.txt │ ├── neg_2635_05_05.txt │ ├── neu_591877.txt │ ├── pos_595052.txt │ ├── pos_595491.txt │ ├── neu_591962.txt │ ├── neg_2617_05_05.txt │ ├── pos_594817.txt │ ├── neg_2621_05_05.txt │ ├── neu_591954.txt │ ├── neg_2667_05_05.txt │ ├── pos_594613.txt │ ├── pos_595219.txt │ ├── neg_2612_05_05.txt │ ├── neg_2641_05_05.txt │ ├── neu_591908.txt │ ├── neu_591920.txt │ ├── neg_2625_05_05.txt │ ├── neu_591925.txt │ ├── neu_589538.txt │ ├── neu_591904.txt │ ├── neu_591936.txt │ └── pos_595408.txt ├── model └── wordfreq_logistic.ml ├── other ├── paper │ ├── testresult.png │ ├── A Study of Synthetic Oversampling for Twitter Imbalanced Sentiment Analysis.pdf │ ├── run.py │ └── generate_sample.py ├── twotag.py ├── get_data │ └── GetData.py └── more_process.py ├── .idea ├── dictionaries │ └── AsuraDong.xml ├── vcs.xml ├── misc.xml ├── modules.xml ├── news_emotion.iml └── workspace.xml ├── __init__.py ├── ml_model.py ├── loocv_model.py ├── README.md ├── demo.py ├── run_best.py └── operate_data.py /result/log/best_model/error_tag.json: -------------------------------------------------------------------------------- 1 | {"+2.": "At: +2.; Total 1; \n pos_594817.txt"} -------------------------------------------------------------------------------- /clean_data/__init__.py: -------------------------------------------------------------------------------- 1 | from .clean_html import cleanHtml # clean_data成功有了cleanHtml, 上层可以引用了 -------------------------------------------------------------------------------- /data/emdict/negword.plk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/data/emdict/negword.plk -------------------------------------------------------------------------------- /data/emdict/posword.plk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/data/emdict/posword.plk -------------------------------------------------------------------------------- /data/emdict/stopword.plk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/data/emdict/stopword.plk -------------------------------------------------------------------------------- /result/log/3plus3arr.plk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/result/log/3plus3arr.plk -------------------------------------------------------------------------------- /result/log/logfile.plk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/result/log/logfile.plk -------------------------------------------------------------------------------- /result/log/ml_rate.plk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/result/log/ml_rate.plk -------------------------------------------------------------------------------- /result/show/result.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/result/show/result.xlsx -------------------------------------------------------------------------------- /model/wordfreq_logistic.ml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/model/wordfreq_logistic.ml -------------------------------------------------------------------------------- /other/paper/testresult.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/other/paper/testresult.png -------------------------------------------------------------------------------- /result/vector/resultX.npz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/result/vector/resultX.npz -------------------------------------------------------------------------------- /result/vector/resultY.npz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/result/vector/resultY.npz -------------------------------------------------------------------------------- /.idea/dictionaries/AsuraDong.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /result/log/best_model/PR.json: -------------------------------------------------------------------------------- 1 | {"+": {"p": null, "r": null}, "-": {"p": null, "r": null}, ".": {"p": 0.6666666666666666, "r": 1.0}} -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | from .clean_data import cleanHtml # 下层已经做好了__init__.py文件, 所以可以将下一层当做包直接引用 2 | __all__ = [ 3 | 'cleanHtml', # python3打包必须加引号 4 | ] -------------------------------------------------------------------------------- /data/emdict/material/台湾大学NTUSD - 简体中文情感极性词典.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/data/emdict/material/台湾大学NTUSD - 简体中文情感极性词典.rar -------------------------------------------------------------------------------- /data/emdict/material/__pycache__/emotion_word.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/data/emdict/material/__pycache__/emotion_word.cpython-36.pyc -------------------------------------------------------------------------------- /data/emdict/material/NTUSD_simplified/NTUSD_negative_simplified.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/data/emdict/material/NTUSD_simplified/NTUSD_negative_simplified.txt -------------------------------------------------------------------------------- /data/emdict/material/NTUSD_simplified/NTUSD_positive_simplified.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/data/emdict/material/NTUSD_simplified/NTUSD_positive_simplified.txt -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /other/paper/A Study of Synthetic Oversampling for Twitter Imbalanced Sentiment Analysis.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dongyuanxin/news-emotion/HEAD/other/paper/A Study of Synthetic Oversampling for Twitter Imbalanced Sentiment Analysis.pdf -------------------------------------------------------------------------------- /data/trainset/pos_595121.txt: -------------------------------------------------------------------------------- 1 | 科技基金今年涨幅傲视其他产业型基金,尤其是台股科技基金,多档基金今年来涨幅超过三成。日盛高科技基金成立于2000年上一波网路热潮时,近一周涨6.4%,净值创成立以来新高。基金的持股以半导体股最多,占38%,其次是电子零组件的16%,还布局生技、机械、纺纤、观光等。 -------------------------------------------------------------------------------- /data/trainset/pos_595330.txt: -------------------------------------------------------------------------------- 1 | 科技基金今年涨幅傲视其他产业型基金,尤其是台股科技基金,多档基金今年来涨幅超过三成。日盛高科技基金成立于2000年上一波网路热潮时,近一周涨6.4%,净值创成立以来新高。基金的持股以半导体股最多,占38%,其次是电子零组件的16%,还布局生技、机械、纺纤、观光等。 -------------------------------------------------------------------------------- /data/trainset/README.md: -------------------------------------------------------------------------------- 1 | ### 用处 2 | > 存放训练集的文件夹 3 | 4 | ### 命名规则 5 | > 采用:`emotion_otherInfo`的命名。例如:`neg_1568_2017-6-9.txt` 、`neu_5963`。 6 | 7 | - 请采用`UTF-8`编码:尤其是针对图形文字,例如中文、日文等,保证兼容 8 | - 情感缩写: 9 | 情感 | 缩写 10 | - | - 11 | 积极 | pos 12 | 中性 | neu 13 | 消极 | neg 14 | 15 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /data/trainset/neu_589528.txt: -------------------------------------------------------------------------------- 1 | 信息时报讯 据外汇管理局网站数据,合格境外机构投资者(QFII)投资额度审批情况表显示,截至7月31日,累计批准QFII额度为932.74亿美元。上月末,为927.74亿美元。数据还显示,中国7月末合格境内机构投资者(QDII) 获批额度为899.93亿美元。人民币合格境外机构投资者(RQFII)投资额度获批5482.41亿元人民币。据证券时报网 -------------------------------------------------------------------------------- /data/trainset/neg_2592_05_04.txt: -------------------------------------------------------------------------------- 1 | 《经济通通讯社4日专讯》美国联储局如预期维持利率不变,美元走强,国际金价跌至一个月低位。现货金盘中触及4月5日以来最低的1244﹒93美元。美国期金收跌0﹒7%,报1248﹒5美元。 A场黄金股跌,紫金矿业(02899)(沪:601899)A股跌1﹒2%,H股挫2﹒2%;湖南黄金(深:002155)挫3%,中金黄金(沪:600489)挫2﹒8%,赤峰黄金(沪:600988)挫2﹒4%。(vl) -------------------------------------------------------------------------------- /data/trainset/neg_2593_05_04.txt: -------------------------------------------------------------------------------- 1 | 《经济通通讯社4日专讯》钢铁股个别发展,柳钢股份(沪:601003)升3﹒8%,河钢股份(深:000709)升2﹒3%,宝钢股份(沪:600019)跌近1%。 内地大宗商品期货早市初段急跌,其中铁矿石主力合约一度触及跌停。 重庆钢铁(01053)(沪:601005)决定终止重大资产重组,其H股现跌6﹒5%,报1﹒15港元,A股停牌。重钢将在召开投资者说明会后申请复牌;公司称,将继续围绕钢铁主业经营做好改善资本债务结构、降低生产成本等工作。(sc) -------------------------------------------------------------------------------- /data/trainset/neg_2406_04_29.txt: -------------------------------------------------------------------------------- 1 | 据环球网29日消息,韩国外交部长官尹炳世、美国国务卿蒂勒森和日本外务大臣岸田文雄28日在美国纽约联合国总部举行韩美日外长会谈。三方在会谈上商定,将进一步加大对朝施压力度,强力应对来自朝鲜的核与导弹威胁。三国外长一致认为,通过采取强而有力的外交、军事行动,全力阻止朝鲜发起新一轮挑衅,如朝鲜再次发起挑衅,立即采取严厉的惩罚措施。更多精彩内容 请登陆财华智库网 (http://www.finet.com.cn) 财华香港网 (http://www.finet.hk)或现代电视 (http://www.fintv.com) -------------------------------------------------------------------------------- /other/twotag.py: -------------------------------------------------------------------------------- 1 | if __name__=='__main__': 2 | ##### 二分类 ##### 3 | best_vector = 'outofdict' 4 | best_model = 4 # 5 | new_index = (resultY[best_vector] != 0) 6 | print(new_index) 7 | print(len(new_index)) 8 | new_x = resultX[best_vector][new_index,:] # 所有中性样本 9 | new_y = resultY[best_vector][new_index] 10 | rate = loocv(new_x, new_y, mode=best_model) 11 | print(rate) -------------------------------------------------------------------------------- /data/trainset/pos_595249.txt: -------------------------------------------------------------------------------- 1 | 欧盟统计局周一公布的数据显示,欧元区7月消费者物价调和指数(HICP)初值按年升1.3%,符市场预期,显示欧元区7月整体通胀率持稳。另外,欧元区6月失业率下降至9.1%,为2009年2月以来新低,市场预期为9.2%。数据公布后,欧元一度回升至1.1762,接近上周四触及的2015年1月以来高位1.1777。据中国国家统计局数据,中国7月官方制造业PMI为51.4,不及预期51.5,较6月PMI数据51.7有所回落。另外,中国7月官方非制造业PMI报54.5,较6月54.9也有所回落。惟数据无碍人民币近期强势,美元兑在岸人民币一度跌至6.7213;美元兑离岸人民币亦低见6.7251。 -------------------------------------------------------------------------------- /result/show/result.csv: -------------------------------------------------------------------------------- 1 | Model\Vector,Onehot,Wordfreq,Twovec,Tfidf,Outofdict 2 | KNN,0.3666666666666667,0.33333333333333337,0.4,0.30000000000000004,0.2666666666666667 3 | Logistic,0.3666666666666667,0.4,0.43333333333333335,0.0,0.5 4 | RandomForest,0.4666666666666667,0.5666666666666667,0.43333333333333335,0.5333333333333333,0.4 5 | SVM,0.0,0.0,0.2666666666666667,0.0,0.0 6 | NBayes,0.6,0.6666666666666667,0.5333333333333333,0.5,0.6333333333333333 7 | -------------------------------------------------------------------------------- /.idea/news_emotion.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /data/trainset/pos_595252.txt: -------------------------------------------------------------------------------- 1 | 上周美国联储局一如预期维持现行1至1.25厘指标利率水平不变,但表示将「相对很快」缩减资产负债表 。此次声明指「总体通胀和核心通胀已经放缓」,措词基调略偏鸽派,令市场质疑将来加息的步伐可能放慢,拖累美汇指数曾触及去年六月以来最低水平93.152。上周德国公布七月Ifo企业景气判断指数升至纪录高位,加上有欧洲央行官员提出开始缩减超宽松货币政策规模的言论,上周四欧元兑美元一度升至两年半高位1.1777;而德国七月消费物价指数(CPI)初值意外地按月上升0.4%,好于预期和前值,良好数据加上美元近期疲弱,使欧元维持在高位上。市场憧憬欧洲央行可能因经济增长将会收紧货币政策,有利欧元走势,建议于1.17买入欧元兑美元,止蚀定于1.16,目标1.1860。中信银行(国际) -------------------------------------------------------------------------------- /other/get_data/GetData.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | 4 | df = pd.read_excel('news_r.xls') 5 | id_list = [] 6 | news_list = [] 7 | tag_list = [] 8 | for (_id,news,tag) in zip(df['id'],df['news_content'],df['tag']): 9 | if tag>0: 10 | em = 'pos' 11 | elif tag==0: 12 | em = 'neu' 13 | else: 14 | em = 'neg' 15 | txtname = "%s_%d.txt" % (em,_id) 16 | with open(txtname,'w',encoding='utf-8') as f: 17 | f.write(news) 18 | -------------------------------------------------------------------------------- /data/trainset/neg_2635_05_05.txt: -------------------------------------------------------------------------------- 1 | 联储局一如市场所料维持利率不变,虽然第一季经济增长放缓,但议息声明称属短暂,暗示不会影响加息步伐,市场继续观望六月及九月加息机会较大。投资者可多加留意今日公布的失业率及非农就业职位变化,估计后者在没有异常天气影响下返回正常水平,约见17万个,料美汇短线在99水平徘徊。欧元区第一季度经济增长做好,支持欧元在近月高位徘徊,然而短线焦点落在周日法国大选上,料马克龙最终能胜出,但市场在初选后开始消化大选结果预期,估计欧元短线上升空间不多,料上试1.10后见调整。英国首相文翠珊正式解散议会并筹备大选,无进一步有关脱欧的消息下英镑在1.28至1.29区间整固。欧洲政治风险有所放缓,日圆回软,料美元兑日圆上试113.80,金价下试1,220美元。商品价格回落,尤其是黑色金属类别,拖累澳元及纽元走势,料分别下试,0.73及0.68。在美加贸易矛盾上,估计美元兑加元上试1.38。交通银行香港分行 袁沛仪 -------------------------------------------------------------------------------- /data/trainset/neu_591877.txt: -------------------------------------------------------------------------------- 1 | ☉记者 张忆 ○编辑 弘文上证报记者获悉,昨日,“燧石星火”台湾学生创业夏令营在深交所正式启动。据介绍,本次夏令营为期3周,共接收64名台湾大学本科及硕士在校生,活动包括创业项目设计、模拟路演、企业走访、青年交流等。广东省台办、深圳市台办相关负责人及深交所监事长杨志华出席了本次开营仪式。杨志华在致辞中指出,当前,大陆深化供给侧结构性改革,推动创新驱动发展,呈现出良好开放的创业氛围,为台湾青年提供了实现抱负的机会和舞台。深交所以支持创业创新为己任,努力打造创新资本形成中心,希望通过支持台湾青年了解大陆经济发展,参与大陆创业创新,为推动两岸创新经济融合发展作出贡献。市场人士认为,开展“燧石星火”台湾学生创业夏令营活动,有助于增进两岸民间交往,深化两岸教育合作、推进两岸金融交流,孕育青年创业创新火种。深交所相关负责人表示,在全力办好本届夏令营的基础上,深交所还将为台湾青年提供更多的实习交流机会,不断完善助力台湾青年成长发展的创业金融支持平台。 -------------------------------------------------------------------------------- /data/trainset/pos_595052.txt: -------------------------------------------------------------------------------- 1 | 本来预计期指结算后,或令大户减低挟上诱因,但恒指依然强势毕呈,昨早上被腾讯(00700)带住上,午后就到滙丰控股(00005)接力,恒指最终以近全日最高位收市,报27,323点,升344点,主板成交869亿元。期指日市基本上无回过,从开市的26,966点升到27,228点收市,升285点,低水95点,总成交张数7.9万张;国期则升72点报10,833点,继续跑输恒指。正如笔者早前所言,大市反复向上格局未变,短期内仍宜买不宜沽。若从值博率出发,虽然国指有追落后诱因,但从年内走势看,国指明显跑输恒指,主因国指缺乏如腾讯及滙控等作为动力核心。正因如此,短期内若见资金仍以上述大价股作主力,则买期指胜算仍高于国期。策略上,昨早见腾讯重新发力,在27,050点以三分一注码买入好仓小试牛刀。午后发现恒熊街货重货区为27,300至27,399点,及最多新增区27,400至27,499点,一共有街货6.35亿份(相对期指约1,222张),在大户挟上诱因十足下,短期内会吼位再次加注,博今次杀上27,500点甚至两万八先肯停,跌穿26,800点止蚀。John Mullen -------------------------------------------------------------------------------- /data/trainset/pos_595491.txt: -------------------------------------------------------------------------------- 1 | 中新社北京8月1日电 (夏宾)8月首日,人民币汇率延续了7月份的上涨势头。 8月1日,中国官方报人民币对美元汇率中间价6.7148,较前一交易日上调135个基点,创下逾9个半月最高值,也是自2016年10月14日以来,人民币中间价首次涨回至6.71区间。资料图:山西太原,银行工作人员清点货币。中新社记者 张云 摄 当天早盘外汇市场上,在岸、离岸人民币对美元即期汇率亦涨势如虹,两者均突破6.72一线,截至北京时间10时30分,在岸、离岸人民币汇率分别报6.7176、6.7189。 美元指数则未能摆脱下行趋势。7月31日,美元指数尾盘跌破93整数关口,8月1日,美元指数最低触及92.82。 从此前整个7月份来看,人民币汇率中间价升值0.68%,而美元指数下跌2.95%,创下2016年3月以来的最大单月跌幅,也是美元指数连续第五个月下跌。 FXTM富拓研究分析师Lukman Otunuga表示,由于美联储近期对通胀的谨慎看法打击了美元,投资者对新兴市场的兴趣重燃,亚洲货币开始走高。尽管市场已普遍预料到美联储7月份将保持货币政策不变,但美联储对下一次加息可能的时机无明确表态也提振了新兴市场货币。 Lukman Otunuga认为,随着中国经济继续向好,加之若美元继续走软,人民币有望进一步上涨,而美国政治风波不断将令美元继续承压。(完) -------------------------------------------------------------------------------- /data/trainset/neu_591962.txt: -------------------------------------------------------------------------------- 1 | 江西煌上煌集团食品股份有限公司成立于1999年4月,其前身是1993年2月由现任集团董事局主席徐桂芬女士一手创建的“南昌皇上皇烤禽社”,1996年3月成立的“江西煌上煌实业有限公司”,是以畜禽肉食品加工为主的大型民营企业。2012年9月5日,煌上煌在深圳证券交易所正式挂牌上市。至此,中国酱卤肉制品领域第一股——煌上煌隆重诞生,同时该公司也是南昌县第一家上市企业。近年来,煌上煌坚持“立足江西,布局全国”的连锁经营模式,不断扩展,营销网络扩展覆盖江西、广东、福建、辽宁、北京、上海、河南、安徽、广西等全国20多个区域市场,连锁专卖店发展到近3000家。2015年,煌上煌搬迁了新加工园,投入巨资建设了标准化的厂房车间,在酱卤行业率先建立了十万级洁净车间。2016年,投资近2000万元从德国进口6条预包装生产线,实现技术转型升级,确保从生产源头上控制产品质量安全。同时,加大科技研发投入,投资3000万元打造国家级的研发检测中心,计划今年上半年全面通过国家3S技术认证,加强食品安全检测,提高食品质量,增强企业核心竞争力。目前,该集团已先后顺利通过ISO9001:2000国际质量体系认证、食品生产许可和市场准入质量安全(QS)认证及HACCP食品安全管理体系认证,并被国家有关单位和部门列为“中国肉类食品行业50强”“中国食品工业100强”“中国民营企业500强”和“农业产业化国家重点龙头企业”等。 -------------------------------------------------------------------------------- /data/trainset/neg_2617_05_05.txt: -------------------------------------------------------------------------------- 1 | 本周三美国联准会的会后声明一如外界预期维持利率不变,但下个月升息1码的可能性再度提高,加上中国经济扩张态势恐放缓,预测美元走强机率增加,人民币偏向盘整趋贬,建议投资人以偏多策略操作大小美人。中国4月官方制造业与非制造业PMI双双回落,其中制造业PMI由51.8下降至51.2,非制造业PMI由55.1下降至54;而2日公布的财新中国制造业PMI亦由51.2下降至50.3,为去年10月以来最低,增速下滑走势也与官方数据相符。从以上数据显示,中国制造业与非制造业PMI数据,虽仍位于50荣枯线之上,但扩张态势放缓,恐让市场担忧中国经济增长所面临的下行压力。而本周三联准会结束为期两天的政策会议,一如外界所预期般维持利率不变,在会后声明中,联准会对美国第一季经济成长仅0.7%表示担忧,但认为该疲弱仅属暂时现象,决策委员预期在货币政策立场缓慢调整的情况下,美国经济活动将以温和速度扩张,劳工市场情况将进一步转强,中期而言,通货膨胀将持稳于2%。联准会声明公布后,美国公债殖利率同美元指数一并走高,市场预期联准会下个月升息1码的可能性,已由60%上升至75%。昨(4)日人民币最新中间价为6.8957,较3日下降0.0065,创4月12日以来新低,反应美元指数在联准会会议后转强的态势,加上中国第2季经济增长恐面临下行压力,以及联准会6月升息机率提升,进一步带动美元指数反弹转强预期下,人民币可能将往3月中间价高点6.9125修正。(永丰期货提供,涂忆君整理) -------------------------------------------------------------------------------- /data/trainset/pos_594817.txt: -------------------------------------------------------------------------------- 1 | 沪深股市周一收市双双上涨逾0.6%,其中沪综指收市更创三个半月新高。麦格理报告预期,下半年沪综指仍会徘徊在3,200点至3,400点之间。A股上半年仅涨4.5%。(中新社图片)停牌逾50日 踢出MSCI沪综指周一收升0.61%,收报3,273点,七月累升2.52%,连续第二个月录得上扬,亦创今年二月后的最大单月升幅;深成指收升0.64%,收报10,505点,七月累跌0.23%。深圳创业板指数收升0.13%,收报1,736点,七月累跌4.5%。沪深两市主板成交金额回升至5,404亿元(人民币?下同)。沪股通连续第七个交易日录得净流入;深股通持续录得净流入。MSCI明晟董事总经理谢征傧接受外电访问时指,中国在全球市场中较特殊,停牌个股太多。他指MSCI会密切关注被纳入其新兴市场指数中的222只内地上市公司。他又指,若发现某公司停牌逾五十日,会将其剔出新兴市场指数,且至少未来十二个月内不会再重新加入指数中。报道又指,上述十二个月剔除的规则仅限于中国上市公司,而其他市场因长期停牌而被从指数中剔除的公司,只要恢复股票交易,就立刻可以开始重获纳入的审核程序中。并购时业绩承诺不可变内媒报道又指,中国证监会对于并购重组政策又作新窗口指导。要求并购重组时作的业绩承诺不可变更或调整。通过股东会调整已完成的并购重组约定的业绩承诺,也遭严控。至于A股后市,麦格理指,受市场流动性紧张及监管部门更严格的规限,故A股在上半年仅涨4.5%。该行料,下半年沪综指仍徘徊在3,200至3,400点,主要受三大因素影响,如市场流动性紧张、房地产市场放缓对市场带来的滞后反应渐浮现,以及政策会待「十九大」举行后才公布等。 -------------------------------------------------------------------------------- /other/more_process.py: -------------------------------------------------------------------------------- 1 | import multiprocessing 2 | import numpy as np 3 | lock = multiprocessing.Lock() 4 | def writer_proc(q): 5 | try: 6 | #if lock.acquire(): 7 | print('write') 8 | q.put(1) 9 | q.put({'fe':12}) 10 | q.put(np.array([1,2])) 11 | # lock.release() 12 | except: 13 | pass 14 | 15 | def reader_proc(q): 16 | try: 17 | 18 | print('read') 19 | while True: 20 | print(q.get()) 21 | # lock.release() 22 | except: 23 | pass 24 | 25 | if __name__ == "__main__": 26 | q = multiprocessing.Queue() 27 | writer = multiprocessing.Process(target=writer_proc, args=(q,)) 28 | reader = multiprocessing.Process(target=reader_proc, args=(q,)) 29 | writer.start() 30 | reader.start() 31 | 32 | writer.join() 33 | reader.terminate() -------------------------------------------------------------------------------- /data/trainset/neg_2621_05_05.txt: -------------------------------------------------------------------------------- 1 | 国际金价在4月17日反弹至1297.4美元每盎司的年内高位后,随着法国大选避险情绪阶段性降温以及投资获利了结,黄金随后12个交易日回撤近4.5%至1240美元每盎司,目前进入震荡盘整期。当前市场环境下,黄金之所以能够成为投资的宠儿,主要受以下因素刺激:一是美国近期多项经济数据不及预期,使得美联储5月加息预期减弱,黄金的投资价值也在不断增加。二是受到美国空袭叙利亚、朝鲜半岛局部冲突风险提升、全球恐怖袭击升级等地缘政治的紧张加剧,黄金的避险价值开始受到市场资金的关注。三是全球经济复苏势头仍面临较大阻力,多个主要经济体的数据都不乐观,宽松的货币政策仍在全球范围内维持,且宽松程度需要加码的呼声也在不断增加,黄金的保值功能日益凸显。在种种因素的叠加下,彻底激活了市场对黄金的投资情绪。进入5、6月,由于美国现政策的不确定性、叙利亚和朝鲜局势仍未缓解、法国大选决胜局的不完全明朗、英国脱欧事件的持续发酵、市场对经济复苏的持续担忧以及美股屡创新高后的下跌风险,都将继续提振黄金的投资人气,预计金价后市将大概率继续震荡上行。工行账户贵金属财富管理新利器2017年,如果您看好黄金的投资机会,想要抓住这一市场机遇有所作为,不妨多关注工行账户贵金属产品。工行账户贵金属是工行为个人客户提供的,采取只计份额、不提取实物贵金属的方式,以人民币或美元买卖贵金属份额的投资交易产品。既可做多也可做空,交易方式灵活多样。是您进行价值投资、实现财富管理的利器。即日起至6月末,工行人民币黄金、白银交易点差低至0.1、0.008元/克,更多详情请关注工商银行官方网银。(本文不构成投资建议,相关产品信息、活动信息以工商银行官方网站公布的产品文件和活动公告为准。市场有风险,交易需谨慎。)(刘朋原) -------------------------------------------------------------------------------- /data/trainset/neu_591954.txt: -------------------------------------------------------------------------------- 1 | 中证中小投资者服务中心(以下简称投服中心)是由中国证监会批准设立并直接管理的证券金融类全国性公益机构。《投资者》是投服中心主办、拟向社会公开连续出版的综合性集刊。该集刊宗旨是一切源于投资者、一切为了投资者、一切归于投资者,维护投资者权益,为投资者提供保护与服务。《投资者》以法学领域探究为侧重点,展现国内外投资者权益保护的最新理论与实务动态,内容以境内为主,境外为辅;以实践为主,理论为辅。栏目设置为“政策解读”、“理论探究”、“公司治理”、“市场实务”、“投教园地”、“案例探析”、“域外视窗”等,每卷根据实际情况可对栏目适当调整。《投资者》拟每季度出版一卷,全年出版四卷。现向社会公开征稿。一、征稿范围涉及法学、经济学及其他领域与投资者尤其是中小投资者及其权益保护相关的理论和实践性作品,且未曾公开发表或主体部分未曾公开发表,如有疑问可与《投资者》编辑部联系。二、投稿须知1.文章应当论点鲜明、逻辑严谨、可读性强、贴近市场,具有学术深度和实践应用价值,字数在6000-10000字为宜,特别优秀的理论文章字数不限。2.《投资者》编辑部保留对来稿进行文字性和技术性修改的权利。《投资者》所刊文章,均不代表投服中心观点,文责由作者自负。除作者特别说明外,其文章均为其个人观点,与其所在单位、职务无关。3.来稿请附上作者的姓名、单位、学校、职称或职务、通讯地址、邮编、电话或电子邮箱。4.投稿请将word文件发送至电子邮箱:tzzbjb@isc.com.cn。5.来稿一经录用,编辑部将及时通知作者;刊用后将根据文章质量及字数从优支付稿酬,并奉送样刊。6.本卷截稿时间为:2017年11月1日7.联系人:汤沸电话:021-60290620;15801890856 地址:上海市浦东新区世纪大道1701号钻石大厦B座11楼中证中小投资者服务中心《投资者》编辑部邮编:200122中证中小投资者服务中心《投资者》编辑部2017年7月31日 -------------------------------------------------------------------------------- /data/trainset/neg_2667_05_05.txt: -------------------------------------------------------------------------------- 1 | 内地经济扩张速度放缓,加上金融严监管,流动性持续偏紧,股债商品期货齐挫,沪指连跌3日至3个半月新低。人民银行维持资金紧平衡,拆息继续全线上升。分析师指,在人民银行、中国银监会、中国证监会和中国保监会(一行三会)全面加强监管下,资金持续偏紧,大市反弹乏力,预计后市将延续反复走势。沪指昨小幅低开后反复波动,即市一度反弹0.2%,之后冲高回落,收报3127点,跌7点,跌幅0.3%,连跌3个交易日,为今年1月20日以来的3个半月新低;深证成指收报10147点,跌0.4%。两市成交合计4,531亿元(人民币,下同),较上日略有增加,其中沪市佔2,002亿元。雄安概念领涨 煤炭金属挫从盘面看,行业板块普遍下跌,航天航空、船舶制造、有色金属、煤炭等板块大跌,跌幅靠前;但水利建设、雄安概念、铁路基建、水泥建材、环保等板块逆市走强。展望后市,分析师指金融监管全面加强,资金持续撤离,经济增速预期放缓,短期后市将维持反复走势,但一带一路、雄安概念、国企混合制改革等板块将成市场反复炒作题材。在金融监管风暴下,国债期货昨高开后迅速掉头下行,午后跌幅扩大,最后全线大幅收跌。而商品期货昨日再掀跌停潮,黑色系集体重挫,铁矿石、橡胶、热卷、郑醇主力封住跌停。螺纹钢、焦炭收市均大跌逾6%,焦煤跌5.8%,沪镍跌4.4%。在金融监管风暴下,人民银行昨在公开市场进行500亿元逆回购,刚好对冲500亿元到期逆回购,实现零投放,维持市场资金紧平衡,加上周三到期的2,300亿元中期借贷便利(MLF)没有续做,上海银行间同业拆放利率(Shibor)继续全线上升,其中隔夜拆息升至2.8506厘,7天利率则升至2.927厘。传收紧IPO标准 当局否认针对市场关于新股首次新股发行(IPO)审核「内部标准」的3大传闻:要求企业上市辅导时间必须满18个月;主板中小板、创业板的盈利要求上调至5,000万和3,000万元;影视、传媒、娱乐(包括游戏)、文化和互联网企业原则上劝退。《上海证券报》昨引述关部门人士称,以上传闻均与事实不符,且相关部门并未对传闻所涉内容进行过修改研究。 -------------------------------------------------------------------------------- /data/trainset/pos_594613.txt: -------------------------------------------------------------------------------- 1 | 特斯拉(Tesla)新款电动车Model 3上周末开始交货,成为股价向上动力,加上投资者对美企业绩乐观,刺激道指周一早段再创新高,惟标指及纳指则走势反复。道指曾升86点,创21916点新高,本港今晨零时(开市后2小时30分),升78点,报21908点;标指升不足1点,报2473点;纳指跌17点,报6357点。Stoxx欧洲600指数收市跌0.1%,英股升3点,法德股跌0.7%及0.4%。Tesla新车交付 股价先升后回特斯拉Model 3上周五开始交货,为股价带来支持,早段曾升1.9%,但午市回软。惟Facebook被指面对数码广告饱和的风险,遭研究公司Pivotal Research调低股票评级至沽出,令股价受压,一度跌2.3%。另外,Snapchat母企Snap的IPO后限售期届满,持货内部人员和员工纷纷沽售,令公司股价急挫最多5.1%。不过,投资者仍对美企本周公布业绩乐观。至今73%已经公布业绩的标指美企表现均胜预期。路透社数据更显示,标指美企首季盈利按年增长15%,次季盈利则预料升11%,可望自2011年后首次连续两季录得双位数的盈利增长。虽然华府削减企业税和增加基建开支等政策受阻,但受惠于企业削减成本见效、美元走弱和消费者开支强劲,让美企业绩取得亮丽表现。按行业计算,科网股、金融股、工业股和医疗股按年都录得盈利增长,只有公共股录得跌幅。专家:一时波动离场 小心走宝投资策略顾问公司Yardeni Research策略师阿德尼(Edward Yardeni)亦表示,美股3大指数近期创新高,是美企业绩表现理想推动,倘投资者因股市一时动荡而离场,可能错失获利机会。阿德尼指出,基本面正以合适速度增长。鑑于美企业绩造好,令经济数据的增长看起来有些缓慢,但无论如何,因为全球经济表现理想,令美企有可观的收入和盈利。他续指,有些牛市会「爬过忧虑之墙」(climbed a wall of worry,即克服多个利淡因素),而今次也不例外。他称标指年底目标为2500点,预测明年中之前会续升至2600至2700点,意味比现时水平还有5%至9%的上行空间。 -------------------------------------------------------------------------------- /data/trainset/pos_595219.txt: -------------------------------------------------------------------------------- 1 | 特斯拉(Tesla)新款电动车Model 3上周末开始交货,成为股价向上动力,加上投资者对美企业绩乐观,刺激道指周一早段再创新高,惟标指及纳指则走势反复。道指曾升86点,创21916点新高,本港今晨零时(开市后2小时30分),升78点,报21908点;标指升不足1点,报2473点;纳指跌17点,报6357点。Stoxx欧洲600指数收市跌0.1%,英股升3点,法德股跌0.7%及0.4%。Tesla新车交付 股价先升后回特斯拉Model 3上周五开始交货,为股价带来支持,早段曾升1.9%,但午市回软。惟Facebook被指面对数码广告饱和的风险,遭研究公司Pivotal Research调低股票评级至沽出,令股价受压,一度跌2.3%。另外,Snapchat母企Snap的IPO后限售期届满,持货内部人员和员工纷纷沽售,令公司股价急挫最多5.1%。不过,投资者仍对美企本周公布业绩乐观。至今73%已经公布业绩的标指美企表现均胜预期。路透社数据更显示,标指美企首季盈利按年增长15%,次季盈利则预料升11%,可望自2011年后首次连续两季录得双位数的盈利增长。虽然华府削减企业税和增加基建开支等政策受阻,但受惠于企业削减成本见效、美元走弱和消费者开支强劲,让美企业绩取得亮丽表现。按行业计算,科网股、金融股、工业股和医疗股按年都录得盈利增长,只有公共股录得跌幅。专家:一时波动离场 小心走宝投资策略顾问公司Yardeni Research策略师阿德尼(Edward Yardeni)亦表示,美股3大指数近期创新高,是美企业绩表现理想推动,倘投资者因股市一时动荡而离场,可能错失获利机会。阿德尼指出,基本面正以合适速度增长。鑑于美企业绩造好,令经济数据的增长看起来有些缓慢,但无论如何,因为全球经济表现理想,令美企有可观的收入和盈利。他续指,有些牛市会「爬过忧虑之墙」(climbed a wall of worry,即克服多个利淡因素),而今次也不例外。他称标指年底目标为2500点,预测明年中之前会续升至2600至2700点,意味比现时水平还有5%至9%的上行空间。 -------------------------------------------------------------------------------- /other/paper/run.py: -------------------------------------------------------------------------------- 1 | if __name__=='__main__': 2 | ###### 生成样本 ##### 3 | best_vector = 'outofdict' 4 | best_model = 4 # 代表Logistic回归 5 | less_index = (resultY[best_vector]==0) 6 | less_vector = resultX[best_vector][less_index,:] # 所有中性样本 7 | 8 | new_size = int(0.25*len(less_vector)) 9 | new_vector = np.empty((new_size,len(less_vector[0]))) # 新生成的训练集 10 | new_tag = np.ones(new_size) 11 | # print(new_vector.shape) 12 | for index in range(new_size): 13 | my_generator = GenerateSample(less_vector,topk=5) 14 | new_vector[index] = my_generator.generate() 15 | 16 | new_x_list = resultX[best_vector].tolist() 17 | new_x_list.extend(new_vector.tolist()) 18 | new_x = np.array(new_x_list) # 最新生成的训练向量 19 | 20 | new_y_list = resultY[best_vector].tolist() 21 | new_y_list.extend(new_tag.tolist()) 22 | new_y = np.array(new_y_list) 23 | print(len(new_x)) 24 | print(len(new_y)) 25 | rate = loocv(new_x,new_y,mode = best_model) 26 | print(rate) -------------------------------------------------------------------------------- /data/trainset/neg_2612_05_05.txt: -------------------------------------------------------------------------------- 1 | 井楠金融市场广州日报讯 (全媒体记者井楠)北京时间本周三到周四,美联储5月议息会议如期召开,如机构所料并没有加息。其在会后声明中表示,尽管美国第一季度经济指标不尽如人意,但美联储仍表示通胀已接近目标位,强调就业市场趋紧,暗示了可能会在6月份收紧货币政策,即加息。市场对此的理解是“态度偏向鹰派”。黄金4月涨幅被尽数回吐在此影响下,美元指数从周四凌晨开始攀升,至99.33;而以美元计算价格的避险资产——黄金却出现了最大为21美元/盎司的回调,瀑布式跳水,跌至1233美元/盎司的一个半月低位,4月涨幅被尽数回吐。现货白银更是下跌超过2%,跌至16.39美元/盎司的近四个月低位,并录得连续第12个交易日下挫,创下自2001年以来的最长下跌期。黄金市场的技术面与基本面均变得不利。技术面来看,昨日大跌后,金价已经跌穿了50和200日的移动均线,说明短期可能进一步下跌。基本面来看,美联储的货币政策有可能转向鹰派,加息预期将给金价带来巨大压力,而前期地缘政治动荡带来的避险需求高增,影响力已经有所减弱。金价是否会由此一蹶不振,仍需要观察,欧洲政治也是影响其价格走势的重要因素,目前不确定因素较多:美元虽然有所抬升,但没有迅速升破100大关,也有可能重回弱势。黑色系板块仍有续跌空间美联储会议对于原油与大宗商品市场也产生了利空影响,隔夜纽约油价继续下行,在48美元/桶以下位置波动,接近5个月新低。周四白天,原油、黄金均保持向下姿态。国内大宗商品市场周四开盘即暴跌,黑色系产品集体向下,4品种封底跌停。下午收盘,铁矿石、橡胶、热卷、甲醇期货的主力合约收于跌停,螺纹钢、焦煤、焦炭的单日下跌幅度超过了5.5%,沪镍、PVC的单日跌幅度超过4%,玻璃、沥青、沪铜的跌幅超过了3%。除了美联储鹰派言论带来的利空,产业链需求不足、供给依然较大、房产市场预期交易向下,也是大宗商品领头羊板块——黑色系产品连续下跌的重要原因。技术面来看,在连续下破重要技术关口后,黑色系产品已经进入了短线熊市,何时筑底仍不确定,仍有进一步下行空间。鉴于原油、黄金与大宗商品短线暴跌之后均前景不明,专业人士提醒散户投资者:抄底行为应谨慎。 -------------------------------------------------------------------------------- /data/trainset/neg_2641_05_05.txt: -------------------------------------------------------------------------------- 1 | ☉记者 王宙洁美联储按兵不动美联储在北京时间周四凌晨宣布,维持联邦基金利率目标区间在0.75%至1%的水平不变,符合市场普遍预期。美联储在政策声明中还表示,消费者支出稳健、企业投资增加,且通胀接近美联储的目标水平,暗示暂时不会改变今年再加息两次的节奏。美联储今年3月宣布加息25个基点,并释放信号称考虑在今年稍晚开始缩减资产负债表。华盛顿邮报指出,大多数经济学家认为,经济数据的疲弱表现可能只是暂时性的。然而,如果一连串令人失望的数字继续出现,那么可能会说服美联储在经济进一步加强前暂缓加息。美联储强调说,加息步伐将取决于经济状况。但其他分析师警告说,提高利率太慢也会带来风险。如果美联储没有通过逐步提高利率来摆脱通货膨胀,那么这可能会使它在此后需要更快地加息,对企业和消费者而言这会带来不和谐的过渡。全球黄金需求量下滑世界黄金协会周四发布的报告显示,今年一季度,全球黄金需求量减少18%至1034.5吨,为2010年以来同期最低。各国央行对黄金的需求触及近6年最低,在一季度仅买入了76吨黄金,较上年同期减少约27%。此外,由于外界预期美联储可能最快于6月加息,美元指数一度在周四触及两周高点。当日,现货金价格盘中触及3月21日以来最低位1232.60美元。MarketWatch援引美国银行策略师的话分析说,尽管美国第一季度经济数据有所回落,美联储似乎仍将在2017年进一步加息两次并计划缩减资产负债表。实际利率上涨往往会降低持有黄金的机会成本,因为金属不会产生收益。较高的利率也可能提振美元的价值,这通常与黄金价格走势相反。波多黎各申请破产保护美国联邦领地波多黎各总督里卡多·罗塞略周三表示,已请求联邦监督委员会根据美国参议院去年通过的一项法案,对波多黎各债务进行重组并提供破产保护。由于美国政府原先对波多黎各提供的一些税收优惠政策到期终止,再加上全球金融危机的冲击,波多黎各经济持续多年衰退。当地政府常年靠大举发行市政债券来弥补财政缺口和提振经济,最后造成债务负担大幅攀升,目前高达700亿美元以上。路透社说,破产或许不会马上改变波多黎各民众的日常生活,但可能导致未来的退休金和职工福利被削减以及医疗和教育服务缩水。波多黎各有45%的人口生活贫困,近10年来经济处于衰退状态,失业率约为11%,过去10年来人口减少约一成。 -------------------------------------------------------------------------------- /data/trainset/neu_591908.txt: -------------------------------------------------------------------------------- 1 | ■本报记者 吕 东时光飞逝,A股银行IPO闸门重启已经整整一周年。自去年此时江苏银行顺利成功实现A股上市后,上市银行数量目前已快速扩容至25家。就在上市银行不断增加的同时,处于证监会A股IPO排队企业的名单也同样一直处于变化之中。新面孔属地分布更为广泛,江苏省内排队银行数量缩至2家,并出现了西北地区首家排队上市银行。A股、H股以及终止“老14家”银行各有归宿随着2016年8月2日江苏银行成功登陆上交所,A股市场上市银行终于由16家增至17家,这一数量的细小变化足足用了6年之久,而彼时距离上一次城商行成功IPO更是过去了将近十年时间。江苏银行的上市也拉开了新一轮银行A股IPO的大幕。在此后的一年时间内,相继又有8家银行登陆A股市场。至此,短短一年时间,A股市场的上市银行数量就从长期未变的16家激增至目前的25家。上市银行队伍的扩容,必然带来了IPO排队银行名单的变化。目前排队银行已与三年前披露的首批排队银行发生了翻天复地的变化,这其中既有如江苏银行一般顺利上市的,也有就此终止上市以及远赴港股市场上市的银行,可谓各有归宿。2012年,随着证监会首发申报上市企业名单的出炉,地方银行排队上市的谜底也告揭晓。当时共有14家地方银行齐聚此份名单之中,江苏省内银行在上市队伍中可谓出尽风头,在14家申请上市的银行中独佔5家,同时更是包揽了所有农商行的排队名额。而地处东北地区的辽宁省则以盛京银行、大连银行、锦州银行成为入围城商行最多的省份。此外,还有名单中还包括上海银行、贵阳银行、杭州银行、重庆银行、徽商银行、东莞银行。目前,在最早进入名单的14家银行中,江苏银行、贵阳银行、杭州银行、上海银行、江阴银行、常熟银行、无锡银行、吴江银行、张家港行等均已在沪深交易所挂牌交易,而上述银行也是IPO最为顺利的。除此之外的银行的A股上市之路则要坎坷的多。重庆银行、徽商银行以及锦州银行因赴H股上市而一度终止在A股上市,如今这些银行都宣布有意重返A股。除此之外,大连银行、东莞银行、盛京银行的上市进程被陆续“终止”。江苏排队银行缩至两家西北地区银行首次亮相目前,排队上市的银行已全部被新面孔所占据。而与首批排队银行多分布于江苏、东北地区所不同,这些新面孔的分布区域则更为分散。目前,两市共有12家银行处于正常排队状态,其中兰州银行、青岛农商行、青岛银行、苏州银行和郑州银行拟在深交所挂牌,威海市商业银行、长沙银行、西安银行、哈尔滨银行、成都银行、江苏紫金农商行以及浙江绍兴农商行拟在上交所挂牌。新面孔中,只有苏州银行及紫金农商行出自江苏。此外,地处西部地区的排队银行数量则有所增加,分别为成都银行、西安银行以及兰州银行,而兰州银行则为了我国西北地区首家排队等待IPO的地方银行。银行A股IPO重启一周年12家“新面孔”担纲 -------------------------------------------------------------------------------- /data/trainset/neu_591920.txt: -------------------------------------------------------------------------------- 1 | 每经记者 谢欣 每经编辑 姚治宇作为A股不多见的自称“无实际控制人”的上市公司,四环生物(000518,SZ)的股权长期处在纷争之中。7月31日午间,四环生物公告称,公司被自然人股东王洪明二度举牌,持股达到10%。“老熟人”二度举牌此前,四环生物第一大股东为昆山市创业投资有限公司(以下简称昆山创投),其与四环生物另外两大股东中微小企业投资集团股份有限公司(以下简称中微小投资)以及广州盛景投资有限公司(以下简称广州盛景)被外界认为相互支持,称之为“昆山系”。此前王洪明曾被广州盛景公开质疑,其与包括四环生物原控股股东德源纺织以及东陆宇、孙一帆等众多自然人股东同为“阳光系”成员,双方也曾多次在股东大会对垒。而此次王洪明短时间内连续举牌,四环生物控制权之战是否会被再次点燃引市场关注。根据四环生物7月31日午间公告,公司股东王洪明其在7月28日通过深圳证券交易所大宗交易系统买入四环生物股票2062万股,此次增持结束后,王洪明合计持有公司股份10295万股,占公司总股本的10.00%。值得注意的是,在7月24日,四环生物公告称,王洪明于7月21日通过深圳证券交易所大宗交易系统买入四环生物股票31万股,完成对上市公司的第一次举牌。而仅过一周王洪明就实现二度举牌。四环生物公告称,本次权益变动未导致公司第一大股东发生变化,公司股权结构分散,不存在控股股东和实际控制人。根据四环生物今年一季报,昆山创投持股8.60%为上市公司第一大股东,不过,其与昆山市能源建设开发有限公司(以下简称“昆山能源建设”)以及昆山创业控股集团有限公司(以下简称“昆山创控”)为一致行动人,合计持有四环生物10%的股份。其中昆山能源建设持股1.35%,昆山创控持股0.05%。而事实上,《每日经济新闻》记者发现,王洪明已经是四环生物的老股东了。在四环生物2014年一季报中,王洪明就已经持股2.16%,位列四环生物第四大股东。控制权大战再打响?自从原来四环生物原控股股东江阴市振新毛纺厂(以下简称振新毛纺厂)自2010年8月31日起减持四环生物股票,至2011年9月5日,振新毛纺厂持有的四环生物股票减至2000万股,仅占四环生物总股本的1.943%;四环生物的第一大股东变成广州盛景之后,四环生物的控制权便一直扑朔迷离,争夺不断。广州盛景成为四环生物第一大股东之后,昆山创投与中微小投资也先后加入战局。从四环生物这些年历次股东大会看,广州盛景、昆山创投与中微小投资互相之间并非是斗争关系,相反,三者甚至存在着一定程度上的相互支持。而“昆山系”尽管经常位列四环生物前几大股东,但事实上并未实际控制四环生物,甚至在股东大会与董事任免上屡次受挫。广州盛景此前更是因董事任免问题将四环生物告上法庭。而根据此前媒体报道与广州盛景的公开质疑,与“昆山系”进行四环生物控制权斗争的是“阳光系”。王洪明也正是“阳光系”的重要成员。事实上,王洪明是江苏阳光(600220,SH)董事、副总经理,同时还是江苏阳光大股东江苏阳光有限公司的母公司江苏阳光控股集团有限公司的股东。因此,不仅引人猜测,王洪明迅速的两度举牌,是否打响了四环生物新一轮控制权争夺战?此外,广州盛景此前还公开质疑,王洪明与德源纺织(一季报持股4.93%)等四环生物的几大股东存在一致行动关系,均为“阳光系”成员,不过此说法并未被相关方认可。不过,由于四环生物目前中报尚未发布,“昆山系”各成员持股比尚不得而知,后续双方是否会继续增持值得关注。7月31日,《每日经济新闻》记者电话四环生物董秘周扬,欲对昆山创投最新持股以及王洪明与“阳光系”关联等情况进行采访,并按其要求发送采访函至公司邮箱,但截至记者发稿,尚未得到回复。 -------------------------------------------------------------------------------- /data/trainset/neg_2625_05_05.txt: -------------------------------------------------------------------------------- 1 | ■本报见习记者 龚梦泽截至目前,国内上市航企2016年报已全部公布完毕。2016年被业界视作中国航空业盈利大年,处于十多年来低点的油价与不对冲航油成本的做法,推动航企净利润大幅增长。然而,在利润增长的同时,国内航企的负债规模也在迅速膨胀。《证券日报》记者根据同花顺数据统计,7家航企去年负债达到惊人的5576亿元,平均负债率为61%。其中,春秋航空、中国国航、南方航空和东方航空资产负债率超过60%,分别达到63%、66%、73%和76%。值得一提的是,与巨大负债相对应的是庞大的财务费用支出。最新数据显示,2017年一季度四家航空公司财务费用合计已超过230亿元,而同期归属于母公司股东的净利润合计仅67亿元。“为负债打工”成为了航空公司的常态。7家上市航企去年负债5576亿元《证券日报》记者根据同花顺数据统计,截至5月3日,已经发布2016年年报的7家上市航空公司负债达5576亿元,平均负债率为61%。目前,我国已形成了中央控股航空公司为第一梯队,地方航空公司为第二梯队,民营航空公司不断发展的竞争格局。具体来看,四大航空公司负债总额稳居前列,其中东方航空居首,达到1600亿元;中国国航、南方航空和海南航空分别为1477亿元、1458亿元和803亿元,同比分别增长1.2%、0.37%、6.62%和-7.54%;资产负债率方面,东方航空最高,达到76.15%,南方航空、中国国航和春秋航空分别为73%、66%和63%。事实上,国内航空公司的高负债并不是今年才有的情况,自从2014年以来,四大航空公司的负债总额一直都维持在5000亿元以上。记者通过翻查四大航空公司的财报发现,从2010年到2017年,四大航空公司的总负债增加了约1970亿元,平均每年增加330亿元。尽管各大航空公司实际上一直在努力降低负债水平,但普遍负债率依然高企。如果将四家公司当做一个整体计算,过去10年,航企负债率始终维持在70%以上,最高时甚至一度超过90%。有分析师对记者表示,国内航空公司目前多数还处于发展期,为了抢佔佔有率需要花费大量资本进行扩张。鉴于飞机等固定资产的折旧年限高,资产回报稳定,因此航空公司一般都会用飞机作为质押进行融资,从而导致国内航企普遍负债率高企。值得注意的是,海南航空是四家航企中唯一一家实现负债总计下降的航空公司。数据显示,海航集团整体年收入突破6000亿元,员工总人数超过41万人,而在快速发展的道路上,集团的资产负债率却实现“七连降”,其中旗下上市公司海南航空2016年的资产负债率为54%。记者了解到,海外并购是海航降成本的重要推手,一连串的海外并购由战略投资者、基金机构、信讬、银行等共同完成,借鉴了很多国际并购经验,并在一定程度上抵消了资产负债率的上升。上述人士还表示,各大公司的飞机储备会逐渐趋于饱和,随着飞机和基础设施的年限上升,以及公司发展扩张能量的下降,未来各大航空公司的负债率将会逐年下降。加速降低美元债事实上,航空业可以说是国内盈利受汇率因素影响最显著的行业之一。数据显示,沪深300指数包含的航空业上市公司,过去5年汇兑损益规模在全部300家公司中占比举足轻重。数据显示,2016年,由于四大航偿还了较多的美元负债,资产负债率和债务资本化比率分别为68.17%和56.65%,较2015年末分别下降5.15和7.42个百分点。根据国航年报显示,2016年公司一方面通过调整飞机引进模式,有效控制美元带息债务规模;另一方面积极调整债务币种结构,使公司美元带息债务规模及其比重显著下降。截至2016年末,中国国航美元债务占比为49.12%。南方航空则表示,因提前归还了18.37亿美元负债,其人民币融资比例由30.69%提高至51.16%;东方航空的美元债务占比也降低到了44.89%;海南航空截至2016年末的美元债务为282.5亿元,据此测算,其美元债务占比为35.19%。对此,业内人士向记者表示,航空企业拥有大量的美元债务,因此人民币汇率的变动对航企的盈利水平有较大影响。如果美联储加息的预期一旦确定,未提前锁定利率的美元负债势必面临利息增加的压力,彼时航企将不得不面临和汇率与利率的双重风险。 -------------------------------------------------------------------------------- /ml_model.py: -------------------------------------------------------------------------------- 1 | """ 2 | 封装了用到的机器学习模型 和 相关的操作 3 | 1. 每个机器学习返回的是训练好的模型 4 | 2. 注意参数的shape 5 | """ 6 | # encoding:utf-8 7 | import numpy as np 8 | from sklearn import linear_model 9 | from sklearn.neighbors import KNeighborsClassifier 10 | from sklearn.ensemble import RandomForestClassifier 11 | from sklearn.naive_bayes import MultinomialNB 12 | from sklearn.svm import SVC 13 | 14 | # KNN算法 15 | def neighborKNN(trainVec,trainScore): 16 | knn = KNeighborsClassifier() 17 | knn.fit(trainVec,trainScore) 18 | return knn 19 | # Logistics回归 20 | def linearLogistic(trainVec,trainScore): 21 | model = linear_model.LogisticRegression(penalty = 'l1') # 采用多分类的Logistics模型 22 | model.fit(trainVec,trainScore) 23 | return model 24 | # 随机森林 25 | def randomForest(trainVec,trainScore): 26 | model = RandomForestClassifier(max_depth=None) # 取消最大深度,防止过拟合 27 | model.fit(trainVec, trainScore) 28 | return model 29 | # 多分类支持向量机 30 | def SVM(trainVec,trainScore): 31 | model = SVC() 32 | model.fit(trainVec, trainScore) 33 | return model 34 | # 采取多项式朴素贝叶斯 35 | def naiveBayes(trainVec,trainScore): 36 | model = MultinomialNB() 37 | model.fit(trainVec,trainScore) 38 | return model 39 | 40 | def saveModel(model,modelname): 41 | """ 42 | 存储训练好的模型 43 | :param model: 训练好的机器学习模型 44 | :param modelname: 模型存储路径 45 | :return: None 46 | """ 47 | try: 48 | with open(modelname,'wb',encoding='utf-8') as f: 49 | f.dump(model,modelname) 50 | except Exception as error: 51 | print('模型存储失败,因为:',error) 52 | 53 | def readModel(modelname): 54 | """ 55 | 读取存储的模型 56 | :param modelname: 模型的路径 57 | :return: 读取成功,返回模型;否则,返回None 58 | """ 59 | try: 60 | model = None 61 | with open(modelname,'rb',encoding='utf-8') as f: 62 | model = f.load(f) 63 | except Exception as error: 64 | print('模型读取失败,因为:',error) 65 | else: 66 | return model -------------------------------------------------------------------------------- /data/trainset/neu_591925.txt: -------------------------------------------------------------------------------- 1 | ——记中爱联宠平台创始人兼董事长蒋勤军来源:中国企业报 作者:张赫蒋勤军蒋勤军,连续五次成功创业者,创业企业包括一家上海证券交易所上市企业,一家深圳证券交易所上市企业。1969出生的蒋勤军,不仅是金发科技(600143)和高盟新材(300200)的创始人,也是第一批移动互联网创业的开拓者。2013年,蒋勤军在参加中欧创业精英成长营(简称中欧创业营)期间,学习了众多互联网创业的经验。后在探讨荣昌干洗的营业模式时,作为荣昌的股东和董事,其推动了荣昌创新的课题,之后便讨论出e袋洗的网络经营模式,并最终获得了腾讯、美国经纬和百度的投资。目前,e袋洗已经成为世界社区共享经济的开创者和领导者。蒋勤军多年来一直致力于生物科技在农业服务领域的应用,并于2014年11月2日推出一个基于智能手机移动互联网农业远程诊断的免费应用程序——农医生, 通过技术服务,使得农民的种植更加高效,将粮食的增产量提高20%—40%。农医生让农民知道,庄稼怎么种可以种得更好,怎么能不使用高毒农药,这从源头上解决了中国食品安全问题。2015年,农医生获得了世界互联网大会的最佳跨界应用奖,使之成为了农村互联网的标志性产品。从化工业,到农业,再到互联网洗衣,这一次,蒋勤军把目光锁定在了宠物行业。根据蒋勤军的观察和国外考察的切身经历,中国经过改革开放几十年发展,国人经济水平提高,即将迎来宠物行业的大发展。宠物作为人们的伴侣,会在人们生活中佔有更多时间。随之而来的宠物产业经济必然迎来蓬勃发展,然而中国宠物行业与国外包括美国等发达地区,还有很大的差距。看准机会,果断出击,2014年2月,蒋勤军创立中爱科技,同年推出“狗大夫”品牌, 2015年获得pre-A轮投资,2017年7月,经过三年打磨,“Lpet”联宠平台在北京清华大学紫光国际交流中心正式发布。同时,“Lpet”联宠平台获得由财政部全国中小企业发展基金和清控银杏基金联合投资的亿元A轮融资。此外,在发布会现场,中爱科技与京东达成千万宠物体检项目合作, 宠物主人只要上京东购买体检服务,即可到指定宠物医院预约体检项目,联宠检测中心作为第三方独立检测中心提供检测项目专业支持。该项目服务于京东数千万的宠物主人客户的同时,也将提升宠物健康体检意识,快速促进行业发展。“2017年是中国宠物行业发展腾飞年,全社会发展速度趋缓,而宠物行业作为朝阳行业异军突起获得了极大的关注。中爱科技作为一家致力于打造中国宠物行业第三方B2B的专业平台,将一直致力于通过先进的互联网技术为中国宠物行业提供更具竞争力的新商业模式。”蒋勤军说。据了解,联宠平台包括联宠医院管理软件、联宠国际采购商城、联宠国际检测中心三部分。联宠管理软件作为世界首款打通微信技术的互联网智能动物医院管理软件,它简单易用且能帮助医院全面优化工作效率。联宠管理软件不仅可以帮助宠物医院、宠物店实现更好的智能化高效管理,同时创新打通微信让医院和宠物店更好和客户沟通。通过软件,可将优秀的厂家品牌产品让更多宠物医院、宠物店知晓并使用,互联网技术让宠物行业更加智能便捷。联宠国际采购商城通过互联网服务,为全国超过5500家动物医院和5万多家宠物店提供一站式采购服务,并发展为宠物行业较先进、便捷的一站式采购平台。联宠国际采购商城作为一站式采购服务平台,专注宠物医院和宠物店B端采购,与各地供应商合作,维护行业规范,促进长期发展;通过互联网采购平台,让供应商降低营销成本,提升销售效率;对于医院和宠物店等采购商户,联宠采购商城的出现,免去挨家挨户打电话订货的麻烦,让采购工作变得更加轻松。联宠国际检测中心拥有行业中较权威医师团队,是国内首家由医院众筹且国际化的第三方检测连锁机构,为来自全国各地的医院提供一站式影像、检测、检验、分析等技术服务,并提供专业与准确的中英文报告。联宠国际检测中心专门服务于宠物医院,帮助宠物医院更好地保障宠物的健康,提供专业权威的检测诊断技术。独立第三方模式和众筹模式,让联宠国际检测获得广泛的宠物医院的支持,全国参与检测中心众筹的众多宠物医院就是对检测中心认可的证明。从蒋勤军十多年来的创业经历来看,他一直重视产品的创新,以及最新科技的应用。作为创始人之一,蒋勤军创立的广州金发科技(600143)生产的白色家电改性塑料,正迎合了家电进入中国千家万户的时机,高盟新材(300200),则是蒋勤军发现汽车将进入普通家庭时代,生产的胶粘剂将被大量使用在汽车上。在互联网时代,如何将产品创新与互联网新模式、新方向相结合,是他一直考虑的问题。“Lpet”联宠品牌,包含了蒋勤军的创业理念,以关爱(love),链接(link)为理念,通过智能互联网技术连接宠物行业公司和单位,实现共赢并发展壮大行业。蒋勤军也期待在未来10年即中国宠物行业发展的黄金10年,有更多优秀的行业企业、医院、单位及个人踊跃而出,共同促进中国宠物事业的蓬勃发展。蒋勤军,这名创业老兵,坚定地走上了宠物行业创业阵线。 -------------------------------------------------------------------------------- /data/trainset/neu_589538.txt: -------------------------------------------------------------------------------- 1 | □本报记者 官平“客户体验就是感觉麻烦,不管个人投资者还是法人户,都觉得麻烦,但没办法,合规是第一位的。 ” 7月31日,华东地区一家大型期货公司客户服务负责人表示,投资者适当性新规给客户和工作人员带来的最直接观感就是“比以前麻烦” 。7月1日正式实施的 《证券期货投资者适当性管理办法》已“满月” 。 中国证券报记者调研多家证券期货经营机构发现, 由于投资者、资管产品分类标准以及风控标准比以往更严格,除了反馈客户体验不佳外,新规还暂时 性造成部分公司客户权益下降、资管产品发行降速等。知情人士透露,监管层已经启动对期货公司落实投资者适当性制度,督促公司依法合规经营专项检查,预计陆续会启动对证券、基金及相关资管机构的检查。“按规矩办事”“目前来看, 只能把客户体验先放一放,宁愿流失客户,也不能违规。 ” 上述期货公司客户服务负责人表示。她透露,自然人客户以前习惯了互联网开户,但现在由于投资者适当性新规,监控中心系统没准备好,期货公司又不能单独建系统,所以客户开户受地域的限制较多,而且开户流程拉长,时耗增加。中国证券报记者还从一些券商处了解到,由于新系统运行还不稳定,公司的一些员工对客户分类以及相关资管产品分类的流程还不熟悉,不少投资者在券商处进行双录时,反馈体验感差,对双录的配合度比较低,部分投资者更是由于比较复杂的流程而取消业务办理。“客户不配合也没办法, 只能按规矩办事。 ” 上海一家券商机构人士说,客户的大多数反馈是麻烦, 就是办理业务的时间很长,加上双录环节后,平均每个业务的办理时间基本在20分钟以上。双录就是录音、录像,主要针对客户办理业务的过程, 特别是风险揭示的过程进行留痕,规范金融企业的销售行为,同时也为事后产生争议时提供依据。虽然给投资者及机构工作人员 “添麻烦” ,但业内人士表示,双录也是约束销售人员行为,规范业务办理流程,避免销售人员弱化或隐瞒风险、夸大产品收益,有利于经营机构的内部管理。 对投资人来说,也可以详细地了解产品信息、 风险等级及自己的权利责任,保障自身的合法权益。“比如买基金产品, 以前办理业务5分钟左右,填一下单子即可。 ” 上述券商人士表示。据了解,需要在营业网点进行双录的情形比较普遍, 比如普通投资者申请成为专业投资者,向普通投资者销售高风险产品或者提供相关服务,主动调整投资者分类、产品或者服务分级以及适当性匹配意见,向普通投资者销售产品或者提供服务等。新系统尚需调整完善“如果确实有客户不配合的话,我们只能合规优先,这一块我们公司管理和要求非常严格。 ” 上海一家期货公司负责人表示,目前公司严格执行投资者适当性新规,虽然遇到客户反馈麻烦的问题,但也都知道,这是为了双方好,避免未来产生更大的风险问题。不过,记者也了解到,一些券商营业部因为工作量大增, 部分工作人员鼓励投资者自己用手机办理业务, 以免因双录带来麻烦的情况。另外,对基金公司而言,尽管较少需要直接给投资者进行双录,但同样有“麻烦”需要面对。 目前,一些基金公司还在进行系统的调试, 部分基金公司至今还未上线新系统。业内人士透露,6月28日才提出可以新老划断,而在这之前所有基金公司都是按照全都要重来的规则进行系统改造的,6个月缓冲期也是新提出的,所以此前准备好的新系统还需要重新调整。而很多基金公司的系统都不是自己开发的,需要开发商来进行调整,所以进展更慢。上述期货公司客户服务负责人则透露,期货公司互联网开户只能用监控中心的系统,但监控中心系统还没出来,投资者适当性新规实施后, 目前阶段对期货公司和客户都很麻烦,行业内一些公司仍用现有的互联网开户系统是有问题的。利在长远中国证券市场起步伊始就是一个以个人普通投资者为主体的市场。如何从实际出发,逐步建立起有中国特色的投资者适当性制度, 是从根本上保护投资者,尤其是中小投资者的重要举措。7月28日,证监会新闻发言人常德鹏在例行新闻发布会上透露,证监会近期组织开展了2017年期货公司专项检查。 此次检查共涉及24个辖区、32家期货公司及其分支机构,旨在督促期货公司切实落实投资者适当性管理要求,保护中小投资者合法权益。上海一家券商资管机构相关负责人表示,新规实施后,各业务条线在人员配备、系统投入等方面进行了充分的资源调配,认真贯彻执行新的制度流程。新规更加优化了产品风险等级划分时的考虑因素,从严规范了经营机构的销售行为,会增加一定的管理成本。但是,从长远看这会对券商资管的产品设计、市场营销和经营理念等产生积极影响,带来长期利益。上海一家券商负责人对中国证券报记者表示, 预计下半年严监管的趋势将进一步延续,金融监管的专业性、统一性和穿透性将显 着加强,综合监管时代来临。 证券公司需要保持合规风控的战略定力,积极推动合规风控向行为自律、文化自觉转变,从“要我合规风控”转为“我要合规风控” ,同时要提升合规风控能力,加强风险源头管控,抓住关键环节,防范化解重点领域风险,着力加强推行风险预警管理、事中事后管理,强化自律管理和一线风控。 -------------------------------------------------------------------------------- /loocv_model.py: -------------------------------------------------------------------------------- 1 | # encoding:utf-8 2 | import pickle 3 | import os 4 | from collections import OrderedDict # 有序词典 5 | import numpy as np 6 | import ml_model as ml 7 | import operate_data as od 8 | import pandas as pd 9 | from pandas import DataFrame 10 | 11 | def loocv(xData,yData,mode,vecName=None): 12 | ''' 13 | 留一验证 14 | :param xData: 测试样例的元素 15 | :param yData: 测试样例的标签 16 | :return: 准确率 17 | ''' 18 | # 检查参数的维度 19 | assert len(xData)==len(yData),str(vecName)+":自变量/因变量维度缺失" 20 | error = 0 21 | length = len(xData) 22 | for i in range(length): 23 | lenList = [l for l in range(length)] 24 | del lenList[i] 25 | if mode==0: 26 | model = ml.neighborKNN(xData[lenList],yData[lenList]) 27 | elif mode==1: 28 | model = ml.linearLogistic(xData[lenList],yData[lenList]) 29 | elif mode==2: 30 | model = ml.randomForest(xData[lenList],yData[lenList]) 31 | elif mode==3: 32 | model = ml.SVM(xData[lenList],yData[lenList]) 33 | elif mode==4: 34 | model = ml.naiveBayes(xData[lenList],yData[lenList]) 35 | if model.predict(xData[i].reshape(1,-1))!=yData[i]: # 修复Bug 36 | error+=1 37 | 38 | return 1-error/length 39 | 40 | def loocvModel(): 41 | """ 42 | 调用loocv()函数对各种模型组合进行留一验证 43 | :return: info 44 | """ 45 | loocvPath = os.path.join('result', 'log', 'ml_rate.plk') # 最后全部的模型组合准确率存储的路径 46 | xpath = os.path.join('result', 'vector', 'resultX.npz') 47 | ypath = os.path.join('result', 'vector', 'resultY.npz') 48 | resultX = np.load(xpath) 49 | resultY = np.load(ypath) 50 | ###### 留一验证部分的代码 ###### 51 | modes = 5 52 | accuracyDict = OrderedDict() # 有序词典 53 | for key in resultX.keys(): # 每个key对应一类新闻文本翻译词向量的方法 54 | print('[+][+]', key) 55 | accuracyDict[key] = [] 56 | for mode in range(modes): # 5种模型机器训练模型 57 | accuracyDict[key].append(loocv(resultX[key], resultY[key], mode=mode, vecName=key)) 58 | print(' [+]Model:', mode, '=> Finished') 59 | 60 | # 存储最后的代码,便于以后调用和画图 61 | with open(loocvPath, 'wb') as f: 62 | pickle.dump(accuracyDict, f) 63 | print('Finish all models') 64 | 65 | def showResult(): 66 | """ 67 | 将所有的准确率全部整理成csv和excel格式文件 68 | :return: info 69 | """ 70 | loocvPath = os.path.join('result','log','ml_rate.plk') 71 | loocv = None 72 | with open(loocvPath,'rb') as f: 73 | loocv = pickle.load(f) 74 | # print(loocv) 75 | loocv = DataFrame(loocv,index=['KNN','Logistic','RandomForest','SVM','NBayes']) 76 | loocv.index.name = r'Model\Vector' 77 | loocv.rename(columns=str.title,inplace=True) 78 | print(loocv) 79 | resultExcel = os.path.join('result', 'show','result.xlsx') 80 | resultCSV = os.path.join('result','show','result.csv') 81 | try: 82 | loocv.to_excel(resultExcel) 83 | except Exception as e: 84 | print('Can not call packages about excel') 85 | finally: 86 | loocv.to_csv(resultCSV) 87 | print('Finish write to excel and csv files') 88 | 89 | if __name__=='__main__': 90 | loocvModel() 91 | showResult() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 0.快速开始 2 | 3 | - 挑战杯项目:金融文本情感分析模型 || Challenge Cup Project: Financial Text Emotion Analysis Model 4 | - 金融领域短文本情感分析 5 | - 配置要求:`python 3.x` 6 | 7 | ## 1.使用方法 8 | 9 | ### 1.0 下载 10 | 11 | ```shell 12 | sudo git clone https://github.com/AsuraDong/news-emotion.git news_emotion 13 | mv -R ./news_emotion/ 你的程序路径/ 14 | ``` 15 | 16 | ### 1.1 文件结构 17 | 18 | ```python 19 | clean_data/ # 清洗数据 20 | __init__.py 21 | clean_html.py # 清洗网页标签 22 | langconv.py # 简体和繁体转化 23 | zh_wiki.py # 简体和繁体转化 24 | data/ # 存放训练集和词典 25 | emdict/ # 存放词典 26 | material/ 27 | emotion_word.py # 知网情感词典 28 | stopword.txt # 中文停用词典 29 | NTUSD_simplified/ # 台湾大学NTUSD情感词典 30 | ... 31 | collect_dict.py # 生成之后程序需要的plk和用户词典 32 | trainset/ # 存放训练集 33 | ... 34 | model/ # 我们训练好的model模型 35 | wordfreq_logistic.ml 36 | other/ # 根据具体情况自行添加 37 | ... 38 | result/ #结果展示 39 | log/ 40 | best_model/ # 针对最好的模型的详细信息 41 | PR.json 42 | error_tag.json 43 | ml_rate.plk 44 | logfile.plk 45 | 3plus3arr.plk 46 | show/ # 组合模型的全部结果 47 | result.csv 48 | result.xlsx 49 | vector/ # 文本翻译后的词向量 50 | result.csv 51 | result.xlsx 52 | __init__.py 53 | loocv_model.py # 对组合模型进行留一验证,并且将结果写入csv和excel文件 54 | ml_model.py # 集成sklearn常用的自然语言的机器学习模型 55 | operate_data.py # 将文本处理成词向量,并且保存了logfile.plk 56 | README.md 57 | demo.py # 使用者(非开发者)调用框架的样例 58 | run_best.py # 人工找出loocv_model.py的最好结果后,进行最好模型的更详细分析 59 | ``` 60 | 61 | ### 1.2 使用方法 62 | 63 | **请参照`demo.py`的代码** 64 | 65 | 1. 打开`demo.py` 66 | 2. 如果: 67 | 68 | - **直接使用我们训练好的模型,在`if __name__=='__main__':`里面输入:** 69 | 70 | ```python 71 | od.loadStopwords() 72 | od.loadEmotionwords() 73 | od.loadWords(od.stopList) 74 | od.loadDocument(od.stopList) 75 | ##### 单例模式 ##### 76 | predictor = Predictor() 77 | predictor.load_model() 78 | predictor.set_mode(mode="wordfreq") # 以上代码是初始化配置,只需要调用一次 79 | 80 | ##### 下面的代码可以循环调用 ##### 81 | news = " 《经济通通讯社13日专讯》日股早市偏软,日经225指数报18312跌239点。 美元兑日圆疲软,新报108﹒78╱80。(tt)" # 这是您的新闻样本 82 | 83 | predictor.set_news(news=news) 84 | predictor.trans_vec() 85 | 86 | tag = predictor() # 分类结果 87 | ``` 88 | 89 | - 需要重新训练模型,那么在配置好`1.1`的文件后,在`if __name__=='__main__':`里面输入: 90 | 91 | ```python 92 | best_vector = "wordfreq" 93 | best_model = 1 # linearLogistic 94 | save_model(best_vector, best_model) 95 | ##### 单例模式 ##### 96 | predictor = Predictor() 97 | predictor.load_model() 98 | predictor.set_mode(mode="wordfreq") # 以上代码是初始化配置,只需要调用一次 99 | 100 | ##### 下面的代码可以循环调用 ##### 101 | news = " 《经济通通讯社13日专讯》日股早市偏软,日经225指数报18312跌239点。 美元兑日圆疲软,新报108﹒78╱80。(tt)" # 这是您的新闻样本 102 | 103 | predictor.set_news(news=news) 104 | predictor.trans_vec() 105 | 106 | tag = predictor() 107 | ``` 108 | 109 | 3. 成功后,相信你也差不多理解框架的用法,请尽情使用吧。 110 | 111 | ## 2. 联系我 112 | 113 | **个人网站**: [YuanXin.me](http://yuanxin.me/) 114 | 115 | Email:yuanxin.me@gmail.com 116 | -------------------------------------------------------------------------------- /data/trainset/neu_591904.txt: -------------------------------------------------------------------------------- 1 | ☉记者 吴正懿 ○编辑 孙放规范和支持上市公司并购重组——这是在上周召开的全国证券期货监管系统年中监管工作座谈会上,监管层对于并购重组监管工作所给出的权威定调。而据上证报记者的最新统计,近期上市公司并购重组(发行股份购买资产)的过会数量,环比已呈明显增长之势。同时,具有标杆意义的重磅个案也在频频出现。市场层面的信号不断,来自上市公司的信号也不可不察。上市公司的航船要驶过深海和浅滩,实现转型和跨越,自然离不开熟知资本航路的舵手。记者解析A股公司“权力交接”的轨迹发现,自2015年以来,至少有70家上市公司的董事长或总经理职位,换由具有金融或投资背景的“实权派”掌权,以引领公司转型升级。在A股资本意识觉醒的时代,这些拥有丰富投资与运营经验的掌舵者,以其在资本运作方面的独特优势,着力打造上市公司的未来,投射出A股市场产业与金融的环境变迁。易主公司的“空降兵”上证报资讯统计显示,剔除国企人事任免、家族企业权力交接等情况,并刨除金融类上市公司后,2015年以来,至少70家上市公司“空降”具有金融背景的董事长或总经理据记者统计,5至7月的重组过会数为28例,包括已实施的3例。而今年1至4月,过会数为25例,即最近三个月的过会案例数已超过此前四个月的数量。从个案看,自6月初ST云维公告借壳方案,到最近又先后有通达动力、江粉磁材披露借壳案,具有标杆意义的案例也在频频出现。可见,并购重组已渐呈回暖之势。另一方面,一个颇值得观察的现象是:近年来,随着经济结构转型升级,产业及资本深度融合,A股公司群体发生了深刻的产业变迁,掀起波澜壮阔的重组及卖壳浪潮。与此相伴的是,A股数百家公司董事长或总经理发生更迭,且不少新上位的掌舵者具有金融或投资背景。7月5日,金字火腿发布公告,禹勃当选为公司第四届董事会董事长,并获聘为公司总裁。公开资料显示,禹勃系中钰资本的董事长、合伙人、总经理。中钰资本专注大健康产业,着力打造中钰医生集团、医疗实业平台、产业投资基金等三大平台。去年,金字火腿通过受让及参与增资,累计耗资约6亿元控制了中钰资本51%股权,形成了火腿及肉制品、医疗大健康的双主业格局。金字火腿创始人施延军“让贤”禹勃,投射出公司产业转型的决心与重心。这并非孤例。上证报资讯统计显示,剔除国企人事任免、家族企业权力交接等情况,并刨除金融类上市公司后,2015年以来,至少70家上市公司获得具有金融背景的董事长或总经理,其最大的共性是这些公司正面临产业升级与业务重构。具体来看,这些“空降”的掌舵者可分为三类:一是,投资型公司入主上市公司后,新的实际控制人亲自出任董事长;二是,投资型公司买壳之后,实际控制人并不出面,而是派出专业投资人士出任董事长;三是,处于特殊时期的上市公司,专门聘请具有金融或投行背景的专业人士出任董事长。易主后名正言顺出任董事长的案例,包括四川金顶、科林环保、天首发展、华仁药业、瀚叶股份、友利控股等。比如,朴素资本今年初斥资12亿元入主四川金顶后,朴素资本董事长、总裁梁斐今年4月起担任公司董事长。科林环保易主后,新的实际控制人黎东当选董事长。友利控股现任董事长艾迪,系联创永宣董事长、总经理,去年底与另一实控人乔徽一起出资32.4亿元入主上市公司。“不少投资机构买壳之初便制定了转型计划,实际控制人本身具有丰富的项目资源与资本运作能力,入主后便会亲手掌舵上市公司筹划转型。”资深投行人士对记者表示。“私家订制”的专业团队在产业转型升级的背景下,越来越多的实业家开始关注到金融的重要性,上市公司引进此类专业人员是看中他们的融资能力与资本运作能力,另有不少企业准备向金融、类金融等产业领域转型,也急需此类人才与实际控制人走上前台不同,部分易主公司的董事长虽非由新任实控人担任,却也是其左膀右臂。比如,深圳惠程的实控人之一汪超湧仅担任公司董事一职,董事长、总裁的担子交给了徐海啸。履历显示,徐海啸曾任大鹏证券投行总部总经理助理、信达证券投行总部董事总经理、日信证券助理总裁兼投行部总经理,是汪超湧旗下北京信中利的董事。部分新东家则聘用了职业经理人团队。例如,金利科技易主后,实际控制人郭昌玮并未在上市公司任职,公司现任董事长、总经理郑玉芝与控股股东等各方均无关联。公司副董事长赵小川,曾就职于花旗银行集团,负责亚太区股权投资及并购业务,后任红隼资本董事、总经理。近期,一位不到30岁的董事长备受关注。今年4月,1988年出生的王皓被选举为东晶电子新任董事长,其曾任国信证券投资银行事业部经理,现任思通卓志投资法人、总经理等职,并通过东晶电子控股股东蓝海投控间接持有上市公司的股份。东晶电子主营石英晶体元器件,近年业绩惨淡,去年底易主蓝海投控。公司公开表示,后续不排除将会积极寻求新的投资方向,开展与优质资产、优质机构的合作,通过多种途径开拓公司新的经营领域和业绩增长点。显然,有着投行经历的王皓是东晶电子未来实施业务转型的舵手。再如,今年4月出任平潭发展总经理的丁湋,自2007年2月到2017年2月在招商银行就职达十年之久。近年,上市公司正积极向健康医疗、旅游等方向进行战略转型。浙江某上市公司高管对记者表示,在产业转型升级的背景下,越来越多的实业家开始关注到金融的重要性,上市公司引进此类专业人员是看中他们的融资能力与资本运作能力,另有不少企业准备向金融、类金融等产业领域转型,也急需此类人才。投行高参的“转型使命”在金融类人才“空降”队伍中,投行出身人士因其曾在资本市场深度浸润,更被市场关注。从另一个视角看,投行人士掌舵的公司,往往带有资本运作的强烈预期*ST金宇多次重组无果,去年11月“走马上任”的董事长刘波具有银行、证券等从业背景,副董事长、董秘吴小辉亦有相似经历。有意思的是,两人此前分别是中房股份的董事长和总经理。中房股份公告显示,去年6月,刘波、吴小辉一同辞职,后一起“转会”至*ST金宇。几乎与此同时,*ST金宇停牌筹划重大资产重组,并于今年初披露重组预案,拟作价13.2亿元收购安必平100%股权,后因故终止。台基股份年仅30岁的总经理袁雄,更是深度参与了公司的资本运作。简历显示,去年6月入职台基股份的袁雄,曾先后担任中信证券经理、高级经理、副总裁等职,在并购重组、跨境收购、中概股回归方面具有丰富的经验,曾主导了多个上市公司重大资产重组、中国企业跨境收购项目。一个有趣的细节是,去年6月,台基股份高管发生变动,公司实际控制人、董事长邢雁辞去总经理职务,转任总裁,总经理一职则交给了年轻的袁雄。据公告所述,袁雄全面负责公司的整体战略与资本运营,并负责公司泛文化娱乐板块的并购、整合与管理。袁雄出任总经理不久,台基股份便披露重组预案,拟以8.1亿元收购影视制作公司润金文化。在这个重组的配套融资部分,私募基金海德而立公司拟出资认购3.09亿元,而该基金的GP海德复兴资本的大股东正是袁雄。不过,在最新修订的方案中,因配套融资变为询价模式,相应的发行对象改为不特定对象。“在并购重组活跃期,部分头脑活络的投行人士比较吃香,他们手里有一些项目资源,与上市公司老板私交不错,不排除投行人士带着项目去上市公司任职,并促成资产并购等资本运作。”资深投行人士说。威华股份的案例更加耐人寻味。去年2月当选公司董事长、总经理的王天广,此前在银河证券、西南证券、长城证券等多家投行任职,曾任长城证券副总裁。威华股份与赣州稀土重组终止后,原实际控制人李建华于2015年7月辞职并开始大举减持。去年1月,威华股份启动定增预案,拟向盛屯集团定向发行股票,募资11亿元投入磁性材料等项目。去年6月,盛屯集团受让了李建华所持8.15%的股票。今年6月,李建华再与盛屯集团签署协议,将其所持10.49%股票对应的表决权、提名和提案权委讬给后者,正式易主。从这一揽子的交易看,王天广或在此中扮演关键角色。另一案例是,深圳凝瑞通过二级市场连续增持成为海欣股份第一大股东,但上市公司被认定为无实际控制人。去年9月,深圳凝瑞的派驻代表孟文波当选海欣股份董事长,其曾在国泰君安、方正证券、财富证券等多家券商任职。公司年报提出,公司将逐步形成以医疗健康产业为主、地产物业及金融投资为辅的“一主两翼、协同发展”的全新产业格局。“这些有着金融和投行背景的高参,显然对公司重组转型起着重要作用。但在当前的IPO发行节奏及监管背景下,优质资产越发难找,光有资本运作能力是不够的,上市公司的未来走向尚需观察。”投行人士表示。 -------------------------------------------------------------------------------- /other/paper/generate_sample.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import random 3 | 4 | class GenerateSample(object): 5 | def __init__(self,trainset ,topk = 10,loop = 4): 6 | self._trainset = trainset 7 | self.__size = len(self._trainset) # 样本数量 8 | self.topk = topk # 最邻近的k个元素 9 | self.loop = loop # 循环几次 10 | 11 | @classmethod 12 | def _cosSimilar(cls,arr_x,arr_y): 13 | res = GenerateSample(np.array([arr_x,arr_y])).cosSimilar(np.array(arr_x),np.array(arr_y)) 14 | print(res) 15 | 16 | # 计算余弦相似度 17 | def cosSimilar(self,arr_x,arr_y): 18 | if len(arr_y) != len(arr_x): 19 | return None 20 | top_result = np.sum(arr_x * arr_y) 21 | bottom_result = np.sqrt(np.sum(arr_x**2)*np.sum(arr_y**2)) 22 | return top_result/bottom_result 23 | 24 | # 返回距离index位置的向量的余弦距离 25 | def disArray(self,index = None): 26 | if (not index) or (index<0 or index>self.__size): 27 | index = np.random.randint(0,self.__size) # 如果没有index,随机分布生成 28 | # new:index是0,而距离又是[-1,1]。所以为了排序方便,直接取绝对值 29 | dis_arr = [self.cosSimilar(onevector , self._trainset[index]) for onevector in self._trainset] # 每个元素均计算 30 | return np.array(dis_arr),index 31 | 32 | # 参数是处理好的disArray 33 | def neighborArray(self,disarr): 34 | neighbor_index = np.argsort(disarr)[self.__size-self.topk:self.__size-1] 35 | return self._trainset[neighbor_index],neighbor_index 36 | 37 | # 开始生成 38 | def generate(self): 39 | dis_arr , base_index = self.disArray() # base_index 基础vector 40 | neighbor_arr, neighor_index = self.neighborArray(dis_arr) 41 | near_index = random.choice(neighor_index) 42 | near_vector = self._trainset[near_index] # 选出的最近vector 43 | # base_index && near_index 是我们选中的两个点 44 | for i in range(self.loop): 45 | alpha = np.random.rand() # 均匀分布生成系数 46 | if i % 2: 47 | alpha *= (-1) # 增加/减少扰动 48 | near_vector = near_vector + alpha*(near_vector-self._trainset[base_index]) 49 | self.__baseindex = base_index 50 | self.__nearindex = near_index 51 | self.__neighborindex = neighor_index 52 | return near_vector 53 | 54 | def show(self,x_num = 1,y_num = 1): 55 | try: 56 | assert len(self._trainset[0]==2) # 这里只对2个基数的vector做展示 57 | import matplotlib as mpl 58 | import matplotlib.pyplot as plt 59 | except Exception as error: 60 | print('请安装对应版本的matplotlib') 61 | return 62 | else: 63 | mpl.rcParams['font.sans-serif'] = ['FangSong'] 64 | mpl.rcParams['axes.unicode_minus'] = False 65 | plt.figure() 66 | for i in range(x_num): 67 | for j in range(y_num): 68 | plt.subplot(x_num,y_num,y_num*i+j+1) 69 | plt.scatter(self._trainset[:,0],self._trainset[:,1],color = 'blue',s = 1.5) 70 | vector = self.generate() 71 | plt.scatter(self._trainset[self.__baseindex,0],self._trainset[self.__baseindex,1],color="green",s = 10) 72 | plt.scatter(self._trainset[self.__neighborindex, 0], self._trainset[self.__neighborindex, 1], color="yellow", s=10) 73 | plt.scatter(vector[0],vector[1],color="red",s = 10) 74 | plt.show() 75 | 76 | def test(self,x_num = 5,y_num = 5): 77 | TOP = 100 78 | BOTTOM = 1 79 | SIZE = 100 80 | arr = np.array([[np.random.randint(BOTTOM, TOP), np.random.randint(BOTTOM, TOP)] for i in range(SIZE)]) 81 | myclass = GenerateSample(arr) 82 | myclass.show(x_num,y_num) 83 | 84 | if __name__=='__main__': 85 | pass -------------------------------------------------------------------------------- /demo.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pickle 3 | import numpy as np 4 | import operate_data as od 5 | import ml_model as ml 6 | 7 | VECTOR_MODE = {'onehot': 0, 'wordfreq': 1, 'twovec': 2, 'tfidf': 3, 'outofdict': 4} 8 | 9 | def save_model(best_vector,best_model): 10 | """ 11 | 存储效果最好的模型 12 | 需要手动指明参数名字 13 | :param best_vector: 最好的文本->词向量的方法 14 | :param best_model: 最好的机器学习模型 15 | :return: info 16 | """ 17 | od.loadStopwords() 18 | od.loadEmotionwords() 19 | od.loadWords(od.stopList) 20 | od.loadDocument(od.stopList) 21 | xpath = os.path.join('result', 'vector', 'resultX.npz') 22 | ypath = os.path.join('result', 'vector', 'resultY.npz') 23 | resultX = np.load(xpath) 24 | resultY = np.load(ypath) 25 | new_x, new_y = od.twoTag(resultX[best_vector], resultY[best_vector]) 26 | model_saved = ml.linearLogistic(new_x, new_y) 27 | path = os.path.join('model','wordfreq_logistic.ml') 28 | with open(path,'wb') as f: 29 | pickle.dump(model_saved,f) 30 | print("Save over") 31 | 32 | class Predictor(object): 33 | """ 34 | 更多的使用说明请去看README.md 35 | """ 36 | def __init__(self): 37 | self._model = None 38 | self.news = None 39 | self.__tag = None 40 | self._vec = None 41 | self.mode = None 42 | 43 | def load_model(self,path=None): 44 | if not path: 45 | path = os.path.join('model','wordfreq_logistic.ml') 46 | 47 | with open(path,'rb') as f: 48 | self._model = pickle.load(f) 49 | 50 | def set_mode(self,mode): 51 | if isinstance(mode,int): 52 | assert mode in VECTOR_MODE.values(), "没有这种vector方式" 53 | if isinstance(mode,str): 54 | assert mode in VECTOR_MODE.keys(), "没有这种vector方式" 55 | mode = VECTOR_MODE[mode] 56 | self.mode = mode 57 | 58 | def set_news(self,news): 59 | if not len(news): 60 | print("请输入有效的新闻文本,谢谢") 61 | return 62 | self.news = news 63 | 64 | def trans_vec(self): 65 | vec_list = od.words2Vec(self.news,od.emotionList,od.stopList,od.posList,od.negList,mode=self.mode) 66 | self._vec = np.array(vec_list).reshape(1,-1) 67 | 68 | # 调用的时候计算函数 69 | def __call__(self, *args, **kwargs): 70 | self.__tag = self._model.predict(self._vec) 71 | return self.__tag 72 | 73 | def get_tag(self): 74 | return self.__tag 75 | 76 | 77 | def test(reload=False): 78 | if reload: 79 | best_vector = "wordfreq" 80 | best_model = 1 # linearLogistic 81 | save_model(best_vector, best_model) 82 | else: 83 | od.loadStopwords() 84 | od.loadEmotionwords() 85 | od.loadWords(od.stopList) 86 | od.loadDocument(od.stopList) 87 | 88 | predictor = Predictor() 89 | predictor.load_model() 90 | predictor.set_mode(mode="wordfreq") 91 | 92 | news = " 《经济通通讯社13日专讯》日股早市偏软,日经225指数报18312跌239点。 美元兑日圆疲软,新报108﹒78╱80。(tt) " 93 | news = " 周二,恒生指数收报20356.24点,跌236.76点,跌幅1.15%;国企指数收报10596.91点,跌148点,跌幅1.38%;大市成交492.76亿港元。美国3月非农就业数据表现疲弱,拖累隔夜欧美股市全线受压。中国3月份CPI同比增长3.6%,令货币政策在短期内放宽预期降低。港股早盘随外围低开两百多点,但是A股在汇金增持内银股刺激下探底回升,对港股起到支持,之后恒指于低位维持窄幅震荡整理,最终跌逾1%。银行股全线走软。四大内银股方面,工商银行跌0.4%,中国银行跌0.64%,建设银行跌0.67%,农业银行跌1.2%;国际金融股方面,汇丰控股跌1.75%,渣打集团跌1.89%。美国就业市场增长放缓及内地通胀反弹,投资者对经济信心下降。中国央行短期内下调存准机会大减,从而利淡大市气氛。预计港股本周将继续在20200至20700点之间震荡。 " # 待转化的文本 94 | 95 | predictor.set_news(news=news) 96 | predictor.trans_vec() 97 | 98 | tag = predictor() 99 | print("算出来的和是",sum(predictor._vec[0])) 100 | print("打标的结果是:",tag) 101 | 102 | if __name__=='__main__': 103 | pass 104 | 105 | 106 | -------------------------------------------------------------------------------- /data/emdict/collect_dict.py: -------------------------------------------------------------------------------- 1 | """ 2 | 收集、生成、存储金融词典 3 | """ 4 | #encoding:utf-8 5 | import os 6 | import pickle 7 | # em是知网的情感词和程度词 8 | try: 9 | from material import emotion_word as em 10 | except Exception as error: 11 | from .material import emotion_word as em 12 | 13 | __posdict_path = os.path.join('material','NTUSD_simplified','pos.txt') # 积极情感词路径 14 | __negdict_path = os.path.join('material','NTUSD_simplified','neg.txt') # 消极情感词路径 15 | __stopdict_path = os.path.join('material','stopword.txt') # 停用词(垃圾词)路径 16 | __jieba_weight = 1000000 # 添加的新词的权重 17 | 18 | def collectEmotionWord(posdict_path,negdict_path): 19 | """ 20 | 针对情感词 21 | :param posdict_path: 积极情感词路径 22 | :param negdict_path: 消极情感词路径 23 | :return: 积极词列表和消极词列表 24 | """ 25 | posSet = set() 26 | negSet = set() 27 | ########## 收集台湾大学NTUSD和知网的积极情感词 ########## 28 | with open(posdict_path, 'r', encoding='utf-8')as f: 29 | for line in f.readlines(): 30 | word = line.strip('\n').strip() 31 | if word: 32 | posSet.add(line.strip('\n').strip()) 33 | for word in em.pos_emotion: 34 | posSet.add(word) 35 | for word in em.pos_envalute: 36 | posSet.add(word) 37 | 38 | ########## 收集台湾大学NTUSD和知网的消极情感词 ########## 39 | with open(negdict_path, 'r', encoding='utf-8')as f: 40 | for line in f.readlines(): 41 | word = line.strip('\n').strip() 42 | if word: 43 | negSet.add(line.strip('\n').strip()) 44 | for word in em.neg_emotion: 45 | negSet.add(word) 46 | for word in em.neg_envalute: 47 | negSet.add(word) 48 | 49 | return list(posSet),list(negSet) 50 | 51 | 52 | def collectStopWord(stopdict_path,*emotion): 53 | """ 54 | 针对停用词 55 | :param stopdict_path: 停用词路径 56 | :param emotion: 情感词集合 57 | :return: 停用词列表 58 | """ 59 | em_dict = set() # 收集情感词 60 | for em in emotion: 61 | for word in em: 62 | em_dict.add(word) 63 | 64 | stopSet = set() 65 | ########## 收集N-gram和停用词典的垃圾词 ########## 66 | with open(stopdict_path, 'r', encoding='utf-8') as f: 67 | for line in f.readlines(): 68 | word = line.strip('\n').strip() 69 | if word and (word not in em_dict): # 过滤情感词 70 | stopSet.add(line.strip('\n').strip()) 71 | return list(stopSet) 72 | 73 | 74 | def saveDict(**args): 75 | """ 76 | 存储训练好的词典 77 | :param args: 键值对,形式:key(文件名)-value(存储内容) 78 | :return: None 79 | """ 80 | for (name,mdict) in args.items(): 81 | try: 82 | if not isinstance(mdict,list): 83 | raise TypeError("目前仅支持list类型") 84 | except Exception as error: 85 | pass 86 | else: 87 | with open(name,'w',encoding='utf-8') as f: 88 | f.write('\n'.join(mdict)) 89 | 90 | # 作用同:saveDict(**args) 91 | def savePickle(**args): 92 | for (name,mdict) in args.items(): 93 | try: 94 | if not isinstance(mdict,list): 95 | raise TypeError("目前仅支持list类型") 96 | except Exception as error: 97 | pass 98 | else: 99 | with open(name+'.plk','wb') as f: 100 | pickle.dump(mdict,f) 101 | 102 | def addWeight(emdict): 103 | """ 104 | 为生成的用户词典增加权重(jieba词库分词需要) 105 | :param emdict: 不带权重的词列表 106 | :return: 带有权重的词列表 107 | """ 108 | global __jieba_weight 109 | return list(map(lambda word:str(word)+" "+str(__jieba_weight),emdict)) 110 | 111 | # 主函数 112 | def main(): 113 | pos_dict, neg_dict = collectEmotionWord(posdict_path=__posdict_path, negdict_path=__negdict_path) # 积极和消极词典 114 | pos_w_dict, neg_w_dict = addWeight(pos_dict), addWeight(neg_dict) # 带有权重的积极和消极词典 115 | stop_dict = collectStopWord(__stopdict_path, pos_dict, neg_dict) # 停用词典 116 | savePickle(stopword = stop_dict,negword = neg_dict,posword = pos_dict) 117 | saveDict(userdict=pos_w_dict + neg_w_dict, stopword=stop_dict) 118 | 119 | if __name__=='__main__': 120 | main() -------------------------------------------------------------------------------- /data/trainset/neu_591936.txt: -------------------------------------------------------------------------------- 1 | “我很感谢母亲的安排,这一段基层经历对我来说十分宝贵,尤其是对我后来从事公司的管理和战略布局奠定了基础,积累了经验。”褚浚表示,除了要传承煌上煌艰苦创业的精神,更重要的是要以科学发展的理念与时俱进,推动企业在管理观念上创新、在科技含量上提升、加快产品的改进和出新等,而这恰好是他的专业,是他擅长的领域今年6月27日的江西省工商联(总商会)第十一次代表大会上,江西煌上煌集团食品股份有限公司(以下简称“煌上煌”)副董事长、总经理褚浚当选为江西省总商会副会长。顶着“创二代”的光环,往往让人忘记褚浚真正成功的因素在于他自身。其实,其母亲徐桂芬、父亲褚建庚的成就和名气,则是托举他人生成功的第一步……16年事业航线接触过褚浚的食品行业人士评价说,褚浚为人处事沉稳、踏实、机敏,有大局观念,他正带领着煌上煌集团逐步从家族企业向现代企业转变。1996年3月,褚浚的母亲徐桂芬创立了江西煌上煌实业有限公司。同年,褚浚的父亲褚建庚加入公司。这一年被看作是煌上煌集团发展的关键一年。这一年,褚浚从中国科技大学外贸管理系毕业。彼时的他,还是一个刚刚20岁的小伙子,但是面临着出国继续深造或者是回到煌上煌来管理家族企业的选择时,他毅然决然地选择了后者。熟悉煌上煌的人都知道,1993年以前,煌上煌不过是南昌市绳金塔一家前店后坊的熟食小店。经过几年发展,逐渐完成原始积累的煌上煌集团,由家庭小作坊发展为家族式公司时,家人、亲属、好友纷纷加入。大家按辈份排位,各管一摊,规章是口头约定,管理靠的是亲情和血缘关系的约束。面对现状,褚浚认为集团迫切需要注入现代经营管理的新鲜血液。“大学毕业就进了公司,跟着前辈们一起开拓创业。”回想进入公司的情景,褚浚颇感慨地说,“尽管进入公司前对卤制品不算了解,但是经过平时与公司前辈以及老百姓的接触后,我逐渐感觉到了卤制品市场的未来前景广阔,慢慢地也对这个行业产生了浓厚的兴趣。自此,我就决定要把它当作我一生的事业来做。”不同于其他的“创二代”,褚浚是从煌上煌集团的基层一步一步做起的。刚进入集团时,褚浚先后在清洗车间、烤卤车间、凉拌车间、包装车间等做过,随后又到煌上煌专卖店当过营业员,采购、生产、财务等部门,褚浚也去工作过。“可以这么说,基本上能做的岗位我都做过。”褚浚坦言,这一切多得益于既是集团创始人、董事长,也是母亲的徐桂芬的决定。徐桂芬认为将儿子放到一线基层去锻炼,一方面有利于他更全面地了解卤制品加工工艺流程、终端销售和市场营销的全过程,另一方面也可以锻炼他吃苦耐劳的能力和坚持不懈的毅力,更为重要的是,为日后褚浚将煌上煌集团从“家庭式作坊”打造成“现代企业”提供了实践的基础。“我很感谢母亲的安排,这一段经历对我来说十分宝贵,尤其是对我后来从事公司的管理和战略布局奠定了基础,积累了经验。”褚浚表示,除了要传承煌上煌艰苦创业的精神,更重要的是要以科学发展的理念与时俱进,推动企业在管理观念上创新、在科技含量上提升、加快产品的改进和出新等。而这恰好是他的专业,是他擅长的领域。很快,他就被委任为煌上煌实业有限公司经理,负责公司的现代化改造。褚浚低调,以至于他在一线工作了很长一段时间,也没有人知道他就是董事长的儿子,“褚总很谦逊,完全没有架子,平时都和我们打成一片。”煌上煌集团众多员工透露。而至今,我们也鲜少见到褚浚接受媒体的采访。公开数据显示,煌上煌集团于2009年--2011年间,通过连锁加盟店的模式,在全国的门店数从1015家增长到1798家,门店数增长了77.1%。与此同时,销售额也从4.078亿元增长到6.998亿元,剧增71.6%。“公司根据发展步伐,此前几年就制定并开始实施上市战略。”公司的快速发展,使得作为煌上煌领导者之一的褚浚有了更长远的打算。上市,成为了褚浚深思熟虑后的决策。“为了公司上市,我们做了很多准备,付出了很多。这次企业上市前前后后所经历的事情,恐怕我这辈子都忘不了。上市是对企业现代管理的一个考验,同时也是对企业决策者素质的一个考验。”2012年9月5日,褚浚带领集团完成了在深交所的正式挂牌上市。自此,煌上煌集团成为酱卤行业第一股,也开启了褚浚事业航线的辉煌篇章。集团上市成功后,褚浚担任总经理一职,而这距离他第一天进入煌上煌工作,正好16年。褚浚曾说,上市只是第一步,带领煌上煌以建设创新型企业为主线,以提高核心竞争力为目标,团结拼搏,务实创新,再续辉煌,致力于打造中国百姓放心厨房,不断推动产业升级和跨越式发展,做强做大江西食品工业,努力把煌上煌打造成为中式酱卤肉制品第一品牌,才是他的目标。坚持做食品“百年老店,酱卤世家”是煌上煌人始终坚持的优良传统和作风,而真正实现这一目标需要不断地创新发展。煌上煌集团人和褚浚都肩负重任。特别是进入新世纪后,面对武汉“周黑鸭”、长沙“绝味鸭脖”等卤制品强势品牌布局江西,以及分布于街头巷尾的众多本土家庭作坊式卤制品门店的竞争,如何突出重围成为了褚浚亟待解决的难题。“初生牛犊不怕虎”,年轻的褚浚在担任煌上煌实业有限公司经理期间,加大了对传统烤卤工艺的革新力度,不断引进、开发并应用先进的加工设备和技术,包括采用连续式油水分离油炸设备、连续式卤煮机等,并在江西烤卤行业中首家实现蒸汽加工卤制品,实现了从传统手工工艺向现代化生产的转变。此外,他还推广应用中式菜肴微波保鲜技术,从技术上确保产品的品质。“2006年,我通过技术嫁接方式,加大了对酱卤肉制品抗氧化护色的技术攻关的力度,解决了酱卤肉食品氧化发黑的难题。”褚浚说,也正是这项技术的突破和应用,使得煌上煌走在了国内同行的前列。此外,褚浚还建立了一支技术团队,聘请江西省农科院、南昌大学等科研机构及其他食品行业专家作为技术顾问。他还组建了肉禽食品研究所和新产品研发中心,为新产品的研发提供技术后盾。记者了解到,在软硬件实力协同发展后,煌上煌集团每年都要开发出10-20个具有江西地方特色的烤卤新产品,如樟茶型鹅、鄱湖香辣鸭等。在此基础上,煌上煌逐步形成了5大系列(烧烤、卤制、凉拌、清蒸、炒炸)200多个品种。“做食品、做好食品是我对自己的要求,也是我一直奋斗的目标。”褚浚很清楚煌上煌集团的定位,20多年来他一直朝着将煌上煌打造为赣产特色肉类食品品牌的目标不断努力。在他的策划和带领下,煌上煌集团每年以30%的速度迅猛发展。尤其是自2002年开始,煌上煌连续实现了三个“工业增加值、销售、利税”三年翻一番的目标。目前,企业旗下有16家分公司,员工3000馀人,先后在广东、福建、辽宁、河南等地建立了现代化的大型生产加工基地,超过3000家连锁专卖店分布在全国各地。此外,该公司在江西共拥有占地近600亩的中式烤卤食品工业园和大型家禽屠宰、深加工厂区,屠宰能力达年产量3万吨,加工能力年产量3.4万吨。“‘煌上煌’与鸭子不能分割”,徐桂芬知道,褚浚也清楚地明白。为此,褚浚带领集团探索了一条农产品深加工的产业链之路,建立了“公司+合作社+农户”“公司+养殖小区+农户”等多种利益连接机制。“这样做既能保证企业原料供应的量和品质,也能带动养鸭农民致富。”褚浚说。经过多年用心经营,煌上煌集团斩获了“中国肉类食品行业50强”“中国民营企业500强”“农业产业化国家重点龙头企业”“国家农业产业化开发项目示范企业”和“江西省高新技术企业”等多项荣誉。在褚浚的直接带领下,2015年煌上煌集团搬迁到新加工园,投入巨资建设了标准化的厂房车间,在酱卤行业率先建立了十万级洁净车间。同年,在褚浚的主导下,煌上煌集团成功控股并购了全国第二大粽子品牌——嘉兴真真老老食品有限公司,丰富了产品品类。“公司一直有在食品行业进行并购的计划。”褚浚曾在投资者互动平台上表示。而这一年,在褚浚的带领下,煌上煌集团开始大力发展电商,打造互联网线上全网销售模式,取得了突破进展。仅过了一年,褚浚又作出了一个重大决策:投资近2000万元从德国进口6条预包装生产线,实现技术转型升级,确保从生产源头上控制产品质量安全。为响应江西省委省政府“精准扶贫”的号召,践行企业的社会责任,今年初,在褚浚的指导下,煌上煌农业产业化扶贫示范工程——江西丰城“皇禽”肉鸭孵化基地已正式在丰城挂牌成立。积极“走出去”随着年龄的增长、经历的丰富,褚浚思考企业经营管理的角度更为全面和深入,这也促使他越来越想在以前的基础上更有所突破。突破,这件事,在他看来迫在眉睫,必须全力以赴!“目前,公司虽然作为江西省卤制品加工行业先驱,深耕行业达21年之久。但是面对快速发展的中国食品行业,我不敢懈怠。”褚浚坦言,自己一直保持着一颗“忘记过去成绩的超越之心”,不断吸收优秀品牌的经验和知识并运用到自身,努力做好量的积累,在机遇降临之时,能够准确把握迎接挑战。“他不拘泥于现有的制度,大胆调整营销策略,开拓省内外市场。”这是一位与褚浚共事多年的煌上煌集团人对他的评价。正是在褚浚的迅速出牌、布局市场的策略下,煌上煌集团很快就在江西省立足,向全国扩展。“在强化营销手段、掌握南昌市场主动权的同时,也要抓住机遇,发挥品牌优势,做好省外市场。”不仅如此,近年来,褚浚还积极响应国家“一带一路”倡议,主导煌上煌集团积极“走出去”参与国际合作。2016年12月,集团进军麦卢卡蜂蜜项目,成功与新西兰新溪岛蜂蜜公司签订合作项目协议,正式完成对新溪岛蜂蜜公司的股权收购。同时,集团谋求全球发展战略,先后前往新西兰、澳大利亚、马来西亚、巴基斯坦、黎巴嫩、巴西等国进行项目考察,启动了酒店发展、葡萄酒生产加工、牛羊肉进口等项目,开启了煌上煌集团布局海外业务战略。今年6月19日,江西省开放型经济发展大会在南昌举行,江西省委书记鹿心社、省长刘奇等出席会议。大会表彰了2016年度全省开放型经济先进单位,煌上煌集团凭借近年来“走出去”发展的新实践、新成就、新风貌,荣获2016年度全省“走出去”先进企业荣誉称号。记者今年的江西省工商联(总商会)第十一次代表大会上再见到褚浚,看到他比过去更自信更稳重。虽然对于未来的计划,褚浚并没有提及太多。但是谈吐中,似多了一份指挥若定和运筹帷幄。人常说“四十不惑”,而在他身上却看不到困惑何在。他已深谙做一个“创二代”不仅需要坚守上一辈的勤劳和智慧,更要不断地融合与创新。 -------------------------------------------------------------------------------- /clean_data/clean_html.py: -------------------------------------------------------------------------------- 1 | """ 2 | 清洗网页标签 3 | 全角和半角的转换 4 | """ 5 | 6 | #encoding:utf-8 7 | import re 8 | 9 | # 网页中的字符实体 10 | # 需要更多的补充 11 | html_char = {} 12 | html_char['"'] = html_char['"']='"' 13 | html_char['''] = html_char['''] = "'" 14 | html_char['&'] = html_char['&'] = '&' 15 | html_char['<'] = html_char['<'] = '<' 16 | html_char['>'] = html_char['>'] = '>' 17 | html_char[' '] = html_char[' ']= ' ' 18 | 19 | def Q2B(_char): 20 | """ 21 | 全角字符转半角字符 22 | :param _char: 待转换字符 23 | :return: 转化后的字符 24 | """ 25 | if 65281<=ord(_char)<=65374: 26 | _char = chr(ord(_char)-65248) 27 | elif ord(_char)==12288: 28 | _char = chr(32) 29 | return _char 30 | 31 | def isQ(Char): 32 | """ 33 | 判断是否是全角字符 34 | :param Char: 待判断字符 35 | :return: bool值 36 | """ 37 | return True if (65281<=ord(Char)<=65374 or ord(Char)==12288) else False 38 | 39 | def B2Q(_char): 40 | """ 41 | 半角字符转全角字符 42 | :param _char: 待转换字符 43 | :return: 转化后的字符 44 | """ 45 | if 33<=ord(_char)<=126: 46 | _char = chr(ord(_char)+65248) 47 | elif ord(_char)==32: 48 | _char = chr(12288) 49 | return _char 50 | 51 | # 类似 isQ(Char) 52 | def isB(Char): 53 | return True if (33<=ord(Char)<=126 or ord(Char)==32) else False 54 | 55 | 56 | def cleanHtml(html_str,special_char=None,to_char=None): 57 | """ 58 | 清洗html标签 59 | :param html_str: html文本 60 | :param special_char: 自定义的需要处理的特殊字符列表(迭代器类型) 61 | :param to_char: special_char的转化目标 62 | :return: html中的正文部分 63 | """ 64 | 65 | # 如果有需要处理的额外字符 66 | if special_char: 67 | special_rule = re.compile('|'.join(set(special_char))) # '|'在正则表达式中代表'或'。所有的特殊字符都要替换 68 | if not to_char: 69 | to_char = '' 70 | 71 | #CDATA 部分由 "" 结束: 72 | cdata_rule = re.compile(r'',re.I | re.S) 73 | 74 | #去除脚本(随时会出现) 75 | script_rule = re.compile(r'',re.I | re.S) 76 | 77 | #取出..和中间的内容,style也在里面,不需要再写了 78 | head_rule = re.compile(r'',re.I | re.S) 79 | 80 | #为了以防一些文本不是全部截取html代码,还是写一下以防万一 81 | style_rule = re.compile(r'',re.I | re.S) 82 | 83 | #处理注释 84 | comment_rule = re.compile(r'',re.I | re.S) 85 | 86 | #处理换行 87 | br_rule = re.compile(r'',re.I) 88 | 89 | #html标签 90 | html_rule = re.compile(r'<.*?/{0,1}>',re.I) 91 | 92 | if special_char: 93 | raw = special_rule.sub(to_char,html_str) 94 | else: 95 | raw = html_str 96 | 97 | raw = cdata_rule.sub('',raw) 98 | raw = script_rule.sub('',raw) 99 | raw = head_rule.sub('',raw) 100 | raw = style_rule.sub('',raw) 101 | raw = comment_rule.sub('',raw) 102 | raw = br_rule.sub('\n',raw) 103 | raw = html_rule.sub('',raw) 104 | 105 | global html_char 106 | letter_char = re.compile(r'(&[a-z]+;)|(&#\d+;)',re.I) 107 | for _,__ in letter_char.findall(raw): # _,__分别对应两种形式的字符实体 108 | if _ not in html_char.keys() and __ not in html_char.keys(): # 针对字符实体不在html_char的情况 109 | continue 110 | if _ in html_char.keys(): 111 | raw = re.sub(_,html_char[_],raw) 112 | else: 113 | raw = re.sub(__, html_char[__], raw) 114 | 115 | raw_list = list(raw) 116 | for i in range(len(raw_list)): 117 | if isQ(raw_list[i]): 118 | raw_list[i] = Q2B(raw_list[i]) 119 | raw = ''.join(raw_list) 120 | 121 | return raw 122 | 123 | # 测试函数 124 | def test(): 125 | # 下面是一段html的测试代码 126 | test_html = """ 127 | 128 | 151 | """ 152 | 153 | print(cleanHtml(test_html,'】15')) 154 | 155 | if __name__=='__main__': 156 | test() -------------------------------------------------------------------------------- /run_best.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import json 3 | import os 4 | from collections import OrderedDict # 有序词典 5 | import numpy as np 6 | import ml_model as ml 7 | import operate_data as od 8 | 9 | def runBest(vector='wordfreq',m_model = ml.naiveBayes): 10 | ##### 开启记录模式的代码(只记录留一验证后准确率最高的模型) ##### 11 | xpath = os.path.join('result', 'vector', 'resultX.npz') 12 | ypath = os.path.join('result', 'vector', 'resultY.npz') 13 | resultX = np.load(xpath) 14 | resultY = np.load(ypath) 15 | logpath = os.path.join('result','log','logfile.plk') 16 | logfile = None 17 | with open(logpath,'rb') as f: 18 | logfile = pickle.load(f) 19 | 20 | trainX,trainY,testX,testY,logTrain,logTest = od.randomData(resultX[vector],resultY[vector],0.1,logfile) # 选取最好的vector方法 21 | model = m_model(trainX,trainY) # 选取最好的机器训练模型 22 | predictY = [model.predict(x.reshape(1,-1))[0] for x in testX] 23 | logDict = OrderedDict() 24 | logDict['+2+'] = [];logDict['+2.'] = [];logDict['+2-'] = [] 25 | logDict['-2+'] = [];logDict['-2.'] = [];logDict['-2-'] = [] 26 | logDict['.2+'] = [];logDict['.2.'] = [];logDict['.2-'] = [] 27 | for i in range(len(predictY)): 28 | if predictY[i] == testY[i]: 29 | if predictY[i]>0: 30 | logDict['+2+'].append(logTest[i]) 31 | elif predictY[i]==0: 32 | logDict['.2.'].append(logTest[i]) 33 | else: 34 | logDict['-2-'].append(logTest[i]) 35 | elif predictY[i]>0 and testY[i]==0: 36 | logDict['.2+'].append(logTest[i]) 37 | elif predictY[i]>0 and testY[i]<0: 38 | logDict['-2+'].append(logTest[i]) 39 | 40 | elif predictY[i]<0 and testY[i]==0: 41 | logDict['.2-'].append(logTest[i]) 42 | elif predictY[i]<0 and testY[i]>0: 43 | logDict['+2-'].append(logTest[i]) 44 | 45 | elif predictY[i]==0 and testY[i]>0: 46 | logDict['+2.'].append(logTest[i]) 47 | elif predictY[i]==0 and testY[i]<0: 48 | logDict['-2.'].append(logTest[i]) 49 | 50 | with open(os.path.join('result','log','3plus3arr.plk'),'wb') as f: 51 | pickle.dump(logDict,f) 52 | print('Over') 53 | 54 | def logBest(): 55 | arr = None # 存放3*3的矩阵(实际是数组) 56 | with open(os.path.join('result','log','3plus3arr.plk'),'rb') as f: 57 | arr = pickle.load(f) 58 | 59 | ErrorTag = {} 60 | key_arr = [] # 含有错误标签的键组成的数组 61 | 62 | for key in arr.keys(): 63 | if key not in ('+2+','-2-','.2.') and len(arr[key]): 64 | key_arr.append(key) 65 | message = 'At: '+key+'; Total '+str(len(arr[key]))+"; \n "+",".join(arr[key]) 66 | print(message) 67 | ErrorTag[key] = message 68 | with open(os.path.join('result','log','best_model','error_tag.json'),'w',encoding="utf-8") as f: 69 | json.dump(ErrorTag,f) 70 | 71 | print("="*30) 72 | 73 | for key in arr.keys(): 74 | if key not in key_arr: 75 | print('At: ' + key + '; Total ' + str(len(arr[key])) + "; \n " + ",".join(arr[key])) 76 | 77 | ##### 计算PR并且写入文件 ##### 78 | pr = {} #p:精确率 r:召回率 79 | if (len(arr['+2+'])+len(arr['-2+'])+len(arr['.2+'])) and (len(arr['+2+'])+len(arr['+2-'])+len(arr['+2.'])): 80 | pr['+'] = {\ 81 | 'p':len(arr['+2+'])/(len(arr['+2+'])+len(arr['-2+'])+len(arr['.2+'])),\ 82 | 'r':len(arr['+2+'])/(len(arr['+2+'])+len(arr['+2-'])+len(arr['+2.'])) \ 83 | } 84 | else : 85 | pr['+'] = {'p' : None,'r' :None} 86 | 87 | if (len(arr['-2-'])+len(arr['+2-'])+len(arr['.2-'])) and (len(arr['-2-'])+len(arr['-2+'])+len(arr['-2.'])): 88 | pr['-'] = {\ 89 | 'p':len(arr['-2-'])/(len(arr['-2-'])+len(arr['+2-'])+len(arr['.2-'])),\ 90 | 'r':len(arr['-2-'])/(len(arr['-2-'])+len(arr['-2+'])+len(arr['-2.'])) \ 91 | } 92 | else : 93 | pr['-'] = {'p':None,'r':None} 94 | 95 | if (len(arr['.2.'])+len(arr['+2.'])+len(arr['-2.'])) and (len(arr['.2.'])+len(arr['.2+'])+len(arr['.2-'])): 96 | pr['.'] = {\ 97 | 'p':len(arr['.2.'])/(len(arr['.2.'])+len(arr['+2.'])+len(arr['-2.'])),\ 98 | 'r':len(arr['.2.'])/(len(arr['.2.'])+len(arr['.2+'])+len(arr['.2-'])) \ 99 | } 100 | else : 101 | pr['.'] = {'p':None,'r':None} 102 | with open(os.path.join('result','log','best_model','PR.json'),'w',encoding="utf-8") as f: 103 | json.dump(pr,f) 104 | 105 | if __name__=='__main__': 106 | best_vec = 'wordfreq' 107 | best_model = ml.naiveBayes 108 | runBest(vector = best_vec,m_model= best_model) 109 | logBest() 110 | -------------------------------------------------------------------------------- /clean_data/langconv.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | from copy import deepcopy 5 | import re 6 | 7 | try: 8 | import psyco 9 | psyco.full() 10 | except: 11 | pass 12 | 13 | try: 14 | from zh_wiki import zh2Hant, zh2Hans 15 | except ImportError: 16 | from .zh_wiki import zh2Hant, zh2Hans 17 | 18 | import sys 19 | py3k = sys.version_info >= (3, 0, 0) 20 | 21 | if py3k: 22 | UEMPTY = '' 23 | else: 24 | _zh2Hant, _zh2Hans = {}, {} 25 | for old, new in ((zh2Hant, _zh2Hant), (zh2Hans, _zh2Hans)): 26 | for k, v in old.items(): 27 | new[k.decode('utf8')] = v.decode('utf8') 28 | zh2Hant = _zh2Hant 29 | zh2Hans = _zh2Hans 30 | UEMPTY = ''.decode('utf8') 31 | 32 | # states 33 | (START, END, FAIL, WAIT_TAIL) = list(range(4)) 34 | # conditions 35 | (TAIL, ERROR, MATCHED_SWITCH, UNMATCHED_SWITCH, CONNECTOR) = list(range(5)) 36 | 37 | MAPS = {} 38 | 39 | class Node(object): 40 | def __init__(self, from_word, to_word=None, is_tail=True, 41 | have_child=False): 42 | self.from_word = from_word 43 | if to_word is None: 44 | self.to_word = from_word 45 | self.data = (is_tail, have_child, from_word) 46 | self.is_original = True 47 | else: 48 | self.to_word = to_word or from_word 49 | self.data = (is_tail, have_child, to_word) 50 | self.is_original = False 51 | self.is_tail = is_tail 52 | self.have_child = have_child 53 | 54 | def is_original_long_word(self): 55 | return self.is_original and len(self.from_word)>1 56 | 57 | def is_follow(self, chars): 58 | return chars != self.from_word[:-1] 59 | 60 | def __str__(self): 61 | return '' % (repr(self.from_word), 62 | repr(self.to_word), self.is_tail, self.have_child) 63 | 64 | __repr__ = __str__ 65 | 66 | class ConvertMap(object): 67 | def __init__(self, name, mapping=None): 68 | self.name = name 69 | self._map = {} 70 | if mapping: 71 | self.set_convert_map(mapping) 72 | 73 | def set_convert_map(self, mapping): 74 | convert_map = {} 75 | have_child = {} 76 | max_key_length = 0 77 | for key in sorted(mapping.keys()): 78 | if len(key)>1: 79 | for i in range(1, len(key)): 80 | parent_key = key[:i] 81 | have_child[parent_key] = True 82 | have_child[key] = False 83 | max_key_length = max(max_key_length, len(key)) 84 | for key in sorted(have_child.keys()): 85 | convert_map[key] = (key in mapping, have_child[key], 86 | mapping.get(key, UEMPTY)) 87 | self._map = convert_map 88 | self.max_key_length = max_key_length 89 | 90 | def __getitem__(self, k): 91 | try: 92 | is_tail, have_child, to_word = self._map[k] 93 | return Node(k, to_word, is_tail, have_child) 94 | except: 95 | return Node(k) 96 | 97 | def __contains__(self, k): 98 | return k in self._map 99 | 100 | def __len__(self): 101 | return len(self._map) 102 | 103 | class StatesMachineException(Exception): pass 104 | 105 | class StatesMachine(object): 106 | def __init__(self): 107 | self.state = START 108 | self.final = UEMPTY 109 | self.len = 0 110 | self.pool = UEMPTY 111 | 112 | def clone(self, pool): 113 | new = deepcopy(self) 114 | new.state = WAIT_TAIL 115 | new.pool = pool 116 | return new 117 | 118 | def feed(self, char, map): 119 | node = map[self.pool+char] 120 | 121 | if node.have_child: 122 | if node.is_tail: 123 | if node.is_original: 124 | cond = UNMATCHED_SWITCH 125 | else: 126 | cond = MATCHED_SWITCH 127 | else: 128 | cond = CONNECTOR 129 | else: 130 | if node.is_tail: 131 | cond = TAIL 132 | else: 133 | cond = ERROR 134 | 135 | new = None 136 | if cond == ERROR: 137 | self.state = FAIL 138 | elif cond == TAIL: 139 | if self.state == WAIT_TAIL and node.is_original_long_word(): 140 | self.state = FAIL 141 | else: 142 | self.final += node.to_word 143 | self.len += 1 144 | self.pool = UEMPTY 145 | self.state = END 146 | elif self.state == START or self.state == WAIT_TAIL: 147 | if cond == MATCHED_SWITCH: 148 | new = self.clone(node.from_word) 149 | self.final += node.to_word 150 | self.len += 1 151 | self.state = END 152 | self.pool = UEMPTY 153 | elif cond == UNMATCHED_SWITCH or cond == CONNECTOR: 154 | if self.state == START: 155 | new = self.clone(node.from_word) 156 | self.final += node.to_word 157 | self.len += 1 158 | self.state = END 159 | else: 160 | if node.is_follow(self.pool): 161 | self.state = FAIL 162 | else: 163 | self.pool = node.from_word 164 | elif self.state == END: 165 | # END is a new START 166 | self.state = START 167 | new = self.feed(char, map) 168 | elif self.state == FAIL: 169 | raise StatesMachineException('Translate States Machine ' 170 | 'have error with input data %s' % node) 171 | return new 172 | 173 | def __len__(self): 174 | return self.len + 1 175 | 176 | def __str__(self): 177 | return '' % ( 178 | id(self), self.pool, self.state, self.final) 179 | __repr__ = __str__ 180 | 181 | class Converter(object): 182 | def __init__(self, to_encoding): 183 | self.to_encoding = to_encoding 184 | self.map = MAPS[to_encoding] 185 | self.start() 186 | 187 | def feed(self, char): 188 | branches = [] 189 | for fsm in self.machines: 190 | new = fsm.feed(char, self.map) 191 | if new: 192 | branches.append(new) 193 | if branches: 194 | self.machines.extend(branches) 195 | self.machines = [fsm for fsm in self.machines if fsm.state != FAIL] 196 | all_ok = True 197 | for fsm in self.machines: 198 | if fsm.state != END: 199 | all_ok = False 200 | if all_ok: 201 | self._clean() 202 | return self.get_result() 203 | 204 | def _clean(self): 205 | if len(self.machines): 206 | self.machines.sort(key=lambda x: len(x)) 207 | # self.machines.sort(cmp=lambda x,y: cmp(len(x), len(y))) 208 | self.final += self.machines[0].final 209 | self.machines = [StatesMachine()] 210 | 211 | def start(self): 212 | self.machines = [StatesMachine()] 213 | self.final = UEMPTY 214 | 215 | def end(self): 216 | self.machines = [fsm for fsm in self.machines 217 | if fsm.state == FAIL or fsm.state == END] 218 | self._clean() 219 | 220 | def convert(self, string): 221 | self.start() 222 | for char in string: 223 | self.feed(char) 224 | self.end() 225 | return self.get_result() 226 | 227 | def get_result(self): 228 | return self.final 229 | 230 | 231 | def registery(name, mapping): 232 | global MAPS 233 | MAPS[name] = ConvertMap(name, mapping) 234 | 235 | registery('zh-hant', zh2Hant) 236 | registery('zh-hans', zh2Hans) 237 | del zh2Hant, zh2Hans 238 | 239 | 240 | def run(): 241 | import sys 242 | from optparse import OptionParser 243 | parser = OptionParser() 244 | parser.add_option('-e', type='string', dest='encoding', 245 | help='encoding') 246 | parser.add_option('-f', type='string', dest='file_in', 247 | help='input file (- for stdin)') 248 | parser.add_option('-t', type='string', dest='file_out', 249 | help='output file') 250 | (options, args) = parser.parse_args() 251 | if not options.encoding: 252 | parser.error('encoding must be set') 253 | if options.file_in: 254 | if options.file_in == '-': 255 | file_in = sys.stdin 256 | else: 257 | file_in = open(options.file_in) 258 | else: 259 | file_in = sys.stdin 260 | if options.file_out: 261 | if options.file_out == '-': 262 | file_out = sys.stdout 263 | else: 264 | file_out = open(options.file_out, 'wb') 265 | else: 266 | file_out = sys.stdout 267 | 268 | c = Converter(options.encoding) 269 | for line in file_in: 270 | # print >> file_out, c.convert(line.rstrip('\n').decode( 271 | file_out.write(c.convert(line.rstrip('\n').decode( 272 | 'utf8')).encode('utf8')) 273 | 274 | 275 | if __name__ == '__main__': 276 | run() 277 | 278 | -------------------------------------------------------------------------------- /operate_data.py: -------------------------------------------------------------------------------- 1 | """ 2 | 集合了清洗数据的函数,例如:简体繁体转化、文本向量化等 3 | """ 4 | #encoding:utf-8 5 | import os 6 | import pickle 7 | import math 8 | import jieba 9 | import jieba.posseg as pseg 10 | import numpy as np 11 | 12 | try: 13 | from .clean_data.clean_html import cleanHtml 14 | except Exception as error: 15 | from clean_data.clean_html import cleanHtml 16 | 17 | try: 18 | from .clean_data.langconv import * 19 | except Exception as error : 20 | from clean_data.langconv import * 21 | 22 | 23 | dictPath = os.path.join('data','emdict','userdict') # 针对linux兼容 24 | jieba.load_userdict(dictPath) # 加载个人词典 25 | stopwordsPath = os.path.join('data','emdict','stopword.plk') # 停用词 26 | negwordsPath = os.path.join('data','emdict','negword.plk') # 消极词 27 | poswordsPath = os.path.join('data','emdict','posword.plk') # 积极词 28 | documentPath = os.path.join('data','trainset') # 训练样本的目录 29 | 30 | stopList = [] 31 | emotionList = [] 32 | posList = [] 33 | negList = [] 34 | wordsList = [] # 基于所有训练样本的词袋(针对 不基于词典 这种文本向量化方法) 35 | docList = [] # 所有文档的词语组成的2维词列表(tf-idf所需要的词列表) 36 | 37 | # 转换繁体到简体 38 | def cht_to_chs(line): 39 | line = Converter('zh-hans').convert(line) 40 | line.encode('utf-8') 41 | return line 42 | 43 | # 转换简体到繁体 44 | def chs_to_cht(line): 45 | line = Converter('zh-hant').convert(line) 46 | line.encode('utf-8') 47 | return line 48 | 49 | 50 | def clearNews(news,mode=False): 51 | ''' 52 | 新闻格式一体化 53 | :param news: 包括繁体,网页格式 54 | :param mode: 默认是繁体->简体 55 | :return: 清洗后的标准格式news 56 | ''' 57 | if not mode: 58 | return cleanHtml(cht_to_chs(news)) 59 | else: 60 | return cleanHtml(chs_to_cht(news)) 61 | 62 | # 加载停用词 63 | def loadStopwords(path = stopwordsPath): 64 | global stopList 65 | with open(stopwordsPath,'rb') as f: 66 | stopList = pickle.load(f) 67 | 68 | # 加载感情词 69 | def loadEmotionwords(*paths): 70 | global posList,emotionList,negList 71 | if not len(paths): 72 | with open(negwordsPath,'rb') as f: 73 | negList = pickle.load(f) 74 | # t.extend(pickle.load(f)) 75 | with open(poswordsPath,'rb') as f: 76 | posList = pickle.load(f) 77 | # t.extend(pickle.load(f)) 78 | emotionList = posList+negList 79 | else: 80 | for path in paths: 81 | with open (path,'rb') as f: 82 | emotionList = pickle.load(f) 83 | 84 | # 针对不基于词典 85 | # 直接调用一次后,然后请调用 全局变量 wordsList 86 | def loadWords(stopList,path=documentPath): 87 | global wordsList 88 | wordsSet = set() 89 | for file in os.listdir(path): 90 | news = None 91 | with open(os.path.join(path,file),'r',encoding='utf-8',errors='ignore') as f: 92 | news = f.read() 93 | noun = [word for word, flag in pseg.lcut(news) if flag.startswith('n')] # 拿到其中的名词列表 94 | news = set(jieba.cut(news)) 95 | news = {word for word in news if (word not in stopList) and (word not in noun)} # 过滤停用词和名词 96 | wordsSet = news | wordsSet # 取集合并集 97 | # 最后要使用list类型,因为要保证结果的有序性 98 | wordsList = list(wordsSet) 99 | return None 100 | 101 | # 针对TF-IDF 102 | # 读取所有数据集的词,是的全局变量变成二维的List 103 | def loadDocument(stopList,path=documentPath): 104 | global docList 105 | docList = [] 106 | for file in os.listdir(path): 107 | news = None 108 | with open(os.path.join(path,file),'r',encoding='utf-8') as f: 109 | news = f.read() 110 | noun = [word for word, flag in pseg.lcut(news) if flag.startswith('n')] 111 | news = list(jieba.cut(news)) 112 | news = [word for word in news if (word not in stopList) and (word not in noun)] # 过滤停用词和名词 113 | docList.append(news) 114 | return None 115 | 116 | 117 | def words2Vec(news,emotionList,stopList,posList,negList,mode=0): 118 | """ 119 | 新闻文本翻译成词向量 120 | :param news: 新闻文本 121 | :param emotionList: 情感词列表 122 | :param stopList: 停用词列表 123 | :param posList: 积极词列表 124 | :param negList: 消极词列表 125 | :param mode: int and [0,5)。对应不同的翻译文本的方法 126 | :return: list类型(方便之后的操作,例如,numpy.array()) 127 | """ 128 | # 参数类型检查 129 | assert isinstance(stopList,list) and isinstance(emotionList,list),"类型不对。Function 'word2vec' at OperateDat.py" 130 | 131 | news = clearNews(news) 132 | noun = [word for word,flag in pseg.lcut(news) if flag.startswith('n')] # 名词列表 133 | 134 | # 过滤停用词和名词 135 | newswords = list(jieba.cut(news)) 136 | newswords = [word for word in newswords if (word not in stopList) and (word not in noun)] 137 | 138 | wordsVec = [] 139 | # one-hot 140 | # time:O(n) 141 | if mode==0: 142 | for word in emotionList: 143 | if word in newswords: wordsVec.append(1) 144 | else: wordsVec.append(0) 145 | # frequency 146 | # time:O(n) 147 | elif mode==1: 148 | for word in emotionList: 149 | wordsVec.append(newswords.count(word)) 150 | # two Vec 151 | # time:O(2*n) 152 | elif mode==2: 153 | negTimes = 0;posTimes = 0 154 | for word in posList: 155 | posTimes+=(newswords.count(word)) 156 | for word in negList: 157 | negTimes+=(newswords.count(word)) 158 | wordsVec.append(posTimes);wordsVec.append(negTimes) 159 | # tf-idf 160 | # time:O(2*n*n) 161 | elif mode==3: 162 | global docList # 引用加载后的全局变量 163 | docSum = len(docList) # 第一维len代表了文件数 164 | for word in emotionList: 165 | TF = 0 166 | IDF= 0 167 | times = 0 168 | for doc in docList: 169 | if word in doc: times+=1 170 | IDF = math.log10(docSum/abs(times+1)) 171 | times = 0 172 | for doc in docList: 173 | times+=doc.count(word) 174 | TF = newswords.count(word)/(times+1) 175 | wordsVec.append(TF*IDF) 176 | # out-of-dict 177 | # time:O(2*n) 178 | elif mode==4: 179 | global wordsList 180 | for word in wordsList: 181 | wordsVec.append(newswords.count(word)) 182 | 183 | return wordsVec 184 | 185 | 186 | def dataNormal(vecArr): 187 | ''' 188 | 数据归一化 189 | :param vecArr: array类型vec向量 190 | :return: 归一化的词向量,减小影响。 191 | ''' 192 | return (vecArr-vecArr.min())/(vecArr.max()-vecArr.min()) 193 | 194 | 195 | def randomData(xData,yData,w=0.25,logFile=None): 196 | """ 197 | 随机生成训练集和测试集 198 | :param xData: m*n narray. 199 | :param yData: n narray. 200 | :param w: 训练集和测试集分割的权重 201 | :param logFile: n list. 记录每条数据的tag(例如文件名) 202 | :return: 分割好的trainX,trainY,testX,testY[,logTrain,logTest] 203 | """ 204 | np.random.seed(0) # 为了使每次的结果可以比较,要设置一个种子数 205 | if logFile: 206 | assert len(logFile)==len(xData)==len(yData),'缺少维度 at OperateData.py' 207 | else: 208 | assert len(xData)==len(yData),'缺少维度 at OperateData.py' 209 | length = len(xData) 210 | indices = np.random.permutation(length) # 对[0:length]区间的整数随机排列得到对应的index 211 | trainX = xData[indices[:(-1)*int(w*length)]] # 取出对应的index对应的元素 212 | trainY = yData[indices[:(-1)*int(w*length)]] 213 | testX = xData[indices[(-1)*int(w*length):]] 214 | testY = yData[indices[(-1)*int(w*length):]] 215 | logTrain = [logFile[i] for i in indices[:(-1)*int(w*length)]] 216 | logTest = [logFile[i] for i in indices[(-1)*int(w*length):]] 217 | if logFile: 218 | return trainX,trainY,testX,testY,logTrain,logTest 219 | return trainX,trainY,testX,testY 220 | 221 | 222 | def twoTag(x_arr,y_arr): 223 | """ 224 | 针对二分类方法 225 | :param x_arr: m*n narray. 226 | :param y_arr: n narray. 227 | :return: 剔除中性样本后的新样本 228 | """ 229 | new_index = (y_arr != 0) 230 | new_x = x_arr[new_index, :] # 所有中性样本 231 | new_y = y_arr[new_index] 232 | return new_x,new_y 233 | 234 | if __name__=='__main__': 235 | modes = 5 #一共5种word2vec方法 236 | loadStopwords() 237 | loadEmotionwords() 238 | loadWords(stopList) 239 | loadDocument(stopList) 240 | 241 | resultX = [] 242 | resultY = [] 243 | logfile = [] # 留作bug 244 | for doc in os.listdir(documentPath): 245 | if doc[:3] in ('pos','neg','neu'): 246 | logfile.append(doc) 247 | 248 | # logfile存储每个文件id和对应tag 249 | # 以后会用它计算结果3*3的矩阵 250 | with open(os.path.join('result','log','logfile.plk'),'wb') as f: 251 | pickle.dump(logfile,f) #存取 252 | 253 | for mode in range(modes): 254 | x = [] 255 | y = [] 256 | for doc in os.listdir(documentPath): 257 | news = None 258 | news_file_path = os.path.join(documentPath,doc) 259 | if doc[:3] in ('neg','neu','pos'): 260 | with open(news_file_path,'r',encoding='utf-8') as f: 261 | news = f.read() 262 | x.append(words2Vec(news,emotionList,stopList,posList,negList,mode=mode)) 263 | if doc.startswith('neg'): 264 | y.append(-1) 265 | elif doc.startswith('neu'): 266 | y.append(0) 267 | else: 268 | y.append(1) 269 | print('In', mode, news_file_path) 270 | resultX.append(np.array(x)) 271 | resultY.append(np.array(y)) 272 | 273 | np.savez(os.path.join('result','vector','resultX.npz'),onehot = resultX[0],wordfreq=resultX[1],twovec=resultX[2],tfidf=resultX[3],outofdict=resultX[4]) 274 | np.savez(os.path.join('result','vector','resultY.npz'),onehot = resultY[0],wordfreq=resultY[1],twovec=resultY[2],tfidf=resultY[3],outofdict=resultY[4]) 275 | print('Over') 276 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 40 | 41 | 42 | 43 | 44 | true 45 | DEFINITION_ORDER 46 | 47 | 48 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 |