[关闭]
@wuxin1994 2017-07-13T20:13:46.000000Z 字数 5602 阅读 1071

json文档向量表示的任务笔记

实验室项目 python


 本笔记记录完成本次 文本向量表示模块 任务的过程、遇到的问题及收获。

任务过程

A. 首先是理解任务需求,明确自己需要做什么,需要用到什么工具,最终需要达到什么目的,得到什么输出。
这一步中,莫凌波师兄先详细给我讲了任务需要做什么,以及需要用到的工具。简单来讲,就是把一个json格式的数据作为输入,将其中特定字段进行向量表示,将这些字段作为输入的特征。而经过向量表示的数据就可以直接输入到神经网络模型中,从而可以进行下一步的训练和优化。数据格式举例如下,其中,后面的json数据需要提取其中的description字段用来训练词向量,并根据tid把keywords信息增条到第一条数据中去。

  1. {"id":193,"title":"今日头条被判侵权,赔偿腾讯网27万余元 | 钛快讯","subtitle":null,"excerpt":null,"content":"\n \n \n \n \n\n\n\n\n钛媒体快讯 | 6月30日消息:北京市海淀区人民法院就腾讯网起诉今日头条的287宗侵权案件全部做出判决。今日头条被判287宗案件侵犯腾讯网信息网络传播权,需向腾讯网赔偿27万余元。\n\n\n今年4月,腾讯和搜狐以涉嫌侵犯其所属作品的信息网络传播权为由,一前一后将今日头条诉至海淀法院。腾讯和搜狐方面称,因今日头条涉嫌侵犯其作品版权和约稿版权,分别向北京市海淀区人民法院提交诉状,目前相关起诉已立案百余件,要求今日头条立即停止对涉案作品提供在线传播,并就涉案作品索赔经济损失百万级。\n\n\n涉案的287宗案件的相关作品,均为腾讯网员工的职务作品和独家约稿作品。今日头条从腾讯网直接抓取内容后,存储在自己的服务器上,并在今日头条网站和新闻客户端发布。今日头条网站及APP直接发布的页面上,大部分涉案作品都醒目地展示了“腾讯体育讯”“腾讯娱乐独家报道”等字样。但今日头条无视这些版权信息,仍然抓取使用。287宗案件的相关作品,均属于未经允许被擅自转载的情况。\n\n\n法院审理认为,字节跳动公司(今日头条)未经许可,在今日头条网和“今日头条”app上主动抓取腾讯公司独家所属版权作品,侵害了腾讯公司享有的信息网络传播权。经法院认定,今日头条在未经许可的情况下,擅自在今日头条网和今日头条app上刊出,字节跳动公司(今日头条)应当对其侵权行为承担相应的法律责任,涉案的287宗案件全部被判侵权,赔偿额总计达27万余元。\n\n\n巧合的是,就在昨天今日头条同样将腾讯旗下天天快报告上法庭。因认为快报网和天天快报客户端长期、大量存在侵犯今日头条签约作者原创作品权利的行为,今日头条以侵犯信息网络传播权将腾讯公司诉至法院,要求判令腾讯公司立即停止侵权、赔礼道歉并赔偿经济损失50万元。\n \n \n \n \n更多精彩内容,关注钛媒体微信号(ID:taimeiti),或者下载钛媒体App\n\n\n\n\n \n \n 本文系钛媒体原创,未经授权不得使用,如需获取转载授权,请点击这里。\n \n ","source":"钛媒体","domain":"m.tmtpost.com","topics":[{"id":8305,"tid":"itjuzi_company_0000000000002031","title":"今日头条","subtopics":[{"id":330465,"sid":"shangye_53606_1498469938012766","title":"负面"}]},{"id":8306,"tid":"itjuzi_company_0000000000024690","title":"腾讯","subtopics":[{"id":41394,"sid":"shangye_36717_1498469387576781","title":"其他"}]}]}
  2. {"id"=>1, "tid"=>"eastmoneyhk_company_0000000000000840", "title"=>"天业节水", "full_title"=>"新疆天业节水灌溉股份有限公司", "tags"=>nil, "description"=>"新疆天业节水灌溉股份有限公司于一九九九年十二月二十七日于中华人民共和国成立为一家有限责任公司。根据有关中国机关于二零零三年十二月十八日授予的批文,本公司重组其股本并转制成为一家股份有限公司。于二零零六年二月二十八日,本公司H股在香港联合交易所有限公司创业板上市。\n 本公司的直属控股公司为新疆天业股份有限公司。新疆天业(集团)有限公司为本公司的最终控股公司。", "keywords"=>"天业节水&&新疆天业节水灌溉股份有限公司&&Xinjiang Tianye Water Saving Irrigation System Company Limited", "topic_score"=>0, "concept_id"=>1, "icon_pic"=>nil, "topic_pic"=>nil, "post_count"=>0, "status"=>false, "state"=>true, "created_at"=>Mon, 12 Jun 2017 11:54:14 CST +08:00, "updated_at"=>Mon, 12 Jun 2017 11:54:14 CST +08:00}

一篇文章主要包含的字段及数据类型如下:

  1. - ID--number
  2. - title--sentence
  3. - subtitle--null
  4. - excerpt--null/sentence
  5. - content--article
  6. - source--word
  7. - domain--url
  8. - topic(多个)--json
  9. -ID--number
  10. -tid--?
  11. -title--word/null
  12. -subtitle(多个)--json
  13. -ID--number
  14. -tid--?
  15. -title--特定类别

B. 安装需要的环境和工具。

1)在官网下载安装压缩包

Anaconda3-4.0.0-Linux-x86_64.sh

2) 解压安装

bash ~/Downloads/Anaconda3-4.0.0-Linux-x86_64.sh

3)安装anaconda-navigator

conda install anaconda-navigator

C. 对数据进行预处理,这一部分主要分为三个部分,第一部分是提取topic.json中所需字段,并根据tid与增加keywords字段进原数据中;同时,需要提取description字段用作word2vec语料库,并且读出原数据中的title、source等字段作为sent2vec语料库,content作为doc2vec语料库;而且,从原始数据中,我们可以看出其中有很多不需要的空格和符号,因此也需要在预处理过程进行清洗数据工作。

D. 利用语料库和gensim工具训练模型。本次项目中,word2vec的语料库取的是维基文章和关于topic的description分词结果。doc2vec则用的数据中所有的content字段的内容。sent2doc用的模型和doc2vec一样,但是用的训练文本是输入数据需要用sent2vec表示的文本的总和。这样做的目的的加速模型的训练过程,得到文本的向量表示的结果。

E. 利用训练好的模型,分别完成对需要字段的向量表示,并以json格式存储。注意,subtopics字段的向量表示类似于one-hot representation。最终得到的结果实例如下。

  1. [{"topic": {"tid": "itjuzi_company_0000000000002031", "subtopics": [1, 0, 0, 0, 0, 0], "id": 8305, "title": [-0.02232701, -0.07608239, 0.00971896, -0.03329395, -0.06225205, 0.04729871, 0.06462888, 0.01956864, -0.02433609, -0.04428492, -0.04013059, 0.01619475, -0.00710587, 0.06034641, 0.05063558, 0.0728161, 0.07784144, -0.06776804, 0.12236139, -0.06195598, 0.11928782, -0.00761879, -0.06711438, -0.02075042, 0.0629583, 0.08324029, 0.04379567, -0.018052, -0.12807496, 0.05536722, -0.10777213, 0.04363652, 0.06882308, -0.06842109, -0.11016075, 0.0464212, 0.00279223, 0.07026806, -0.04037383, 0.06176091, -0.02109067, 0.15216686, -0.03525602, 0.04995346, -0.04411057,......(省略) -0.01448343, -0.10638844], [0.0], [0.0]], "id": 193}]

细节流程

在上述需求的前提下,模块运行流程如下:

    a.下载维基语料库并预处理
    b.合并jieba自带的分词词典和项目用到的分词词典
    c.从topic.json中得到 description 并写入到 desc_texts.texts。同时,得到一个 tid-keywords 字典。
    d.对维基语料库和description语料库进行分词,并合并分词结果到segment.txt。(并得到句子和段落的语料库)
    e.利用分词结果训练word2vec模型(利用句子和段落语料库训练sent2vec,doc2vec模型)
    f.处理原始输入json文件,根据topic数目拆分,并根据tid-keywords字典加入keywords字段信息。
    g.分别处理各个字段,得到向量表示,并以json格式存储,然后写入到输出文件中。

模块最终的结果如图:
此处输入图片的描述
其中各个python文件的作用:

  test_code.py 可执行的main()文件
  getJson.py 处理和输出json文件
  ruturn_vec.py 把json文件向量表示
  segment.py 把语料库分词
  train.py 训练词/句子/doc向量模型
  demo.py 用来测试word2vec模型结果
  wiki_to_texts 从wiki语料中读取文章内容

  data文件夹:存放待表示的json文件
  jieba_dict文件夹:用来分词的相关文件
  word2vec-tutorial文件夹:存放语料库和训练模型的文件

问题总结

  1. KeyError(u"word '\u74dc\u897f\u897f' not in vocabulary",)

图1

原因分析及解决办法:初始文件不是json结构,要让程序能直接load出json格式的数据流,存储格式为一个lists。

  1. import re
  2. description = re.findall(r"\"description\"\=\>\"[^\"]*\"",topic)#以读取description字段为例。
  1. TypeError: write() argument 1 must be unicode, not str

原因分析及解决办法:编码问题,写入的字段需要是unicode。

此处输入图片的描述
写入的文件每次总多一行空格,一直以为是显示bug,后来在数据写入时加上了一些if判断,问题解决。

  1. #办法1
  2. import sys
  3. reload(sys)
  4. sys.setdefaultencoding('utf-8')
  5. #办法2
  6. write(string.encoding('utf-8'))
  7. #办法3:可以先将需要输出或者写入的数据用for循环转成unicode字符串,然后再用write()方法写入。
  8. #办法4 :将unicode转换成汉字的方法
  9. print string.decode("unicode-escape")
  10. #办法4(写入json文件时)
  11. json.dump(new_topic_json,data_input,ensure_ascii=False)

收获

    1.提高编程debug能力;
    2.学习gensim工具和jieba分词工具的使用;
    3.训练神经网络模型中对数据的预处理的学习。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注