Text-Auto-Summarization/[old]Project-02-AutoSummari...

4873 lines
387 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"is_executing": false
}
},
"outputs": [],
"source": [
"def hint(string): return print(\u0027\u0027.join(map(chr, map(lambda x: int(x, 16), string.split(\u0027.\u0027)))))"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## Environment\n",
"+ Pycharm\n",
"+ python3.6\n",
"+ networkx\n",
"+ jieba\n",
"+ numpy, pandas, matplotlib\n",
"+ gensim"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## References"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"+ https://nlp.stanford.edu/pubs/see2017get.pdf\n",
"+ https://web.eecs.umich.edu/~mihalcea/papers/mihalcea.emnlp04.pdf\n",
"+ https://openreview.net/pdf?id\u003dSyK00v5xx\n",
"+ https://arxiv.org/abs/1409.0473\n",
"+ "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## Background Knowledge"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q1. 简述自动摘要技术的三个应用场景?"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:\n",
"1. 新闻简报(对长新闻的自动提取)\n",
"2. 微信公众号文章的自动摘要\n",
"3. paper文章的自动摘要\n",
"4. 谷歌登搜索引擎搜索后看到的简短摘要"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"##### 提示,如果需要帮助,可以运行以下的提示"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"# remove the # before hint(), to show the example sulution\n",
"#hint(\u0027a.641c.7d22.5f15.64ce.ff1b.a.32.2e.20.89c2.70b9.62bd.53d6.ff1b.a.33.2e.20.65b0.95fb.ff1b.a.34.2e.20.6c47.62a5.6587.6863.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q2. 目前的摘要技术分为哪两类?"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:\n",
"1. Extraction 抽取式\n",
"2. Abstraction 生成式\n",
"\n",
"\u003e 目前Extraction抽取式的主要方法\n",
"\n",
"\u003e\u003e - 基于统计:统计词频,位置等信息,计算句子权值,再简选取权值高的句子作为文摘,特点:简单易用,但对词句的使用大多仅停留在表面信息。\n",
"\n",
"\u003e\u003e - 基于图模型构建拓扑结构图对词句进行排序。例如TextRank/LexRank。\n",
"\n",
"\u003e\u003e - 基于潜在语义使用主题模型挖掘词句隐藏信息。例如采用LDAHMM。\n",
"\n",
"\u003e\u003e - 基于线路规划:将摘要问题转为线路规划,求全局最优解。\n",
"\n",
"\u003e\u003e 在python语言中用于文本摘要自动提取的库包括gooseSnowNLPTextTeasersumyTextRank等。\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"pycharm": {
"is_executing": false
}
},
"outputs": [],
"source": [
"#hint(\u0027a.6458.8981.20.41.62.73.74.72.61.63.74.69.76.65.3a.20.91cd.65b0.6574.7406.4fe1.606f.a.62bd.53d6.20.45.78.74.72.61.63.74.69.76.65.3a.20.4ece.539f.6587.4e2d.63d0.53d6.90e8.5206.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q3. 目前实现自动摘要的难点在哪里?列出三点。"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:\n",
"1. 生成字数简短、精炼,读起来通顺的摘要,如何评价摘要比较难\n",
"2. 找到权重最高的句子\n",
"3. 中文多文档摘要"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.31.2e.20.7f3a.4e4f.6807.6ce8.8bad.7ec3.6570.636e.ff1b.a.32.2e.20.57fa.4e8e.6587.672c.7406.89e3.ff0c.63d0.53d6.91cd.8981.5185.5bb9.96be.ff1b.a.33.2e.20.4eba.7c7b.5bf9.6587.672c.903b.8f91.654f.611f.ff0c.6458.8981.7ed3.679c.5bb9.9519.7387.4f4e.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## Basic Technologies"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q4. 什么是PageRank PageRank 用在什么地方?用 $Latex$ 写出其方程"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答: \n",
"\n",
"(简单)**Pagerank算法是Google的网页排名算法通过网页间的互相投票得到网页的重要性分数。**\n",
"\n",
"详细PageRank 是一种通过网页之间的超链接来计算网页重要性的技术,以 Google 创办人 Larry Page 之姓来命名Google 用它来体现网页的相关性和重要性。PageRank 通过网络浩瀚的超链接关系来确定一个页面的等级,把从 A 页面到 B 页面的链接解释为 A 页面给 B 页面投票Google 根据 A 页面(甚至链接到 A 的页面)的等级和投票目标的等级来决定 B 的等级。简单的说,一个高等级的页面可以使其他低等级页面的等级提升。\n",
"\n",
"整个互联网可以看作是一张有向图图,网页是图中的节点,网页之间的链接就是图中的边。如果网页 A 存在到网页 B 的链接,那么就有一条从网页 A 指向网页 B 的有向边。\n",
"\n",
"构造完图后,使用下面的公式来计算网页 i 的重要性PR值\n",
"\n",
"$$ S(V_{i}) \u003d (1 - d) + d \\cdot \\sum_{j \\in In(V_{i})} \\frac{1}{\\vert {Out(V_{j})} \\vert} S(V_{j}) $$\n",
"\n",
"- d是阻尼系数一般设置为 0.85。\n",
"- $In(V_{i})$是存在指向网页 i 的链接的网页集合。\n",
"- $Out(V_{j})$是网页 j中的链接指向的网页的集合。\n",
"- $\\vert {Out(V_{j})} \\vert$是集合中元素的个数。\n",
"\n",
"PageRank 需要使用上面的公式多次迭代才能得到结果。初始时,可以设置每个网页的重要性为 1。\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.31.2e.20.65b9.7a0b.3a.a.20.20.20.20.50.52.28.70.5f.69.29.20.3d.20.a.72.61.63.7b.31.2d.64.7d.7b.4e.7d.20.2b.20.64.20.5c.73.75.6d.5f.7b.70.5f.6a.20.5c.69.6e.20.4d.28.70.5f.69.29.7d.20.a.72.61.63.7b.50.52.20.28.70.5f.6a.29.7d.7b.4c.28.70.5f.6a.29.7d.a.32.2e.20.53c2.8003.ff1a.a.20.20.20.20.68.74.74.70.73.3a.2f.2f.77.77.77.2e.77.69.6b.69.77.61.6e.64.2e.63.6f.6d.2f.65.6e.2f.50.61.67.65.52.61.6e.6b.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q5. PageRank和TextRank的关系是什么TextRank的背景原理是什么 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:\n",
"\n",
"(简单)**TextRank是PageRank算法在文本关键词提取和摘要抽取上的应用。**\n",
"\n",
"(简单)**TextRank把文章中的每一个词视为图上的一个节点在一定窗口范围内的词之间建立连接关系通过PageRank的迭代算法得到每个词的重要性进而排序提取前几个词作为关键词。**\n",
"\n",
"详细TextRank 公式在 PageRank 公式的基础上,为图中的边引入了权值的概念:\n",
"\n",
"$$ WS(V_{i}) \u003d (1 - d) + d \\cdot \\sum_{j \\in In(V_{i})} \\frac{w_{ji}}{\\sum_{V_{k} \\in {Out(V_{j})}} w_{ji} } WS(V_{j}) $$\n",
"\n",
"- $w_{ji}$就是是为图中节点 $V_{i}$到 $V_{j}$ 的边的权值 。\n",
"- d 依然为阻尼系数代表从图中某一节点指向其他任意节点的概率一般取值为0.85。\n",
"- $In(V_{i})$和 $Out(V_{j})$也和 PageRank 类似,分别为指向节点 V_{i}的节点集合和从节点 V_{i}出发的边指向的节点集合。\n",
"\n",
"在 TextRank 构建的图中,默认节点就是句子,权值 $w_{ji}$就是两个句子 $S_{i}$和 $S_{j}$的相似程度。两个句子的相似度使用下面的公式来计算:\n",
"\n",
"$$Similarity(S_{i}, S_{j}) \u003d \\frac{\\vert {w_{k} \\vert w_{k} \\in S_{i} \\\u0026 w_{k} \\in S_{j} }\\vert }{log(\\vert S_{i}) + log(\\vert S_{j})} $$ \n",
"\n",
"分子是在两个句子中都出现的单词的数量,|Si|是句子 i 中的单词数。\n",
"使用 TextRank 算法计算图中各节点的得分时同样需要给图中的节点指定任意的初值通常都设为1。然后递归计算直到收敛即图中任意一点的误差率小于给定的极限值时就可以达到收敛一般该极限值取 0.0001。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"metadata": false,
"name": "#%% md\n"
}
},
"source": [
"## 使用 TextRank 提取摘要\n",
"自动摘要,就是从文章中自动抽取关键句。人类对关键句的理解通常是能够概括文章中心的句子,而机器只能模拟人类的理解,即拟定一个权重的评分标准,给每个句子打分,之后给出排名靠前的几个句子。基于 TextRank 的自动文摘属于自动摘录,通过选取文本中重要度较高的句子形成文摘。\n",
"\n",
"依然使用 TextRank 公式:\n",
"$$ WS(V_{i}) \u003d (1 - d) + d \\cdot \\sum_{j \\in In(V_{i})} \\frac{w_{ji}}{\\sum_{V_{k} \\in {Out(V_{j})}} w_{ji} } WS(V_{j}) $$\n",
"\n",
"等式左边表示一个句子的权重WS 是 weight_sum 的缩写),右侧的求和表示每个相邻句子对本句子的贡献程度。与提取关键字的时候不同,一般认为全部句子都是相邻的,不再通过窗口提取。\n",
"\n",
"边的权值 Wij代表句子 Si 和 Sj 的相似度既可以使用上面介绍过的基于句子间内容覆盖率的方法计算也可以使用基于编辑距离基于语义词典余弦相似度BM25 算法等等。\n",
"因为我们是要抽取关键句,因而是以句子为基本单位。使用 TextRank 提取摘要的整个过程如下:\n",
"\n",
"1. 处理:将文本分割成句子 S1,S2,⋯,Sm以句子为节点构建图\n",
"2. 计算句子相似度:对句子进行分词、取停用词等处理,以便于计算任意两个句子之间的相似度。将计算好的句子相似度作为两个句子构成的边的权值\n",
"3. 句子权重:根据公式,迭代传播权重计算各句子的得分。\n",
"4. 抽取文摘句:得到的句子得分进行倒序排序,抽取重要度最高的 N 个句子作为候选文摘句。\n",
"5. 形成文摘:根据字数或句子数要求,从候选文摘句中抽取句子组成文摘。\n",
"\n",
"\u003e 使用 TextRank 提取关键词未整理进来参考https://xiaosheng.me/2017/04/08/article49/\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.53c2.8003.8bba.6587.ff1a.20.68.74.74.70.73.3a.2f.2f.77.65.62.2e.65.65.63.73.2e.75.6d.69.63.68.2e.65.64.75.2f.7e.6d.69.68.61.6c.63.65.61.2f.70.61.70.65.72.73.2f.6d.69.68.61.6c.63.65.61.2e.65.6d.6e.6c.70.30.34.2e.70.64.66.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q6. 在存在大量原始文本以及该文本对应的摘要内容时,我们是否可以使用 Seq2Seq 进行生成? Sequence2Sequence的原理是什么 Attention的机制原理是什么 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"答:可以。\n",
"seq2seq的原理是将输入序列进行编码然后再解码得到输出序列的过程。\n",
"训练编码器将输入的原文向量提取出关键的语义作为解码器的输入训练的答案是摘要文本的向量。原理就是将LSTM分别作为encoder和decoder来进行信息的提取与还原生成。\n",
"\n",
"\n",
"attention的机制是对encoder的每一个隐藏状态有一个权值的打分评判分数越高的说明输出的结果越依赖当前encoder的输入而让模型达到更加注意这一个输入点的结果。"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"参考地址:[完全图解RNN、RNN变体、Seq2Seq、Attention机制](https://zhuanlan.zhihu.com/p/28054589)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"seq2seq 是一个EncoderDecoder 结构的网络,它的输入是一个序列,输出也是一个序列, Encoder 中将一个可变长度的信号序列变为固定长度的向量表达Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。\n",
"这个结构最重要的地方在于输入序列和输出序列的长度是可变的,可以用于翻译,聊天机器人,句法分析,文本摘要等。\n",
"![想象一下翻译任务input是一段英文output是一段中文。](https://pic1.zhimg.com/80/v2-d90b7f4c45a9641296ce0862fe8ce0ac_hd.jpg)\n",
"\n",
"\u003e [完全图解RNN、RNN变体、Seq2Seq、Attention机制](https://zhuanlan.zhihu.com/p/28054589)\n",
"\n",
"### Extractive, Abstractive \n",
"+ Extractive是从文中找出关键信息然后拼接进行结果输出\n",
" + 确定重要信息\n",
"+ Abstracrtive: 依据文本的输入,生产单词(可能是新的单词)进行结果输出\n",
" + Seq2Seq的问题\n",
" + Transfomer"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## Data Pipeline"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"我们首先加载数据"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import jieba\n",
"import os\n",
"import pandas as pd\n",
"from collections import Counter\n",
"import numpy as np\n",
"# from opencc import OpenCC\n",
"import jieba\n",
"import random\n",
"from gensim.models import FastText\n",
"from gensim.models.word2vec import LineSentence\n",
"\n",
"def cut(string): return \u0027 \u0027.join(jieba.cut(string))\n",
"path_root \u003d \u0027C:/AI-NLP/learn-NLP-luhuibo/data\u0027\n",
"news_file \u003d os.path.join(path_root, \u0027sqlResult_1558435.csv\u0027) \n",
"# this file could downloaded from github group\u0027s : \n",
"# https://github.com/Artificial-Intelligence-for-NLP-Chinese/datasource "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"\u0027C:/AI-NLP/learn-NLP-luhuibo/data\\\\sqlResult_1558435.csv\u0027"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"news_file"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/html": [
"\u003cdiv\u003e\n",
"\u003cstyle scoped\u003e\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"\u003c/style\u003e\n",
"\u003ctable border\u003d\"1\" class\u003d\"dataframe\"\u003e\n",
" \u003cthead\u003e\n",
" \u003ctr style\u003d\"text-align: right;\"\u003e\n",
" \u003cth\u003e\u003c/th\u003e\n",
" \u003cth\u003eid\u003c/th\u003e\n",
" \u003cth\u003eauthor\u003c/th\u003e\n",
" \u003cth\u003esource\u003c/th\u003e\n",
" \u003cth\u003econtent\u003c/th\u003e\n",
" \u003cth\u003efeature\u003c/th\u003e\n",
" \u003cth\u003etitle\u003c/th\u003e\n",
" \u003cth\u003eurl\u003c/th\u003e\n",
" \u003c/tr\u003e\n",
" \u003c/thead\u003e\n",
" \u003ctbody\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e0\u003c/td\u003e\n",
" \u003ctd\u003e89617\u003c/td\u003e\n",
" \u003ctd\u003eNaN\u003c/td\u003e\n",
" \u003ctd\u003e快科技@http://www.kkj.cn/\u003c/td\u003e\n",
" \u003ctd\u003e此外自本周6月12日除小米手机6等15款机型外其余机型已暂停更新发布含开发版/...\u003c/td\u003e\n",
" \u003ctd\u003e{\"type\":\"科技\",\"site\":\"cnbeta\",\"commentNum\":\"37\"...\u003c/td\u003e\n",
" \u003ctd\u003e小米MIUI 9首批机型曝光共计15款\u003c/td\u003e\n",
" \u003ctd\u003ehttp://www.cnbeta.com/articles/tech/623597.htm\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e1\u003c/td\u003e\n",
" \u003ctd\u003e89616\u003c/td\u003e\n",
" \u003ctd\u003eNaN\u003c/td\u003e\n",
" \u003ctd\u003e快科技@http://www.kkj.cn/\u003c/td\u003e\n",
" \u003ctd\u003e骁龙835作为唯一通过Windows 10桌面平台认证的ARM处理器高通强调不会因为只考...\u003c/td\u003e\n",
" \u003ctd\u003e{\"type\":\"科技\",\"site\":\"cnbeta\",\"commentNum\":\"15\"...\u003c/td\u003e\n",
" \u003ctd\u003e骁龙835在Windows 10上的性能表现有望改善\u003c/td\u003e\n",
" \u003ctd\u003ehttp://www.cnbeta.com/articles/tech/623599.htm\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e2\u003c/td\u003e\n",
" \u003ctd\u003e89615\u003c/td\u003e\n",
" \u003ctd\u003eNaN\u003c/td\u003e\n",
" \u003ctd\u003e快科技@http://www.kkj.cn/\u003c/td\u003e\n",
" \u003ctd\u003e此前的一加3T搭载的是3400mAh电池DashCharge快充规格为5V/4A。\\r\\n...\u003c/td\u003e\n",
" \u003ctd\u003e{\"type\":\"科技\",\"site\":\"cnbeta\",\"commentNum\":\"18\"...\u003c/td\u003e\n",
" \u003ctd\u003e一加手机5细节曝光3300mAh、充半小时用1天\u003c/td\u003e\n",
" \u003ctd\u003ehttp://www.cnbeta.com/articles/tech/623601.htm\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e3\u003c/td\u003e\n",
" \u003ctd\u003e89614\u003c/td\u003e\n",
" \u003ctd\u003eNaN\u003c/td\u003e\n",
" \u003ctd\u003e新华社\u003c/td\u003e\n",
" \u003ctd\u003e这是6月18日在葡萄牙中部大佩德罗冈地区拍摄的被森林大火烧毁的汽车。新华社记者张立云摄\\r\\n\u003c/td\u003e\n",
" \u003ctd\u003e{\"type\":\"国际新闻\",\"site\":\"环球\",\"commentNum\":\"0\",\"j...\u003c/td\u003e\n",
" \u003ctd\u003e葡森林火灾造成至少62人死亡 政府宣布进入紧急状态(组图)\u003c/td\u003e\n",
" \u003ctd\u003ehttp://world.huanqiu.com/hot/2017-06/10866126....\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e4\u003c/td\u003e\n",
" \u003ctd\u003e89613\u003c/td\u003e\n",
" \u003ctd\u003e胡淑丽_MN7479\u003c/td\u003e\n",
" \u003ctd\u003e深圳大件事\u003c/td\u003e\n",
" \u003ctd\u003e原标题44岁女子跑深圳约会网友被拒暴雨中裸身奔走……\\r\\n@深圳交警微博称:昨日清...\u003c/td\u003e\n",
" \u003ctd\u003e{\"type\":\"新闻\",\"site\":\"网易热门\",\"commentNum\":\"978\",...\u003c/td\u003e\n",
" \u003ctd\u003e44岁女子约网友被拒暴雨中裸奔 交警为其披衣相随\u003c/td\u003e\n",
" \u003ctd\u003ehttp://news.163.com/17/0618/00/CN617P3Q0001875...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003c/tbody\u003e\n",
"\u003c/table\u003e\n",
"\u003c/div\u003e"
],
"text/plain": [
" id author source \\\n",
"0 89617 NaN 快科技@http://www.kkj.cn/ \n",
"1 89616 NaN 快科技@http://www.kkj.cn/ \n",
"2 89615 NaN 快科技@http://www.kkj.cn/ \n",
"3 89614 NaN 新华社 \n",
"4 89613 胡淑丽_MN7479 深圳大件事 \n",
"\n",
" content \\\n",
"0 此外自本周6月12日除小米手机6等15款机型外其余机型已暂停更新发布含开发版/... \n",
"1 骁龙835作为唯一通过Windows 10桌面平台认证的ARM处理器高通强调不会因为只考... \n",
"2 此前的一加3T搭载的是3400mAh电池DashCharge快充规格为5V/4A。\\r\\n... \n",
"3 这是6月18日在葡萄牙中部大佩德罗冈地区拍摄的被森林大火烧毁的汽车。新华社记者张立云摄\\r\\n \n",
"4 原标题44岁女子跑深圳约会网友被拒暴雨中裸身奔走……\\r\\n@深圳交警微博称:昨日清... \n",
"\n",
" feature \\\n",
"0 {\"type\":\"科技\",\"site\":\"cnbeta\",\"commentNum\":\"37\"... \n",
"1 {\"type\":\"科技\",\"site\":\"cnbeta\",\"commentNum\":\"15\"... \n",
"2 {\"type\":\"科技\",\"site\":\"cnbeta\",\"commentNum\":\"18\"... \n",
"3 {\"type\":\"国际新闻\",\"site\":\"环球\",\"commentNum\":\"0\",\"j... \n",
"4 {\"type\":\"新闻\",\"site\":\"网易热门\",\"commentNum\":\"978\",... \n",
"\n",
" title \\\n",
"0 小米MIUI 9首批机型曝光共计15款 \n",
"1 骁龙835在Windows 10上的性能表现有望改善 \n",
"2 一加手机5细节曝光3300mAh、充半小时用1天 \n",
"3 葡森林火灾造成至少62人死亡 政府宣布进入紧急状态(组图) \n",
"4 44岁女子约网友被拒暴雨中裸奔 交警为其披衣相随 \n",
"\n",
" url \n",
"0 http://www.cnbeta.com/articles/tech/623597.htm \n",
"1 http://www.cnbeta.com/articles/tech/623599.htm \n",
"2 http://www.cnbeta.com/articles/tech/623601.htm \n",
"3 http://world.huanqiu.com/hot/2017-06/10866126.... \n",
"4 http://news.163.com/17/0618/00/CN617P3Q0001875... "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"news_content \u003d pd.read_csv(news_file, encoding\u003d\u0027gb18030\u0027)\n",
"news_content.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"然后进行:\n",
" 1. 把content这一列全部拿出来\n",
" 2. 对content进行切词\n",
" 3. 统计单词出现的频率格式\n",
" 4. 其他的分析\n",
"`提示`相关代码可以在Github Group的Slides里边的Lecture18自动摘要里边看到。 https://github.com/Computing-Intelligence/jupyters_and_slides/blob/master/Lecuter-18-AutoSummarizaiton.pdf"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"# 业内习惯性将加载数据用函数def load_data()来处理\n",
"# 加载数据并将处理的数据存到pureContent.csv中\n",
"def load_data():\n",
" pure_file \u003d os.path.join(path_root, \u0027pureContent.csv\u0027)\n",
" if not os.path.exists(pure_file):\n",
" news_file \u003d os.path.join(path_root, \u0027sqlResult_1558435.csv\u0027)\n",
" news_content \u003d pd.read_csv(news_file, encoding\u003d\u0027gb18030\u0027)\n",
" #fillna()会将DataFrame中nan数据的数据填充为想要的数据并返回填充后的结果。这里讲NANt填充为空\n",
" news_content[\u0027content\u0027] \u003d news_content[\u0027content\u0027].fillna(\u0027\u0027)\n",
" pure_content \u003d pd.DataFrame()\n",
" pure_content[\u0027content\u0027] \u003d news_content[\u0027content\u0027]\n",
" pure_content \u003d pure_content.fillna(\u0027\u0027)\n",
" pure_content[\u0027tokenized_content\u0027] \u003d pure_content[\u0027content\u0027].apply(cut)\n",
" pure_content.to_csv(pure_file, encoding\u003d\u0027gb18030\u0027)\n",
" else:\n",
" print(\u0027File found! \u0027)\n",
" pure_content \u003d pd.read_csv(pure_file, encoding\u003d\u0027gb18030\u0027)\n",
" pure_content \u003d pure_content.fillna(\u0027\u0027)\n",
" return pure_content"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Building prefix dict from the default dictionary ...\n",
"Loading model from cache C:\\Users\\壹心理\\AppData\\Local\\Temp\\jieba.cache\n",
"Loading model cost 0.748 seconds.\n",
"Prefix dict has been built succesfully.\n"
]
}
],
"source": [
"pure_content \u003d load_data()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"File found! \n"
]
}
],
"source": [
"# 再次确认文件是否加载进来\n",
"pure_content \u003d load_data()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/html": [
"\u003cdiv\u003e\n",
"\u003cstyle scoped\u003e\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"\u003c/style\u003e\n",
"\u003ctable border\u003d\"1\" class\u003d\"dataframe\"\u003e\n",
" \u003cthead\u003e\n",
" \u003ctr style\u003d\"text-align: right;\"\u003e\n",
" \u003cth\u003e\u003c/th\u003e\n",
" \u003cth\u003eUnnamed: 0\u003c/th\u003e\n",
" \u003cth\u003econtent\u003c/th\u003e\n",
" \u003cth\u003etokenized_content\u003c/th\u003e\n",
" \u003c/tr\u003e\n",
" \u003c/thead\u003e\n",
" \u003ctbody\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e0\u003c/td\u003e\n",
" \u003ctd\u003e0\u003c/td\u003e\n",
" \u003ctd\u003e此外自本周6月12日除小米手机6等15款机型外其余机型已暂停更新发布含开发版/...\u003c/td\u003e\n",
" \u003ctd\u003e此外 自 本周 6 月 12 日 除 小米 手机 6 等 15 款 机型...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e1\u003c/td\u003e\n",
" \u003ctd\u003e1\u003c/td\u003e\n",
" \u003ctd\u003e骁龙835作为唯一通过Windows 10桌面平台认证的ARM处理器高通强调不会因为只考...\u003c/td\u003e\n",
" \u003ctd\u003e骁龙 835 作为 唯一 通过 Windows 10 桌面 平台 认证 的 ARM 处理...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e2\u003c/td\u003e\n",
" \u003ctd\u003e2\u003c/td\u003e\n",
" \u003ctd\u003e此前的一加3T搭载的是3400mAh电池DashCharge快充规格为5V/4A。\\r\\n...\u003c/td\u003e\n",
" \u003ctd\u003e此前 的 一加 3T 搭载 的 是 3400mAh 电池 DashCharge 快充 规...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e3\u003c/td\u003e\n",
" \u003ctd\u003e3\u003c/td\u003e\n",
" \u003ctd\u003e这是6月18日在葡萄牙中部大佩德罗冈地区拍摄的被森林大火烧毁的汽车。新华社记者张立云摄\\r\\n\u003c/td\u003e\n",
" \u003ctd\u003e这是 6 月 18 日 在 葡萄牙 中部 大 佩德罗 冈 地区 拍摄 的 被 森林 大火 烧...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e4\u003c/td\u003e\n",
" \u003ctd\u003e4\u003c/td\u003e\n",
" \u003ctd\u003e原标题44岁女子跑深圳约会网友被拒暴雨中裸身奔走……\\r\\n@深圳交警微博称:昨日清...\u003c/td\u003e\n",
" \u003ctd\u003e 原 标题 44 岁 女子 跑 深圳 约会 网友 被 拒 暴雨 中 裸身 奔走 …...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003c/tbody\u003e\n",
"\u003c/table\u003e\n",
"\u003c/div\u003e"
],
"text/plain": [
" Unnamed: 0 content \\\n",
"0 0 此外自本周6月12日除小米手机6等15款机型外其余机型已暂停更新发布含开发版/... \n",
"1 1 骁龙835作为唯一通过Windows 10桌面平台认证的ARM处理器高通强调不会因为只考... \n",
"2 2 此前的一加3T搭载的是3400mAh电池DashCharge快充规格为5V/4A。\\r\\n... \n",
"3 3 这是6月18日在葡萄牙中部大佩德罗冈地区拍摄的被森林大火烧毁的汽车。新华社记者张立云摄\\r\\n \n",
"4 4 原标题44岁女子跑深圳约会网友被拒暴雨中裸身奔走……\\r\\n@深圳交警微博称:昨日清... \n",
"\n",
" tokenized_content \n",
"0 此外 自 本周 6 月 12 日 除 小米 手机 6 等 15 款 机型... \n",
"1 骁龙 835 作为 唯一 通过 Windows 10 桌面 平台 认证 的 ARM 处理... \n",
"2 此前 的 一加 3T 搭载 的 是 3400mAh 电池 DashCharge 快充 规... \n",
"3 这是 6 月 18 日 在 葡萄牙 中部 大 佩德罗 冈 地区 拍摄 的 被 森林 大火 烧... \n",
"4 原 标题 44 岁 女子 跑 深圳 约会 网友 被 拒 暴雨 中 裸身 奔走 …... "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pure_content.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"# Train the word vector"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"# 加载模型函数如果不存在则gensim自带的fastText进行训练\n",
"# 语料是all_corpus.txt用pure_content中处理过的内容\n",
"def load_model(pure_content):\n",
" model_file \u003d os.path.join(path_root, \u0027wordmodel_50.model\u0027)\n",
" savedContent \u003d os.path.join(path_root, \u0027all_corpus.txt\u0027)\n",
"\n",
" if not os.path.exists(model_file):\n",
" if not os.path.exists(savedContent):\n",
" with open(savedContent , \u0027w\u0027, encoding\u003d\u0027utf-8\u0027) as f:\n",
" f.write(\u0027 \u0027.join(pure_content[\u0027tokenized_content\u0027].tolist()))\n",
" model \u003d FastText(LineSentence(savedContent), workers\u003d8,window\u003d5, size\u003d50, iter\u003d10, min_count\u003d1)\n",
" model.save(model_file)\n",
" else:\n",
" print(\u0027model Found!\u0027)\n",
" model \u003d FastText.load(model_file)\n",
" return model\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\smart_open\\smart_open_lib.py:398: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function\n",
" \u0027See the migration notes for details: %s\u0027 % _MIGRATION_NOTES_URL\n",
"c:\\python36\\lib\\site-packages\\smart_open\\smart_open_lib.py:398: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function\n",
" \u0027See the migration notes for details: %s\u0027 % _MIGRATION_NOTES_URL\n"
]
}
],
"source": [
"model \u003d load_model(pure_content)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"model Found!\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\smart_open\\smart_open_lib.py:398: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function\n",
" \u0027See the migration notes for details: %s\u0027 % _MIGRATION_NOTES_URL\n"
]
}
],
"source": [
"# 检查模型是否训练好\n",
"model \u003d load_model(pure_content)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"from functools import reduce"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"tokeners \u003d [t for l in pure_content[\u0027tokenized_content\u0027].tolist() for t in l.split()]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[\u0027此外\u0027, \u0027\u0027, \u0027自\u0027, \u0027本周\u0027, \u0027\u0027, \u00276\u0027, \u0027月\u0027, \u002712\u0027, \u0027日\u0027, \u0027\u0027]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tokeners[:10]"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"# Counts the words occurence"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"from collections import Counter\n",
"tokener_counter \u003d Counter(tokeners)\n",
"frequence \u003d {w: count/len(tokeners) for w, count in tokener_counter.items()}\n",
"occurences_frequences \u003d sorted(list(frequence.values()), reverse\u003dTrue)\n",
"X \u003d range(len(occurences_frequences))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[\u003cmatplotlib.lines.Line2D at 0x1f33505abe0\u003e]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\u003d\u003d\n",
"text/plain": [
"\u003cFigure size 432x288 with 1 Axes\u003e"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(X[:50], occurences_frequences[:50])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"Counter({\u0027此外\u0027: 4239,\n",
" \u0027\u0027: 1360799,\n",
" \u0027自\u0027: 4829,\n",
" \u0027本周\u0027: 486,\n",
" \u0027\u0027: 212529,\n",
" \u00276\u0027: 32709,\n",
" \u0027月\u0027: 189525,\n",
" \u002712\u0027: 10468,\n",
" \u0027日\u0027: 169953,\n",
" \u0027\u0027: 212782,\n",
" \u0027起\u0027: 5266,\n",
" \u0027除\u0027: 1362,\n",
" \u0027小米\u0027: 287,\n",
" \u0027手机\u0027: 2997,\n",
" \u0027等\u0027: 58386,\n",
" \u002715\u0027: 8582,\n",
" \u0027款\u0027: 702,\n",
" \u0027机型\u0027: 139,\n",
" \u0027外\u0027: 3291,\n",
" \u0027其余\u0027: 482,\n",
" \u0027已\u0027: 21046,\n",
" \u0027暂停\u0027: 834,\n",
" \u0027更新\u0027: 623,\n",
" \u0027发布\u0027: 7840,\n",
" \u0027含\u0027: 710,\n",
" \u0027开发\u0027: 3911,\n",
" \u0027版\u0027: 925,\n",
" \u0027/\u0027: 33916,\n",
" \u0027体验版\u0027: 1,\n",
" \u0027内测\u0027: 6,\n",
" \u0027稳定版\u0027: 1,\n",
" \u0027暂不受\u0027: 1,\n",
" \u0027影响\u0027: 8135,\n",
" \u0027以\u0027: 38171,\n",
" \u0027确保\u0027: 2854,\n",
" \u0027工程师\u0027: 523,\n",
" \u0027可以\u0027: 13287,\n",
" \u0027集中\u0027: 2910,\n",
" \u0027全部\u0027: 3790,\n",
" \u0027精力\u0027: 261,\n",
" \u0027进行\u0027: 25986,\n",
" \u0027系统优化\u0027: 1,\n",
" \u0027工作\u0027: 20722,\n",
" \u0027。\u0027: 636522,\n",
" \u0027有人\u0027: 1847,\n",
" \u0027猜测\u0027: 209,\n",
" \u0027这\u0027: 22754,\n",
" \u0027也\u0027: 47399,\n",
" \u0027是\u0027: 100283,\n",
" \u0027将\u0027: 61656,\n",
" \u0027主要\u0027: 9804,\n",
" \u0027用到\u0027: 41,\n",
" \u0027MIUI\u0027: 5,\n",
" \u00279\u0027: 11344,\n",
" \u0027的\u0027: 703820,\n",
" \u0027研发\u0027: 3216,\n",
" \u0027之中\u0027: 654,\n",
" \u00278\u0027: 12192,\n",
" \u0027去年\u0027: 6330,\n",
" \u00275\u0027: 60104,\n",
" \u0027距今已有\u0027: 22,\n",
" \u0027一年\u0027: 3203,\n",
" \u0027有余\u0027: 30,\n",
" \u0027时候\u0027: 3067,\n",
" \u0027更新换代\u0027: 34,\n",
" \u0027了\u0027: 121903,\n",
" \u0027当然\u0027: 880,\n",
" \u0027关于\u0027: 4597,\n",
" \u0027确切\u0027: 68,\n",
" \u0027信息\u0027: 7725,\n",
" \u0027我们\u0027: 19982,\n",
" \u0027还是\u0027: 5133,\n",
" \u0027等待\u0027: 882,\n",
" \u0027官方消息\u0027: 10,\n",
" \u0027骁龙\u0027: 55,\n",
" \u0027835\u0027: 21,\n",
" \u0027作为\u0027: 10385,\n",
" \u0027唯一\u0027: 1367,\n",
" \u0027通过\u0027: 18167,\n",
" \u0027Windows\u0027: 49,\n",
" \u002710\u0027: 14454,\n",
" \u0027桌面\u0027: 109,\n",
" \u0027平台\u0027: 8298,\n",
" \u0027认证\u0027: 664,\n",
" \u0027ARM\u0027: 4,\n",
" \u0027处理器\u0027: 105,\n",
" \u0027高通\u0027: 73,\n",
" \u0027强调\u0027: 3181,\n",
" \u0027不会\u0027: 3786,\n",
" \u0027因为\u0027: 5593,\n",
" \u0027只\u0027: 4573,\n",
" \u0027考虑\u0027: 2345,\n",
" \u0027性能\u0027: 437,\n",
" \u0027而\u0027: 17404,\n",
" \u0027去\u0027: 7291,\n",
" \u0027屏蔽掉\u0027: 2,\n",
" \u0027小\u0027: 6576,\n",
" \u0027核心\u0027: 3311,\n",
" \u0027相反\u0027: 230,\n",
" \u0027他们\u0027: 13878,\n",
" \u0027正\u0027: 4777,\n",
" \u0027联手\u0027: 413,\n",
" \u0027微软\u0027: 340,\n",
" \u0027找到\u0027: 1826,\n",
" \u0027一种\u0027: 4035,\n",
" \u0027适合\u0027: 812,\n",
" \u0027、\u0027: 296644,\n",
" \u0027兼顾\u0027: 203,\n",
" \u0027和\u0027: 134220,\n",
" \u0027功耗\u0027: 22,\n",
" \u0027完美\u0027: 458,\n",
" \u0027方案\u0027: 2844,\n",
" \u0027报道\u0027: 9687,\n",
" \u0027称\u0027: 7460,\n",
" \u0027已经\u0027: 12235,\n",
" \u0027拿到\u0027: 1059,\n",
" \u0027一些\u0027: 9377,\n",
" \u0027新\u0027: 23942,\n",
" \u0027源码\u0027: 2,\n",
" \u0027以便\u0027: 402,\n",
" \u0027更好\u0027: 2858,\n",
" \u0027地\u0027: 12766,\n",
" \u0027理解\u0027: 1283,\n",
" \u0027big\u0027: 2,\n",
" \u0027.\u0027: 6965,\n",
" \u0027little\u0027: 1,\n",
" \u0027架构\u0027: 217,\n",
" \u0027资料\u0027: 1904,\n",
" \u0027显示\u0027: 8471,\n",
" \u0027一款\u0027: 598,\n",
" \u0027集成\u0027: 198,\n",
" \u0027CPU\u0027: 57,\n",
" \u0027GPU\u0027: 14,\n",
" \u0027基带\u0027: 3,\n",
" \u0027蓝牙\u0027: 28,\n",
" \u0027Wi\u0027: 12,\n",
" \u0027-\u0027: 18797,\n",
" \u0027Fi\u0027: 12,\n",
" \u0027SoC\u0027: 2,\n",
" \u0027比\u0027: 23335,\n",
" \u0027传统\u0027: 7068,\n",
" \u0027Wintel\u0027: 3,\n",
" \u0027节省\u0027: 273,\n",
" \u0027至少\u0027: 2482,\n",
" \u002730%\u0027: 492,\n",
" \u0027PCB\u0027: 14,\n",
" \u0027空间\u0027: 3598,\n",
" \u0027按计划\u0027: 193,\n",
" \u0027今年\u0027: 13936,\n",
" \u0027Q4\u0027: 8,\n",
" \u0027华硕\u0027: 11,\n",
" \u0027惠普\u0027: 20,\n",
" \u0027联想\u0027: 222,\n",
" \u0027首发\u0027: 489,\n",
" \u0027Win10\u0027: 9,\n",
" \u0027电脑\u0027: 854,\n",
" \u0027预计\u0027: 4389,\n",
" \u0027均\u0027: 4423,\n",
" \u0027二合一\u0027: 1,\n",
" \u0027形态\u0027: 363,\n",
" \u0027产品\u0027: 8906,\n",
" \u0027只是\u0027: 2397,\n",
" \u0027个\u0027: 23043,\n",
" \u0027开始\u0027: 11177,\n",
" \u0027未来\u0027: 8199,\n",
" \u0027也许\u0027: 532,\n",
" \u0027还\u0027: 21786,\n",
" \u0027能\u0027: 12159,\n",
" \u0027见到\u0027: 507,\n",
" \u0027三星\u0027: 340,\n",
" \u0027Exynos\u0027: 4,\n",
" \u0027联发科\u0027: 17,\n",
" \u0027华为\u0027: 319,\n",
" \u0027麒麟\u0027: 84,\n",
" \u0027澎湃\u0027: 254,\n",
" \u0027进入\u0027: 9193,\n",
" \u0027此前\u0027: 3154,\n",
" \u0027一加\u0027: 51,\n",
" \u00273T\u0027: 1,\n",
" \u0027搭载\u0027: 504,\n",
" \u00273400mAh\u0027: 1,\n",
" \u0027电池\u0027: 444,\n",
" \u0027DashCharge\u0027: 1,\n",
" \u0027快充\u0027: 7,\n",
" \u0027规格\u0027: 256,\n",
" \u0027为\u0027: 58104,\n",
" \u00275V\u0027: 2,\n",
" \u00274A\u0027: 47,\n",
" \u0027至于\u0027: 403,\n",
" \u0027缩水\u0027: 91,\n",
" \u0027可能\u0027: 9902,\n",
" \u0027与\u0027: 58317,\n",
" \u0027刘作\u0027: 3,\n",
" \u0027虎\u0027: 236,\n",
" \u0027所说\u0027: 293,\n",
" \u0027要\u0027: 21407,\n",
" \u0027做\u0027: 8635,\n",
" \u0027市面\u0027: 6,\n",
" \u0027最\u0027: 8964,\n",
" \u0027轻薄\u0027: 18,\n",
" \u0027大屏\u0027: 35,\n",
" \u0027旗舰\u0027: 90,\n",
" \u0027设定\u0027: 380,\n",
" \u0027有关\u0027: 6292,\n",
" \u0027按照\u0027: 4632,\n",
" \u0027目前\u0027: 16852,\n",
" \u0027掌握\u0027: 1293,\n",
" \u0027拥有\u0027: 3178,\n",
" \u00275.5\u0027: 117,\n",
" \u0027寸\u0027: 23,\n",
" \u00271080P\u0027: 2,\n",
" \u0027AMOLED\u0027: 41,\n",
" \u0027显示屏\u0027: 110,\n",
" \u00276G\u0027: 1,\n",
" \u00278GB\u0027: 9,\n",
" \u0027RAM\u0027: 15,\n",
" \u002764GB\u0027: 10,\n",
" \u0027128GB\u0027: 9,\n",
" \u0027ROM\u0027: 14,\n",
" \u0027双\u0027: 904,\n",
" \u00271600\u0027: 130,\n",
" \u0027万\u0027: 3390,\n",
" \u0027摄像头\u0027: 393,\n",
" \u0027备货\u0027: 15,\n",
" \u0027量\u0027: 1298,\n",
" \u0027“\u0027: 239982,\n",
" \u0027惊喜\u0027: 278,\n",
" \u0027”\u0027: 239981,\n",
" \u0027根据\u0027: 6920,\n",
" \u0027京东\u0027: 683,\n",
" \u0027泄露\u0027: 390,\n",
" \u0027售价\u0027: 288,\n",
" \u0027xx99\u0027: 1,\n",
" \u0027元\u0027: 6836,\n",
" \u0027应该\u0027: 2792,\n",
" \u0027在\u0027: 264634,\n",
" \u00272799\u0027: 1,\n",
" \u00272899\u0027: 3,\n",
" \u00272999\u0027: 3,\n",
" \u0027中\u0027: 77942,\n",
" \u0027某个\u0027: 188,\n",
" \u0027这是\u0027: 11356,\n",
" \u002718\u0027: 8040,\n",
" \u0027葡萄牙\u0027: 1224,\n",
" \u0027中部\u0027: 1063,\n",
" \u0027大\u0027: 17646,\n",
" \u0027佩德罗\u0027: 87,\n",
" \u0027冈\u0027: 6,\n",
" \u0027地区\u0027: 10979,\n",
" \u0027拍摄\u0027: 5481,\n",
" \u0027被\u0027: 25288,\n",
" \u0027森林\u0027: 1288,\n",
" \u0027大火\u0027: 147,\n",
" \u0027烧毁\u0027: 39,\n",
" \u0027汽车\u0027: 5223,\n",
" \u0027新华社\u0027: 142462,\n",
" \u0027记者\u0027: 62274,\n",
" \u0027张立\u0027: 120,\n",
" \u0027云摄\u0027: 114,\n",
" \u0027原\u0027: 2855,\n",
" \u0027标题\u0027: 1408,\n",
" \u0027\u0027: 102478,\n",
" \u002744\u0027: 419,\n",
" \u0027岁\u0027: 8731,\n",
" \u0027女子\u0027: 3715,\n",
" \u0027跑\u0027: 2773,\n",
" \u0027深圳\u0027: 2741,\n",
" \u0027约会\u0027: 99,\n",
" \u0027网友\u0027: 1821,\n",
" \u0027拒\u0027: 125,\n",
" \u0027暴雨\u0027: 687,\n",
" \u0027裸身\u0027: 3,\n",
" \u0027奔走\u0027: 66,\n",
" \u0027…\u0027: 12053,\n",
" \u0027@\u0027: 405,\n",
" \u0027交警\u0027: 347,\n",
" \u0027微博称\u0027: 12,\n",
" \u0027昨日\u0027: 796,\n",
" \u0027清晨\u0027: 590,\n",
" \u0027发现\u0027: 8559,\n",
" \u0027有\u0027: 46555,\n",
" \u0027一\u0027: 11369,\n",
" \u0027赤裸\u0027: 15,\n",
" \u0027上身\u0027: 53,\n",
" \u0027行走\u0027: 549,\n",
" \u0027南坪\u0027: 30,\n",
" \u0027快速\u0027: 2526,\n",
" \u0027上\u0027: 48837,\n",
" \u0027期间\u0027: 5085,\n",
" \u0027轻生\u0027: 59,\n",
" \u0027年头\u0027: 136,\n",
" \u0027一辅警\u0027: 2,\n",
" \u0027后\u0027: 28680,\n",
" \u0027赶紧\u0027: 198,\n",
" \u0027其\u0027: 11646,\n",
" \u0027披上\u0027: 64,\n",
" \u0027黄衣\u0027: 7,\n",
" \u0027并\u0027: 26574,\n",
" \u0027一路\u0027: 19209,\n",
" \u0027劝说\u0027: 105,\n",
" \u0027她\u0027: 12951,\n",
" \u0027那么\u0027: 2006,\n",
" \u0027事发\u0027: 635,\n",
" \u0027时\u0027: 19000,\n",
" \u0027到底\u0027: 642,\n",
" \u0027都\u0027: 28041,\n",
" \u0027发生\u0027: 8362,\n",
" \u0027些\u0027: 177,\n",
" \u0027什么\u0027: 3491,\n",
" \u0027呢\u0027: 1402,\n",
" \u0027\u0027: 13642,\n",
" \u0027南\u0027: 1079,\n",
" \u0027带\u0027: 3057,\n",
" \u0027您\u0027: 694,\n",
" \u0027一起\u0027: 4931,\n",
" \u0027还原\u0027: 178,\n",
" \u0027现场\u0027: 5881,\n",
" \u0027龙岗\u0027: 29,\n",
" \u0027大队\u0027: 906,\n",
" \u0027坂田\u0027: 6,\n",
" \u0027中队\u0027: 210,\n",
" \u0027辅警\u0027: 55,\n",
" \u0027刘青\u0027: 31,\n",
" \u0027女生\u0027: 286,\n",
" \u0027一位\u0027: 3058,\n",
" \u0027外表\u0027: 91,\n",
" \u0027高大\u0027: 178,\n",
" \u0027帅气\u0027: 39,\n",
" \u0027说话\u0027: 342,\n",
" \u0027略带\u0027: 25,\n",
" \u0027腼腆\u0027: 55,\n",
" \u002790\u0027: 1030,\n",
" \u0027青年\u0027: 3857,\n",
" \u0027介绍\u0027: 7292,\n",
" \u002716\u0027: 7776,\n",
" \u0027早上\u0027: 457,\n",
" \u00277\u0027: 14055,\n",
" \u002736\u0027: 933,\n",
" \u0027分\u0027: 7690,\n",
" \u0027他\u0027: 37118,\n",
" \u0027正在\u0027: 7686,\n",
" \u0027环城\u0027: 42,\n",
" \u0027南路\u0027: 90,\n",
" \u0027附近\u0027: 3620,\n",
" \u0027值勤\u0027: 15,\n",
" \u0027接到\u0027: 923,\n",
" \u0027机动车\u0027: 427,\n",
" \u0027危险\u0027: 947,\n",
" \u0027警情\u0027: 34,\n",
" \u0027随后\u0027: 2399,\n",
" \u0027骑着\u0027: 105,\n",
" \u0027铁骑\u0027: 40,\n",
" \u0027沿路\u0027: 20,\n",
" \u0027寻找\u0027: 1402,\n",
" \u0027大概\u0027: 342,\n",
" \u0027花\u0027: 1232,\n",
" \u0027十多分钟\u0027: 14,\n",
" \u0027大道\u0027: 729,\n",
" \u0027出口\u0027: 2200,\n",
" \u0027往\u0027: 508,\n",
" \u0027方向\u0027: 2429,\n",
" \u0027逆行\u0027: 23,\n",
" \u0027辅道\u0027: 5,\n",
" \u0027该\u0027: 9781,\n",
" \u0027身上\u0027: 963,\n",
" \u0027一丝不挂\u0027: 4,\n",
" \u0027地逆\u0027: 2,\n",
" \u0027车流\u0027: 64,\n",
" \u0027而行\u0027: 125,\n",
" \u0027走时\u0027: 10,\n",
" \u0027停\u0027: 457,\n",
" \u0027坐\u0027: 533,\n",
" \u0027躺\u0027: 292,\n",
" \u0027险象环生\u0027: 8,\n",
" \u0027刘青停\u0027: 2,\n",
" \u0027好\u0027: 11871,\n",
" \u0027另外\u0027: 2021,\n",
" \u0027一名\u0027: 8107,\n",
" \u0027巡防\u0027: 21,\n",
" \u0027员\u0027: 899,\n",
" \u0027追\u0027: 228,\n",
" \u0027上去\u0027: 131,\n",
" \u0027情绪\u0027: 913,\n",
" \u0027很\u0027: 9207,\n",
" \u0027低落\u0027: 24,\n",
" \u0027话\u0027: 791,\n",
" \u0027不\u0027: 28419,\n",
" \u0027多\u0027: 18153,\n",
" \u0027尝试\u0027: 988,\n",
" \u0027交流\u0027: 5354,\n",
" \u0027离开\u0027: 1486,\n",
" \u0027可\u0027: 11077,\n",
" \u0027愿意\u0027: 1350,\n",
" \u0027接受\u0027: 5826,\n",
" \u0027继续\u0027: 6952,\n",
" \u0027缓慢\u0027: 315,\n",
" \u0027地往\u0027: 8,\n",
" \u0027快速路\u0027: 60,\n",
" \u0027主干道\u0027: 56,\n",
" \u0027走\u0027: 4719,\n",
" \u0027此时\u0027: 448,\n",
" \u0027路边\u0027: 252,\n",
" \u0027聚集\u0027: 726,\n",
" \u0027市民\u0027: 3429,\n",
" \u0027围观\u0027: 132,\n",
" \u0027为了\u0027: 4643,\n",
" \u0027刺激\u0027: 524,\n",
" \u0027一边\u0027: 976,\n",
" \u0027盯\u0027: 131,\n",
" \u0027着\u0027: 13980,\n",
" \u0027驱赶\u0027: 42,\n",
" \u0027群众\u0027: 5297,\n",
" \u0027从\u0027: 29697,\n",
" \u0027警方\u0027: 4265,\n",
" \u0027提供\u0027: 12182,\n",
" \u0027一份\u0027: 1888,\n",
" \u0027视频\u0027: 2929,\n",
" \u0027了解\u0027: 7623,\n",
" \u0027到\u0027: 30452,\n",
" \u002725\u0027: 6884,\n",
" \u0027出现\u0027: 7608,\n",
" \u0027坂雪岗\u0027: 4,\n",
" \u0027监控\u0027: 945,\n",
" \u0027穿着\u0027: 330,\n",
" \u0027白色\u0027: 474,\n",
" \u0027内裤\u0027: 24,\n",
" \u0027沿着\u0027: 382,\n",
" \u0027当时\u0027: 3175,\n",
" \u0027正值\u0027: 417,\n",
" \u0027上班\u0027: 367,\n",
" \u0027高峰期\u0027: 174,\n",
" \u0027十字路口\u0027: 80,\n",
" \u0027排起\u0027: 33,\n",
" \u0027长队\u0027: 74,\n",
" \u0027当\u0027: 3397,\n",
" \u0027路上\u0027: 902,\n",
" \u0027纷纷\u0027: 1366,\n",
" \u0027驻足\u0027: 146,\n",
" \u0027观望\u0027: 271,\n",
" \u0027不少\u0027: 4548,\n",
" \u0027车辆\u0027: 2199,\n",
" \u0027放慢\u0027: 41,\n",
" \u0027速度\u0027: 1784,\n",
" \u0027但\u0027: 23362,\n",
" \u0027停下\u0027: 76,\n",
" \u0027脚步\u0027: 325,\n",
" \u0027依然\u0027: 2130,\n",
" \u0027行进\u0027: 261,\n",
" \u0027中间\u0027: 441,\n",
" \u0027一辆\u0027: 1276,\n",
" \u0027货车\u0027: 522,\n",
" \u0027挡住\u0027: 72,\n",
" \u0027镜头\u0027: 367,\n",
" \u0027但是\u0027: 3871,\n",
" \u0027再次出现\u0027: 54,\n",
" \u0027没\u0027: 2591,\n",
" \u0027穿\u0027: 742,\n",
" \u0027全身\u0027: 134,\n",
" \u0027裸露\u0027: 113,\n",
" \u0027朝着\u0027: 233,\n",
" \u0027周围\u0027: 641,\n",
" \u0027没有\u0027: 13997,\n",
" \u0027人\u0027: 30582,\n",
" \u0027尾随\u0027: 34,\n",
" \u0027或者\u0027: 3079,\n",
" \u0027上前\u0027: 134,\n",
" \u0027劝止\u0027: 2,\n",
" \u0027大清早\u0027: 8,\n",
" \u0027看到\u0027: 4399,\n",
" \u0027这样\u0027: 5822,\n",
" \u0027情况\u0027: 9444,\n",
" \u0027恐怕\u0027: 270,\n",
" \u0027大家\u0027: 3297,\n",
" \u0027办法\u0027: 1838,\n",
" \u0027淡定\u0027: 55,\n",
" \u0027面对\u0027: 2432,\n",
" \u0027这一\u0027: 5346,\n",
" \u0027表示\u0027: 22175,\n",
" \u0027根本\u0027: 977,\n",
" \u0027不敢\u0027: 478,\n",
" \u0027看\u0027: 5723,\n",
" \u0027心里\u0027: 643,\n",
" \u0027挺\u0027: 446,\n",
" \u0027别扭\u0027: 16,\n",
" \u0027感觉\u0027: 1558,\n",
" \u0027尴尬\u0027: 286,\n",
" \u0027跟随\u0027: 440,\n",
" \u0027作出\u0027: 2602,\n",
" \u0027让\u0027: 18757,\n",
" \u0027意想不到\u0027: 53,\n",
" \u0027举动\u0027: 265,\n",
" \u0027突然\u0027: 1034,\n",
" \u0027靠近\u0027: 342,\n",
" \u0027护栏\u0027: 80,\n",
" \u0027上面\u0027: 362,\n",
" \u0027跳下去\u0027: 10,\n",
" \u0027赶忙\u0027: 19,\n",
" \u0027冲上去\u0027: 21,\n",
" \u0027拉住\u0027: 4,\n",
" \u0027手\u0027: 920,\n",
" \u0027控制\u0027: 2707,\n",
" \u0027住\u0027: 1617,\n",
" \u0027远离\u0027: 309,\n",
" \u0027碍于\u0027: 21,\n",
" \u0027穿衣服\u0027: 18,\n",
" \u0027刘青递\u0027: 2,\n",
" \u0027衣服\u0027: 397,\n",
" \u0027把\u0027: 11853,\n",
" \u0027扔\u0027: 189,\n",
" \u0027排水沟\u0027: 22,\n",
" \u0027里\u0027: 10077,\n",
" \u0027往前走\u0027: 41,\n",
" \u0027只能\u0027: 1621,\n",
" \u0027紧紧\u0027: 183,\n",
" \u0027拉\u0027: 1601,\n",
" \u0027一只\u0027: 1350,\n",
" \u0027跟\u0027: 2058,\n",
" \u0027后面\u0027: 329,\n",
" \u0027一路上\u0027: 96,\n",
" \u0027耐心\u0027: 404,\n",
" \u0027开导\u0027: 21,\n",
" \u0027安慰\u0027: 129,\n",
" \u0027听到\u0027: 603,\n",
" \u0027不断\u0027: 6213,\n",
" \u0027重复\u0027: 372,\n",
" \u0027一句\u0027: 558,\n",
" \u0027要是\u0027: 179,\n",
" \u0027你\u0027: 6959,\n",
" \u0027遭遇\u0027: 1703,\n",
" \u0027我\u0027: 21713,\n",
" \u0027事\u0027: 2098,\n",
" \u0027会\u0027: 17310,\n",
" \u0027不时\u0027: 309,\n",
" \u0027试图\u0027: 824,\n",
" \u0027挣脱\u0027: 25,\n",
" \u0027手要\u0027: 8,\n",
" \u0027冲向\u0027: 99,\n",
" \u0027往下跳\u0027: 4,\n",
" \u0027就\u0027: 26690,\n",
" \u0027牵\u0027: 74,\n",
" \u0027天\u0027: 3329,\n",
" \u0027下起\u0027: 4,\n",
" \u0027大暴雨\u0027: 172,\n",
" \u0027雨大\u0027: 2,\n",
" \u0027连\u0027: 1380,\n",
" \u0027眼睛\u0027: 460,\n",
" \u0027睁不开\u0027: 5,\n",
" \u0027说\u0027: 40082,\n",
" \u0027瞬间\u0027: 568,\n",
" \u0027雨\u0027: 365,\n",
" \u0027透\u0027: 58,\n",
" \u0027帮助\u0027: 5162,\n",
" \u0027冒\u0027: 175,\n",
" \u0027大雨\u0027: 255,\n",
" \u0027四十分钟\u0027: 4,\n",
" \u0027吧\u0027: 1250,\n",
" \u0027来说\u0027: 2870,\n",
" \u0027想\u0027: 3717,\n",
" \u0027回家\u0027: 768,\n",
" \u0027然后\u0027: 1218,\n",
" \u0027递过来\u0027: 11,\n",
" \u0027微博上\u0027: 106,\n",
" \u0027照片\u0027: 52271,\n",
" \u0027披着\u0027: 2,\n",
" \u0027小心翼翼\u0027: 87,\n",
" \u0027旁边\u0027: 305,\n",
" \u0027场景\u0027: 754,\n",
" \u0027南平\u0027: 67,\n",
" \u0027下来\u0027: 843,\n",
" \u0027带到\u0027: 258,\n",
" \u0027派出所\u0027: 670,\n",
" \u0027那\u0027: 2590,\n",
" \u0027姑娘\u0027: 462,\n",
" \u0027什么样\u0027: 410,\n",
" \u0027事情\u0027: 1461,\n",
" \u0027才\u0027: 3918,\n",
" \u0027据\u0027: 10742,\n",
" \u0027透露\u0027: 1575,\n",
" \u0027姓\u0027: 65,\n",
" \u0027陈\u0027: 1073,\n",
" \u0027系\u0027: 660,\n",
" \u0027湖北\u0027: 2478,\n",
" \u0027家属\u0027: 735,\n",
" \u0027反映\u0027: 1547,\n",
" \u0027其有\u0027: 10,\n",
" \u0027精神病\u0027: 53,\n",
" \u0027史\u0027: 436,\n",
" \u0027三天\u0027: 431,\n",
" \u0027前\u0027: 13660,\n",
" \u0027陈某\u0027: 291,\n",
" \u0027老家\u0027: 228,\n",
" \u0027来\u0027: 10977,\n",
" \u0027受挫\u0027: 60,\n",
" \u0027导致\u0027: 3834,\n",
" \u0027异常\u0027: 422,\n",
" \u0027遂\u0027: 155,\n",
" \u0027产生\u0027: 3063,\n",
" \u0027念头\u0027: 97,\n",
" \u0027送往\u0027: 416,\n",
" \u0027某\u0027: 1584,\n",
" \u0027医院\u0027: 4146,\n",
" \u0027治疗\u0027: 2117,\n",
" \u0027大大\u0027: 395,\n",
" \u0027君\u0027: 159,\n",
" \u0027希望\u0027: 7863,\n",
" \u0027早点\u0027: 41,\n",
" \u0027康复\u0027: 586,\n",
" \u0027其实\u0027: 1756,\n",
" \u0027真爱\u0027: 14,\n",
" \u0027到来\u0027: 1088,\n",
" \u0027存在\u0027: 5138,\n",
" \u0027年龄\u0027: 910,\n",
" \u0027限制\u0027: 1628,\n",
" \u0027你们\u0027: 733,\n",
" \u0027因\u0027: 4901,\n",
" \u0027善良\u0027: 84,\n",
" \u0027原因\u0027: 3562,\n",
" \u0027一众\u0027: 39,\n",
" \u0027暖\u0027: 226,\n",
" \u0027男点\u0027: 2,\n",
" \u0027ZAN\u0027: 2,\n",
" \u0027弓常\u0027: 2,\n",
" \u0027yan\u0027: 3,\n",
" \u0027桦\u0027: 7,\n",
" \u0027问\u0027: 1095,\n",
" \u0027这个\u0027: 8688,\n",
" \u0027哥哥\u0027: 300,\n",
" \u0027女票\u0027: 2,\n",
" \u0027吗\u0027: 1784,\n",
" \u0027原谅\u0027: 24,\n",
" \u0027一辈子\u0027: 241,\n",
" \u0027浪荡\u0027: 2,\n",
" \u0027不羁\u0027: 16,\n",
" \u0027爱\u0027: 1501,\n",
" \u0027萨摩耶\u0027: 2,\n",
" \u0027过不去\u0027: 16,\n",
" \u0027嘛\u0027: 94,\n",
" \u0027想想\u0027: 81,\n",
" \u0027自己\u0027: 14006,\n",
" \u0027家人\u0027: 1291,\n",
" \u0027同时\u0027: 10798,\n",
" \u0027感谢\u0027: 671,\n",
" \u0027蜀黍\u0027: 12,\n",
" \u0027火心\u0027: 2,\n",
" \u0027聆听\u0027: 198,\n",
" \u0027心灵\u0027: 226,\n",
" \u0027点赞\u0027: 354,\n",
" \u0027中華云盾\u0027: 2,\n",
" \u0027警察\u0027: 1769,\n",
" \u0027就是\u0027: 8003,\n",
" \u0027需时\u0027: 3,\n",
" \u0027申出\u0027: 2,\n",
" \u0027援手\u0027: 49,\n",
" \u0027Tomchlee\u0027: 2,\n",
" \u0027帅\u0027: 27,\n",
" \u0027\u0027: 6638,\n",
" \u0027SJ\u0027: 2,\n",
" \u0027李赫海\u0027: 2,\n",
" \u0027i\u0027: 48,\n",
" \u0027木有\u0027: 4,\n",
" \u0027男子\u0027: 3965,\n",
" \u0027迷奸\u0027: 1,\n",
" \u0027拍\u0027: 742,\n",
" \u0027418\u0027: 15,\n",
" \u0027女方\u0027: 36,\n",
" \u002720\u0027: 11010,\n",
" \u002750\u0027: 2594,\n",
" \u0027号\u0027: 6633,\n",
" \u0027上午\u0027: 2172,\n",
" \u0027淮安市\u0027: 71,\n",
" \u0027涟水县\u0027: 2,\n",
" \u0027公安局\u0027: 835,\n",
" \u0027刑警大队\u0027: 17,\n",
" \u0027一个\u0027: 21937,\n",
" \u0027奇怪\u0027: 106,\n",
" \u0027报警\u0027: 489,\n",
" \u0027电话\u0027: 1365,\n",
" \u0027言语\u0027: 85,\n",
" \u0027不清\u0027: 61,\n",
" \u0027声称\u0027: 322,\n",
" \u0027遭到\u0027: 832,\n",
" \u0027侵害\u0027: 323,\n",
" \u0027几个\u0027: 1330,\n",
" \u0027关键词\u0027: 1433,\n",
" \u0027令\u0027: 1318,\n",
" \u0027民警\u0027: 1427,\n",
" \u0027紧张\u0027: 1123,\n",
" \u0027起来\u0027: 2656,\n",
" \u0027受到\u0027: 3667,\n",
" \u0027A股\u0027: 1973,\n",
" \u0027纳入\u0027: 2269,\n",
" \u0027MSCI\u0027: 1292,\n",
" \u0027指数\u0027: 3957,\n",
" \u0027利好\u0027: 460,\n",
" \u0027消息\u0027: 3605,\n",
" \u0027市场\u0027: 19029,\n",
" \u0027周三\u0027: 197,\n",
" \u0027再度\u0027: 749,\n",
" \u0027上演\u0027: 1330,\n",
" \u0027龙马\u0027: 23,\n",
" \u0027行情\u0027: 906,\n",
" \u0027周四\u0027: 145,\n",
" \u0027金融股\u0027: 141,\n",
" \u0027白马股\u0027: 104,\n",
" \u0027表现\u0027: 2997,\n",
" \u0027喜人\u0027: 50,\n",
" \u0027尾盘\u0027: 240,\n",
" \u0027跳水\u0027: 638,\n",
" \u0027之后\u0027: 4770,\n",
" \u0027仅\u0027: 3079,\n",
" \u0027金融\u0027: 5616,\n",
" \u0027板块\u0027: 1378,\n",
" \u0027仍\u0027: 5630,\n",
" \u0027维系\u0027: 46,\n",
" \u0027红盘\u0027: 23,\n",
" \u0027状态\u0027: 1956,\n",
" \u0027分析\u0027: 3961,\n",
" \u0027人士\u0027: 3337,\n",
" \u0027认为\u0027: 11639,\n",
" \u0027受益\u0027: 746,\n",
" \u0027于\u0027: 17298,\n",
" \u0027低\u0027: 2236,\n",
" \u0027估值\u0027: 529,\n",
" \u0027重获\u0027: 92,\n",
" \u0027资金\u0027: 6566,\n",
" \u0027青睐\u0027: 428,\n",
" \u0027存量\u0027: 366,\n",
" \u0027博弈\u0027: 248,\n",
" \u0027格局\u0027: 1170,\n",
" \u0027下\u0027: 18128,\n",
" \u0027风格\u0027: 817,\n",
" \u0027交替\u0027: 116,\n",
" \u0027震荡\u0027: 698,\n",
" \u0027料\u0027: 122,\n",
" \u0027延续\u0027: 1212,\n",
" \u0027流动性\u0027: 989,\n",
" \u0027改善\u0027: 2716,\n",
" \u0027经济\u0027: 22208,\n",
" \u0027悲观\u0027: 86,\n",
" \u0027预期\u0027: 2482,\n",
" \u0027修正\u0027: 134,\n",
" \u0027有助于\u0027: 1113,\n",
" \u0027支撑\u0027: 1950,\n",
" \u0027继而\u0027: 89,\n",
" \u0027大盘\u0027: 374,\n",
" \u0027逐步\u0027: 1834,\n",
" \u0027向\u0027: 15203,\n",
" \u0027九\u0027: 240,\n",
" \u0027再现\u0027: 372,\n",
" \u0027未能\u0027: 1010,\n",
" \u0027上行\u0027: 417,\n",
" \u0027态势\u0027: 1185,\n",
" \u0027两市\u0027: 518,\n",
" \u0027成交\u0027: 1469,\n",
" \u0027小幅\u0027: 488,\n",
" \u0027放量\u0027: 143,\n",
" \u002729\u0027: 4886,\n",
" \u0027中信\u0027: 140,\n",
" \u0027一级\u0027: 557,\n",
" \u0027行业\u0027: 6515,\n",
" \u0027收盘\u0027: 661,\n",
" \u0027银行\u0027: 5991,\n",
" \u0027非银行\u0027: 46,\n",
" \u0027两个\u0027: 4158,\n",
" \u0027收红\u0027: 39,\n",
" \u0027分别\u0027: 5488,\n",
" \u0027上涨\u0027: 3992,\n",
" \u00271.80%\u0027: 6,\n",
" \u00270.20%\u0027: 30,\n",
" \u0027二级\u0027: 432,\n",
" \u0027来看\u0027: 2608,\n",
" \u0027股份制\u0027: 119,\n",
" \u0027城商行\u0027: 53,\n",
" \u0027涨幅\u0027: 2242,\n",
" \u0027最高\u0027: 3452,\n",
" \u0027达到\u0027: 5390,\n",
" \u00272.22%\u0027: 2,\n",
" \u0027国有银行\u0027: 37,\n",
" \u00270.82%\u0027: 6,\n",
" \u0027信托\u0027: 384,\n",
" \u0027及其\u0027: 1807,\n",
" \u00270.64%\u0027: 10,\n",
" \u0027保险\u0027: 1528,\n",
" \u00270.34%\u0027: 16,\n",
" \u0027证券\u0027: 1486,\n",
" \u00270.06%\u0027: 19,\n",
" \u0027成分股\u0027: 180,\n",
" \u0027共有\u0027: 2059,\n",
" \u002721\u0027: 7406,\n",
" \u0027其中\u0027: 10635,\n",
" \u0027招商银行\u0027: 94,\n",
" \u0027最大\u0027: 6078,\n",
" \u00276.66%\u0027: 9,\n",
" \u0027贵阳\u0027: 861,\n",
" \u00273.65%\u0027: 8,\n",
" \u0027上海银行\u0027: 29,\n",
" \u0027华夏银行\u0027: 46,\n",
" \u0027浦发银行\u0027: 41,\n",
" \u0027兴业银行\u0027: 67,\n",
" \u0027超过\u0027: 7201,\n",
" \u00271.50%\u0027: 7,\n",
" \u0027共\u0027: 4581,\n",
" \u002717\u0027: 7486,\n",
" \u0027个股\u0027: 827,\n",
" \u0027安信\u0027: 49,\n",
" \u0027中国\u0027: 71181,\n",
" \u0027太保\u0027: 30,\n",
" \u0027居前\u0027: 316,\n",
" \u0027两名\u0027: 1573,\n",
" \u00274.57%\u0027: 3,\n",
" \u00273.04%\u0027: 4,\n",
" \u0027西水股份\u0027: 4,\n",
" \u0027华安\u0027: 41,\n",
" \u0027人寿\u0027: 118,\n",
" \u0027新华\u0027: 6665,\n",
" \u00272%\u0027: 268,\n",
" \u0027相对而言\u0027: 54,\n",
" \u0027券商\u0027: 587,\n",
" \u0027股多\u0027: 1,\n",
" \u0027下跌\u0027: 2849,\n",
" \u0027近期\u0027: 2594,\n",
" \u0027对\u0027: 50582,\n",
" \u0027消息面\u0027: 47,\n",
" \u0027宣布\u0027: 5117,\n",
" \u00272018\u0027: 1641,\n",
" \u0027年\u0027: 123532,\n",
" \u0027新兴\u0027: 1203,\n",
" \u0027占\u0027: 4953,\n",
" \u0027群体\u0027: 1186,\n",
" \u0027国金\u0027: 24,\n",
" \u0027李立峰\u0027: 7,\n",
" \u0027团队\u0027: 4258,\n",
" \u0027指出\u0027: 5061,\n",
" \u0027最新\u0027: 2318,\n",
" \u0027包含\u0027: 577,\n",
" \u0027222\u0027: 110,\n",
" \u0027剔除\u0027: 105,\n",
" \u0027中等\u0027: 130,\n",
" \u0027市值\u0027: 498,\n",
" \u0027非\u0027: 2844,\n",
" \u0027互联互通\u0027: 1137,\n",
" \u0027交易\u0027: 3728,\n",
" \u0027股票\u0027: 1227,\n",
" \u0027以及\u0027: 10208,\n",
" \u0027停牌\u0027: 262,\n",
" \u0027标的\u0027: 430,\n",
" \u0027由于\u0027: 5419,\n",
" \u0027很多\u0027: 5800,\n",
" \u0027A\u0027: 1026,\n",
" \u0027H股\u0027: 52,\n",
" \u0027EM\u0027: 6,\n",
" \u0027权重\u0027: 223,\n",
" \u0027由\u0027: 13081,\n",
" \u00270.5%\u0027: 120,\n",
" \u0027上升\u0027: 2114,\n",
" \u00270.73%\u0027: 56,\n",
" \u002740.11%\u0027: 1,\n",
" \u0027泛\u0027: 83,\n",
" \u0027消费\u0027: 3114,\n",
" \u0027次之\u0027: 17,\n",
" \u002724.26%\u0027: 1,\n",
" \u0027涵盖\u0027: 698,\n",
" \u0027大部分\u0027: 1275,\n",
" \u0027权重股\u0027: 80,\n",
" \u0027动态\u0027: 901,\n",
" \u0027加入\u0027: 2036,\n",
" \u0027指\u0027: 1521,\n",
" \u0027比高\u0027: 52,\n",
" \u0027金融公司\u0027: 45,\n",
" \u0027增加\u0027: 5500,\n",
" \u0027近一半\u0027: 77,\n",
" \u0027其他\u0027: 6419,\n",
" \u0027稀释\u0027: 38,\n",
" \u0027尽管\u0027: 2086,\n",
" \u0027事件\u0027: 5187,\n",
" \u0027短期\u0027: 1066,\n",
" \u0027有所\u0027: 1601,\n",
" \u0027提振\u0027: 342,\n",
" \u0027中长期\u0027: 347,\n",
" \u0027海外\u0027: 2835,\n",
" \u0027增量\u0027: 349,\n",
" \u0027升温\u0027: 324,\n",
" \u0027短期内\u0027: 264,\n",
" \u0027尚\u0027: 546,\n",
" \u0027不能\u0027: 4328,\n",
" \u0027有效\u0027: 4002,\n",
" \u0027放大\u0027: 213,\n",
" \u0027独\u0027: 64,\n",
" \u0027乐乐\u0027: 15,\n",
" \u0027情景\u0027: 211,\n",
" \u0027难以\u0027: 1256,\n",
" \u0027持续\u0027: 6932,\n",
" \u0027难\u0027: 1358,\n",
" \u0027改变\u0027: 2763,\n",
" \u0027光大\u0027: 51,\n",
" \u0027并未\u0027: 1157,\n",
" \u0027引起\u0027: 1395,\n",
" \u0027太大\u0027: 90,\n",
" \u0027热情\u0027: 877,\n",
" \u0027成交量\u0027: 528,\n",
" \u0027较为\u0027: 979,\n",
" \u0027平淡\u0027: 71,\n",
" \u0027较大\u0027: 1592,\n",
" \u0027变化\u0027: 2960,\n",
" \u0027成长\u0027: 1718,\n",
" \u0027股\u0027: 1011,\n",
" \u0027题材股\u0027: 50,\n",
" \u0027全天\u0027: 301,\n",
" \u0027低迷\u0027: 397,\n",
" \u0027表明\u0027: 1385,\n",
" \u0027很少\u0027: 493,\n",
" \u0027不同\u0027: 5431,\n",
" \u0027之间\u0027: 3805,\n",
" \u0027腾挪\u0027: 23,\n",
" \u0027跷跷板\u0027: 19,\n",
" \u0027使得\u0027: 1099,\n",
" \u0027难有\u0027: 51,\n",
" \u0027突破\u0027: 3090,\n",
" \u0027中期\u0027: 399,\n",
" \u0027依旧\u0027: 629,\n",
" \u0027偏空\u0027: 12,\n",
" \u0027维持\u0027: 1185,\n",
" \u0027虽然\u0027: 4223,\n",
" \u0027至今\u0027: 1600,\n",
" \u0027夏普\u0027: 133,\n",
" \u0027智能手机\u0027: 296,\n",
" \u0027无法\u0027: 2745,\n",
" \u0027排得\u0027: 2,\n",
" \u0027完全\u0027: 2445,\n",
" \u0027没落\u0027: 8,\n",
" \u00272013\u0027: 1557,\n",
" \u0027退出\u0027: 1574,\n",
" \u00273\u0027: 30625,\n",
" \u0027月份\u0027: 3190,\n",
" \u0027官方\u0027: 1207,\n",
" \u0027回归\u0027: 952,\n",
" \u0027预示\u0027: 133,\n",
" \u0027很快\u0027: 969,\n",
" \u0027新机\u0027: 27,\n",
" \u0027登场\u0027: 236,\n",
" \u0027第一款\u0027: 48,\n",
" \u0027登陆\u0027: 389,\n",
" \u0027又\u0027: 8702,\n",
" \u0027怎么样\u0027: 131,\n",
" \u0027近日\u0027: 4490,\n",
" \u0027型号\u0027: 222,\n",
" \u0027FS8016\u0027: 1,\n",
" \u0027神秘\u0027: 390,\n",
" \u0027悄然\u0027: 283,\n",
" \u0027GeekBench\u0027: 1,\n",
" \u0027分库\u0027: 16,\n",
" \u0027相关\u0027: 11730,\n",
" \u0027机子\u0027: 5,\n",
" \u0027并非\u0027: 1034,\n",
" \u0027定位\u0027: 1107,\n",
" \u0027所\u0027: 6083,\n",
" \u0027660\u0027: 21,\n",
" \u0027配备\u0027: 486,\n",
" \u00274GB\u0027: 14,\n",
" \u0027内存\u0027: 75,\n",
" \u0027最受\u0027: 187,\n",
" \u0027瞩目\u0027: 124,\n",
" \u0027芯片\u0027: 569,\n",
" \u0027之一\u0027: 5815,\n",
" \u0027采用\u0027: 1965,\n",
" \u002714\u0027: 7781,\n",
" \u0027纳米\u0027: 145,\n",
" \u0027工艺\u0027: 765,\n",
" \u0027八个\u0027: 106,\n",
" \u0027Kryo\u0027: 1,\n",
" \u0027260\u0027: 95,\n",
" \u0027设计\u0027: 5724,\n",
" \u0027Adreno\u0027: 1,\n",
" \u0027512\u0027: 14,\n",
" \u0027X12\u0027: 1,\n",
" \u0027LTE\u0027: 26,\n",
" \u0027调制解调器\u0027: 7,\n",
" \u0027当前\u0027: 3000,\n",
" \u0027市面上\u0027: 85,\n",
" \u0027只有\u0027: 3515,\n",
" \u0027上市\u0027: 1794,\n",
" \u0027销售\u0027: 3842,\n",
" \u0027OPPO\u0027: 49,\n",
" \u0027R11\u0027: 8,\n",
" \u0027核新能\u0027: 1,\n",
" \u0027820\u0027: 22,\n",
" \u0027强\u0027: 2276,\n",
" \u0027单核\u0027: 6,\n",
" \u0027改进\u0027: 609,\n",
" \u0027明显\u0027: 3638,\n",
" \u0027所以\u0027: 2380,\n",
" \u0027放在\u0027: 740,\n",
" \u0027变成\u0027: 1264,\n",
" \u0027高端\u0027: 1602,\n",
" \u0027机\u0027: 562,\n",
" \u0027不过\u0027: 4040,\n",
" \u0027签署\u0027: 2479,\n",
" \u0027排他性\u0027: 19,\n",
" \u0027协议\u0027: 4190,\n",
" \u0027独占\u0027: 27,\n",
" ...})"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tokener_counter"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## 使用TextRank进行自动摘要提取"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"#### Task 1 使用neteworkx包建立一个随机图对该图进行PageRank分析\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hints: 代码可以在Github Group 中看到"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"import networkx\n",
"import random"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"def genrate_name(length\u003d3): return \u0027\u0027.join(chr(random.randint(65, 73)) for _ in range(length))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"\u0027ADD\u0027"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"genrate_name()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"graph \u003d {\n",
" \u0027Yao\u0027: [\u0027Guo\u0027, \u0027Wang\u0027, \u0027Tian\u0027, \u0027Tim\u0027] + [genrate_name() for _ in range(6)], \n",
" \u0027Guo\u0027: [\u0027Li\u0027] + [genrate_name() for _ in range(5)], \n",
" \u0027Wang\u0027: [\u0027Li_2\u0027] + [genrate_name() for _ in range(5)], \n",
" \u0027Li\u0027: [genrate_name() for _ in range(3)], \n",
" \u0027Li_2\u0027: [genrate_name() for _ in range(1)]\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"{\u0027Yao\u0027: [\u0027Guo\u0027,\n",
" \u0027Wang\u0027,\n",
" \u0027Tian\u0027,\n",
" \u0027Tim\u0027,\n",
" \u0027FEA\u0027,\n",
" \u0027EEI\u0027,\n",
" \u0027BDB\u0027,\n",
" \u0027GCI\u0027,\n",
" \u0027DGF\u0027,\n",
" \u0027CDH\u0027],\n",
" \u0027Guo\u0027: [\u0027Li\u0027, \u0027GHG\u0027, \u0027GGA\u0027, \u0027DIE\u0027, \u0027FDC\u0027, \u0027EFF\u0027],\n",
" \u0027Wang\u0027: [\u0027Li_2\u0027, \u0027GAI\u0027, \u0027HGE\u0027, \u0027EII\u0027, \u0027AEB\u0027, \u0027CEE\u0027],\n",
" \u0027Li\u0027: [\u0027IBA\u0027, \u0027CDF\u0027, \u0027CEB\u0027],\n",
" \u0027Li_2\u0027: [\u0027HGA\u0027]}"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"graph"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"social_network \u003d networkx.graph.Graph()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"help(social_network.add_edges_from)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"for vertex, edge in graph.items():\n",
" for v in edge:\n",
" social_network.add_edges_from([(vertex, v)])"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"# jupter notebook中需要添加这行代码才能显示图\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\networkx\\drawing\\nx_pylab.py:579: MatplotlibDeprecationWarning: \n",
"The iterable function was deprecated in Matplotlib 3.1 and will be removed in 3.3. Use np.iterable instead.\n",
" if not cb.iterable(width):\n"
]
},
{
"data": {
"image/png": "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\u003d\n",
"text/plain": [
"\u003cFigure size 432x288 with 1 Axes\u003e"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"networkx.draw_networkx(social_network)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"ranking_result \u003d networkx.pagerank(social_network)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[(\u0027Yao\u0027, 0.1747698412634544),\n",
" (\u0027Wang\u0027, 0.12616099221117885),\n",
" (\u0027Guo\u0027, 0.12434209154337311),\n",
" (\u0027Li\u0027, 0.07600909782512963),\n",
" (\u0027Li_2\u0027, 0.04007465697366682),\n",
" (\u0027HGA\u0027, 0.022586982681035123),\n",
" (\u0027IBA\u0027, 0.021706946858994478),\n",
" (\u0027CDF\u0027, 0.021706946858994478),\n",
" (\u0027CEB\u0027, 0.021706946858994478),\n",
" (\u0027GAI\u0027, 0.020875426652805028),\n",
" (\u0027HGE\u0027, 0.020875426652805028),\n",
" (\u0027EII\u0027, 0.020875426652805028),\n",
" (\u0027AEB\u0027, 0.020875426652805028),\n",
" (\u0027CEE\u0027, 0.020875426652805028),\n",
" (\u0027GHG\u0027, 0.020654738077342236),\n",
" (\u0027GGA\u0027, 0.020654738077342236),\n",
" (\u0027DIE\u0027, 0.020654738077342236),\n",
" (\u0027FDC\u0027, 0.020654738077342236),\n",
" (\u0027EFF\u0027, 0.020654738077342236),\n",
" (\u0027Tian\u0027, 0.020410584159305276),\n",
" (\u0027Tim\u0027, 0.020410584159305276),\n",
" (\u0027FEA\u0027, 0.020410584159305276),\n",
" (\u0027EEI\u0027, 0.020410584159305276),\n",
" (\u0027BDB\u0027, 0.020410584159305276),\n",
" (\u0027GCI\u0027, 0.020410584159305276),\n",
" (\u0027DGF\u0027, 0.020410584159305276),\n",
" (\u0027CDH\u0027, 0.020410584159305276)]"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(ranking_result.items(), key\u003dlambda x: x[1], reverse\u003dTrue)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"{\u0027Yao\u0027: 0.1747698412634544,\n",
" \u0027Guo\u0027: 0.12434209154337311,\n",
" \u0027Wang\u0027: 0.12616099221117885,\n",
" \u0027Tian\u0027: 0.020410584159305276,\n",
" \u0027Tim\u0027: 0.020410584159305276,\n",
" \u0027FEA\u0027: 0.020410584159305276,\n",
" \u0027EEI\u0027: 0.020410584159305276,\n",
" \u0027BDB\u0027: 0.020410584159305276,\n",
" \u0027GCI\u0027: 0.020410584159305276,\n",
" \u0027DGF\u0027: 0.020410584159305276,\n",
" \u0027CDH\u0027: 0.020410584159305276,\n",
" \u0027Li\u0027: 0.07600909782512963,\n",
" \u0027GHG\u0027: 0.020654738077342236,\n",
" \u0027GGA\u0027: 0.020654738077342236,\n",
" \u0027DIE\u0027: 0.020654738077342236,\n",
" \u0027FDC\u0027: 0.020654738077342236,\n",
" \u0027EFF\u0027: 0.020654738077342236,\n",
" \u0027Li_2\u0027: 0.04007465697366682,\n",
" \u0027GAI\u0027: 0.020875426652805028,\n",
" \u0027HGE\u0027: 0.020875426652805028,\n",
" \u0027EII\u0027: 0.020875426652805028,\n",
" \u0027AEB\u0027: 0.020875426652805028,\n",
" \u0027CEE\u0027: 0.020875426652805028,\n",
" \u0027IBA\u0027: 0.021706946858994478,\n",
" \u0027CDF\u0027: 0.021706946858994478,\n",
" \u0027CEB\u0027: 0.021706946858994478,\n",
" \u0027HGA\u0027: 0.022586982681035123}"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"networkx.pagerank(social_network)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"#### Task 2 使用PageRank 对文本进行关联分析"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hints: 代码可以在Github Group 中看到"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/html": [
"\u003cdiv\u003e\n",
"\u003cstyle scoped\u003e\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"\u003c/style\u003e\n",
"\u003ctable border\u003d\"1\" class\u003d\"dataframe\"\u003e\n",
" \u003cthead\u003e\n",
" \u003ctr style\u003d\"text-align: right;\"\u003e\n",
" \u003cth\u003e\u003c/th\u003e\n",
" \u003cth\u003eUnnamed: 0\u003c/th\u003e\n",
" \u003cth\u003econtent\u003c/th\u003e\n",
" \u003cth\u003etokenized_content\u003c/th\u003e\n",
" \u003c/tr\u003e\n",
" \u003c/thead\u003e\n",
" \u003ctbody\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e0\u003c/td\u003e\n",
" \u003ctd\u003e0\u003c/td\u003e\n",
" \u003ctd\u003e此外自本周6月12日除小米手机6等15款机型外其余机型已暂停更新发布含开发版/...\u003c/td\u003e\n",
" \u003ctd\u003e此外 自 本周 6 月 12 日 除 小米 手机 6 等 15 款 机型...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e1\u003c/td\u003e\n",
" \u003ctd\u003e1\u003c/td\u003e\n",
" \u003ctd\u003e骁龙835作为唯一通过Windows 10桌面平台认证的ARM处理器高通强调不会因为只考...\u003c/td\u003e\n",
" \u003ctd\u003e骁龙 835 作为 唯一 通过 Windows 10 桌面 平台 认证 的 ARM 处理...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e2\u003c/td\u003e\n",
" \u003ctd\u003e2\u003c/td\u003e\n",
" \u003ctd\u003e此前的一加3T搭载的是3400mAh电池DashCharge快充规格为5V/4A。\\r\\n...\u003c/td\u003e\n",
" \u003ctd\u003e此前 的 一加 3T 搭载 的 是 3400mAh 电池 DashCharge 快充 规...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e3\u003c/td\u003e\n",
" \u003ctd\u003e3\u003c/td\u003e\n",
" \u003ctd\u003e这是6月18日在葡萄牙中部大佩德罗冈地区拍摄的被森林大火烧毁的汽车。新华社记者张立云摄\\r\\n\u003c/td\u003e\n",
" \u003ctd\u003e这是 6 月 18 日 在 葡萄牙 中部 大 佩德罗 冈 地区 拍摄 的 被 森林 大火 烧...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003ctr\u003e\n",
" \u003ctd\u003e4\u003c/td\u003e\n",
" \u003ctd\u003e4\u003c/td\u003e\n",
" \u003ctd\u003e原标题44岁女子跑深圳约会网友被拒暴雨中裸身奔走……\\r\\n@深圳交警微博称:昨日清...\u003c/td\u003e\n",
" \u003ctd\u003e 原 标题 44 岁 女子 跑 深圳 约会 网友 被 拒 暴雨 中 裸身 奔走 …...\u003c/td\u003e\n",
" \u003c/tr\u003e\n",
" \u003c/tbody\u003e\n",
"\u003c/table\u003e\n",
"\u003c/div\u003e"
],
"text/plain": [
" Unnamed: 0 content \\\n",
"0 0 此外自本周6月12日除小米手机6等15款机型外其余机型已暂停更新发布含开发版/... \n",
"1 1 骁龙835作为唯一通过Windows 10桌面平台认证的ARM处理器高通强调不会因为只考... \n",
"2 2 此前的一加3T搭载的是3400mAh电池DashCharge快充规格为5V/4A。\\r\\n... \n",
"3 3 这是6月18日在葡萄牙中部大佩德罗冈地区拍摄的被森林大火烧毁的汽车。新华社记者张立云摄\\r\\n \n",
"4 4 原标题44岁女子跑深圳约会网友被拒暴雨中裸身奔走……\\r\\n@深圳交警微博称:昨日清... \n",
"\n",
" tokenized_content \n",
"0 此外 自 本周 6 月 12 日 除 小米 手机 6 等 15 款 机型... \n",
"1 骁龙 835 作为 唯一 通过 Windows 10 桌面 平台 认证 的 ARM 处理... \n",
"2 此前 的 一加 3T 搭载 的 是 3400mAh 电池 DashCharge 快充 规... \n",
"3 这是 6 月 18 日 在 葡萄牙 中部 大 佩德罗 冈 地区 拍摄 的 被 森林 大火 烧... \n",
"4 原 标题 44 岁 女子 跑 深圳 约会 网友 被 拒 暴雨 中 裸身 奔走 …... "
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pure_content.head()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"lengthes_of_text \u003d map(len, pure_content[\u0027content\u0027].tolist())"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[177,\n",
" 329,\n",
" 216,\n",
" 45,\n",
" 1674,\n",
" 1056,\n",
" 657,\n",
" 4093,\n",
" 3665,\n",
" 755,\n",
" 169,\n",
" 1467,\n",
" 487,\n",
" 774,\n",
" 1137,\n",
" 331,\n",
" 293,\n",
" 495,\n",
" 289,\n",
" 1707]"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(lengthes_of_text)[:20]"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[\u0027c:\\\\python36\\\\lib\\\\site-packages\\\\networkx\u0027]"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"networkx.__path__"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"import matplotlib.font_manager as fm\n",
"fp1 \u003d fm.FontProperties(fname\u003d\"../data/SourceHanSerifSC-Regular.otf\")\n",
"# how to set chinese display: \n",
"# https://knowlab.wordpress.com/2016/05/25/networkx-%E7%B9%AA%E5%9C%96%E9%A1%AF%E7%A4%BA%E4%B8%AD%E6%96%87%E7%9A%84%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/\n",
"\n",
"def get_connect_graph_by_text_rank(tokenized_text: str, window\u003d3):\n",
" keywords_graph \u003d networkx.Graph()\n",
" tokeners \u003d tokenized_text.split()\n",
" for ii, t in enumerate(tokeners):\n",
" word_tuples \u003d [(tokeners[connect], t) \n",
" for connect in range(ii-window, ii+window+1) \n",
" if connect \u003e\u003d 0 and connect \u003c len(tokeners)]\n",
" keywords_graph.add_edges_from(word_tuples)\n",
"\n",
" return keywords_graph"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"first_content \u003d pure_content.iloc[1][\u0027tokenized_content\u0027]"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"first_content_continous \u003d pure_content.iloc[4][\u0027content\u0027]"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[\u0027原标题44岁女子跑深圳约会网友被拒暴雨中裸身奔走……\u0027,\n",
" \u0027@深圳交警微博称:昨日清晨交警发现有一女子赤裸上身,行走在南坪快速上,期间还起了轻生年头,一辅警发现后赶紧为其披上黄衣,并一路劝说她。\u0027,\n",
" \u0027那么事发时\u0027,\n",
" \u0027到底都发生了些什么呢\u0027,\n",
" \u0027南都记者带您一起还原现场\u0027,\n",
" \u0027南都记者在龙岗大队坂田中队见到了辅警刘青发现女生的辅警一位外表高大帅气说话略带些腼腆的90后青年。\u0027,\n",
" \u0027刘青介绍6月16日早上7时36分他正在环城南路附近值勤接到中队关于一位女子裸身进入机动车可能有危险的警情随后骑着小铁骑开始沿路寻找大概花了十多分钟在南坪大道坂田出口往龙岗方向的逆行辅道上发现该女子。\u0027,\n",
" \u0027女子身上一丝不挂地逆车流而行时走时停时坐时躺险象环生。刘青停好小铁骑和另外一名巡防员追了上去发现女子的情绪很低落话不多刘青尝试和女子交流劝说女子离开可女子并不愿意接受继续缓慢地往南坪快速路的主干道上走去。\u0027,\n",
" \u0027此时路边上已经聚集了很市民围观为了不刺激女子的情绪刘青和巡防员一边盯着女子一边驱赶着围观的群众。\u0027,\n",
" \u0027现场还原\u0027,\n",
" \u0027从警方提供的一份视频了解到16日早上7时25分女子出现在坂雪岗大道与环城南路的监控视频中此时女子还穿着白色的内裤正沿着坂雪岗大道往南坪快速的方向缓慢地走着。\u0027,\n",
" \u0027当时正值上班高峰期十字路口的车流已经排起了长队。当女子出现时路上的市民纷纷驻足观望不少车辆也放慢了速度但女子并不为市民观望停下脚步依然缓慢走着。当女子行进到十字路口中间时一辆大货车挡住了镜头但是当女子再次出现镜头时可以发现女子已经没穿内裤了全身裸露继续朝着南坪快速方向走去。记者发现视频中女子周围并没有人尾随或者上前劝止的市民。\u0027,\n",
" \u0027一大清早路上看到这样的情况\u0027,\n",
" \u0027恐怕大家都没办法淡定\u0027,\n",
" \u0027面对这一情况\u0027,\n",
" \u0027刘青表示“一开始根本不敢看她心里挺别扭感觉很尴尬”但当刘青跟随女子上了南坪快速路主干道时女子作出了让人意想不到的举动她突然靠近护栏要从上面跳下去刘青赶忙冲上去拉住了女子的手将其控制住并远离护栏。碍于女子没有穿衣服刘青递上衣服女子没接受还把衣服扔到排水沟里继续往前走没办法刘青只能紧紧拉着她的一只手跟在后面。\u0027,\n",
" \u0027刘青一路上耐心地开导安慰她但只听到她不断地重复着一句话“要是你也遭遇我的事你也会这样的”期间她还不时试图挣脱刘青的手要冲向护栏往下跳。\u0027,\n",
" \u0027就这样我被牵着走了大概十多分钟天突然下起了大暴雨雨大的连眼睛都睁不开”刘青继续说着瞬间他们就被雨透了但女子依然不愿意接受刘青的帮助就继续冒着大雨往前走。\u0027,\n",
" \u0027大概走了有四十分钟吧女子突然停下来说“我想回家了”然后女子也接受了刘青递过来的小黄衣就出现了深圳微博上的照片女子披着小黄衣刘青小心翼翼地在旁边走着的场景。从南平快速下来后刘青和巡防员将女子带到了附近的坂田派出所。\u0027,\n",
" \u0027那姑娘到底是遭遇了什么样的事情\u0027,\n",
" \u0027才会说\u0027,\n",
" \u0027“要是你也遭遇我的事你也会这样”\u0027,\n",
" \u0027据警方透露该女子姓陈系湖北人今年44岁据家属反映其有精神病史。三天前陈某从老家来深圳约会网友但约会受挫导致情绪异常女子遂产生轻生念头。\u0027,\n",
" \u0027目前\u0027,\n",
" \u0027陈某已经被送往深圳某精神病医院进行治疗\u0027,\n",
" \u0027大大君只希望姑娘能早点康复\u0027,\n",
" \u0027其实真爱的到来并不存在年龄的限制\u0027,\n",
" \u0027你们说呢\u0027,\n",
" \u0027因善良的原因\u0027,\n",
" \u0027一众网友纷纷为\u0027,\n",
" \u0027交警暖男点ZAN\u0027,\n",
" \u0027@弓常yan桦就想问这个小哥哥有女票吗\u0027,\n",
" \u0027@原谅我这一辈子浪荡不羁爱萨摩耶:有什么过不去的要轻生嘛?\u0027,\n",
" \u0027想想自己的家人。同时也感谢交警蜀黍\u0027,\n",
" \u0027@火心聆听心灵:点赞交警\u0027,\n",
" \u0027@中華云盾:警察……警察就是群众最需时申出援手\u0027,\n",
" \u0027@Tomchlee蜀黍帅\u0027,\n",
" \u0027@SJ-李赫海i这个交警很暖有木有\u0027,\n",
" \u0027男子迷奸网友拍418个视频\u0027,\n",
" \u0027女方从20岁到50岁不等\u0027,\n",
" \u0027去年6月7号上午淮安市涟水县公安局刑警大队突然接到了一个奇怪的报警电话一名女子言语不清声称自己遭到了侵害。女子、被侵害、言语不清几个关键词令接到电话的民警瞬间紧张起来。\u0027]"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"first_content_continous.replace(\u0027,\u0027, \u0027 \u0027).split()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"import re"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"pattern \u003d re.compile(\u0027[。,,.]\u0027)\n",
"token_by_sentence_first \u003d pattern.sub(\u0027 \u0027, first_content_continous).split()"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[\u0027原标题44岁女子跑深圳约会网友被拒\u0027,\n",
" \u0027暴雨中裸身奔走……\u0027,\n",
" \u0027@深圳交警微博称:昨日清晨交警发现有一女子赤裸上身\u0027,\n",
" \u0027行走在南坪快速上\u0027,\n",
" \u0027期间还起了轻生年头\u0027,\n",
" \u0027一辅警发现后赶紧为其披上黄衣\u0027,\n",
" \u0027并一路劝说她\u0027,\n",
" \u0027那么事发时\u0027,\n",
" \u0027到底都发生了些什么呢\u0027,\n",
" \u0027南都记者带您一起还原现场\u0027]"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"token_by_sentence_first[:10]"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dbXBU15kn8P+93Y26sRAiIMSLwBojhCA2eMD2CDsBGdvrXXYmVa4lZXajGVw7Gcji7KyzkyqnwlbsqVp24trZ8iS79rBhs04GeWe9pQ9brhqSMS8GZmPkBEjk2EgIwQgkI4Qk04gGqdXqvvuhfaHVtPrtnnPvuff+fx+DcnSRRT/3nPO8aIZhGCAiIvIJ3ekHICIishMDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+QoDHxER+UrQ6QcgKsVILI720wPovjqGsYkpVIWDaFpUha9uqMP8ygqnH4+IXEDjBHZyg87+KN441ovjPcMAgPhU6s6fhYM6DAAbV8zH8nmzMTaRYFAkohkx8JEj8u3cDGDan43E4jh7ZQzJlIFSf1nNoNiyqga7Nzdg3bJqCX8bInITBj6yVb6d26yAhqlU+tcxqGuYTIr71dQ0IBwMYM/WJrQ21wtbl4jch4GPbNPW0Ye9B7sxMZWEU791kZCOPVtXM/gR+RgDH9kiHfS6MJ5IFf5iyQIa0Np8P/50y0re/RH5EAMfSdfZH8X2/R0YTySdfpQ7dA0IBXTe/RH5EOv4SLo3jvViYkqdoAcAKSN9v/je2SFs39+Bto4+px+JiGzCwEdSjcTiON4z7NidXiGGAYwnkth7sIvBj8gnGPhIqvbTA04/QlHGEynsPdiNjwaiTj8KEUnGzi0kxEx1eZ0D0WklCyobTyTxV4d78D9feMzpRyEiiZjcQpYU6qgSn0qVXHTutCdX1eClpxqZ8ELkUQx8VDYV6vJkiYRY7E7kVTzqpLKoVJcng5nwAoDBj8hjuOOjkqlYlydLJBTAOzubsbaOx55WcKoGqYSBj0q288ApHOoa8tzxZi6aBjy7phb7Wh9x+lFcqZipGmwiQHZj4KOSjMTieOK1o67J1BShIqjjg5e3cGdSomLvgNlAnOzGOj4qyQ+PnEci6Z+gBwAagPYz7qhHVMXdO+DCiU9sIkB2Y3ILFa2tow9vf3gJKYfPCIK6hgeXVGF+ZQWqwiHMnR3EpdHb+ODCKBLJlPDnm5hK4eSFUezatELswh7V2R/F3oPdJSc+mU0E1tZV806VpGLgo6KYb/ACR+TlpWmYtlMw74OeXFWD3S0NOT8YR2Nx/PDoebR1XEZS8An+ifPDaOvo41FcEaz0Zp2YSuLNY728UyWpGPiooHLf4K1Ys6gKjbVzMDaRQFU4hKbFc7Btff4MwPmVFfjzrzyIlQsrhZdapAywvKEIVnuzGgbw/rlhjMbivFMlaRj4qKA3jvViwsbShXBQx1ceXlL20aIZmNLBWtxz8yiuMBG9Wc07VR4tkyxMbqG8jp+7hsNdQ7a2HTMAbFtfZ2mN1uZ6vLOzGU+uqhHzUJ8zj+Iot+6rY5YzfiemUugevCnoiYjuxcBHM2rr6MMf/80pW5NZNC19jyfimGttXTXeeuExtAgMfplHcXSvsYkpQeskhKxDlAsDH+VkJrNM2ZzCGQ4GsLulQeia33qqEZFQQNh6LG+YWVVYzO3JCF8sSCIGPppmJBbHK+9+jFfe/cT2PpyRkI49W5uE35+tW1aNPVubEAmJ+XXnUdzMmhZVoSJo/ef8yZUxzkYkaRj4CEA6c3PngVN44rWjONBxybayBSB9vJmehrBaWsZka3M99mxdDV0Ts97ZwRtiFvKYbRvqkBJQSpJMGbxLJWmY1Um2jBcKaEAooGMiR6/GfLV5IrU21+NQ17U7fSOt6L12i3V9n8tsQN01OIaEgLcmAyxrIHkY+HzOjvFCFUEdf/fNL+HIuWvoHrxZUm2eaBsfmI+Oi6OWMw+ThuH70oZ8DahFYFkDycLA52N2FKabWZoNtXPQUDtH2vcp1rYNdXj9cI+QtfzcZcSOUwLepZIsvOPzMSutpYolI0vTigWVFdjcWANNwF2fX0sbSmlAbRXLGkgGBj6fstpaqhiysjSterGlAeGgmPIGv5U22N2+riocsuX7kL8w8PlU++kBJCXW6AV1TWqWphVmeUNAwK7Pb8dxdpwSmMJBHU2LnT8eJ+9h4POpn308KK04XdeAt3Y8qmTQM7U216NhYaWQtfxyHGfHKUEmEa3riHJh4POhzv4ofvupvDq0f7KmFl9uFNsjU4bVi6uErOOX4zgRDaiLJbJ1HVE2Bj4feuNYr7T+m5GQWsks+YjqMnJ7Ukx/StWJaEBdLNWSoshbGPh8xjyukkHVZJaZbNsg5hjteM+wL9priWpAXYjbfo/IfRj4fEbGcZUdLcdkEFXaEE+mfNFeq0JENlABbvw9IvdhAbvPiDyu0j9vQ2ZXyzEZXmxpwIme4Wmt1Erl9anhZoeWI93XpH0PXUvfDbv194jchYHPZ0QeV/1R8/34t1tWuvrDft2yamxqXID3zlr7UPdqey07OrQEdQ1v7XjUFQlR5A0MfD4jqnZvXd1cvPqVB4Ws5bTZs6z/M/BiPZ8dfVzT93mrGfTIVgx8PnMlOm55jaAGbH1osYCnUQOnht9LdocWTUtnbu7Z2sT7PLIdA5+PjMTiuDR6y/I6uq57qrBY1NRwL9XzyezQwvs8choDn4+0nx6ApmlI98QoX/2C2a6+18uWrue7ainpJ6jBE+21RmJx/PRkHw53DUm703tixQJfTrQgdTDw+YiojM4lcyMCnkYdIkYVTRnAmkViOsE4IXO2XjJlSGtwAKTLSIicxDo+HxF1lzV4w/o9oUrMej6r3v7lJQFPY7+2jj5s39+BQ11DiE+lpPVwBdh4mtTAwOcjou6yeq/FPNep5GuPLbe8hhtn89k5Ww9g42lSAwOfj4jqTZk04LlOJV1XbyKoW+tM4rbZfJ39UfzHv5NbrpCJjadJFQx8PiKqNyXgzt1NPt1Xxywf8bmplq+zP4o/OXDKUseaUrHxNKmCgc9HRN1lAe7b3RTip1q+to4+PP+jk7h2074XFzaeJpUw8PnMiy0NnDyeg19q+cw7Pbt2em5tYE7exnIGn1m3rBorFlaiZyhmea2zg/KG2dpNRC2fihmLI7E42k8PoPvqGAauj+PXl68jaUMSy6yABk3TXN3AnLyLgc+H1iyuEhL4zOxOL3yoiajlSyRTymQsZtblAbBtgKyuAQ8tnYutDy3GtvV1TGQhJTHw+ZCI3Q1wN7vTC104zPvP984Olb2GAeDT6LjjH/Z2TFTIxt6b5Ca84/MhkdmdR7u9k935YksDrFQ0GAqUedhdlxfQgIqgjmfX1OKdnc0MeuQKDHw+JDK7czKZwr/8Hx3o7Hd/QfvSeRHoFsaxG3C2zEP2RIVsugZ888kGfPDyFuxrfcQTR97kDwx8PiUquxMAeoZi2L6/A20dfWIWdEj76QEEXFjEPhKLY9/xC/jG26cwnpAzUSGb9vmEhW89s8rxo12iUvGOz6dEZncCwHgiib0HuwDAtcddIpp421nm4VQCC8BidHI37vh8bM1isdMExhMp7D3Y7do+nm4qYs9uLG1n0GMxOrkdA5+PierdmWliKul4gke53FLEbncCS6ZwUGcxOrkejzp9TETtWjbDuJvp6ba7H1WL2J0qQs9WO6cC+/+ISSzkfpph2P3OSCrZeeAUDkmYtt1YW4n//C/WYd0y93xIjsTieOK1o5YCX0ADfvndp4UEfSfv8LKFgzr+z66NDHrkCTzq9LkXWxoQDgaEr+vGTE8RZR5mEbtVTt7hZYuEdPyHf76aQY88gzs+yrgzEv/hmk6EcM+dUGd/FM/99S9Q7oQiDcCzX6wtuptN5jHm2MQUqsJB3J6cwomeYUxMOftPk91YyKt4x0d3PtTSxc9i68DMTM+1ddWu2DGYReypMt8HM4vY8x13qnSMmS0c1GEAbDBNnsXARwDSwW9tXTW+3d4prLbPZGZ6uqGnp1nEbmUorVnEvmvTipx/7kQvzUICmob1y6tRN282mhbPYYNp8jQGPrpjbV01/tfXm/H4949gUmDaoGEAh7quoXfoJhpq1Rrbk012EbvMY+Vyue04msgqJrfQNAsqK9CyaiEstKzMKZky8OwPTmBX2yml+3rKLGK3u5dmIRwSS37FHR/d48WWBvzD+RHh931JA3jv7BBO9Izg3z3VAECbltTRtKgKX93g7BGbyCL27MSVrsEbtvXSzKcioAEcEks+xqxOysmOI7mAhmmF2GZSRcuqGuze3OBIDeC+4xfw+uEeS8edswIa7p9/Hy5/dhuAWokrS+aGsePxet7hka8x8NGMzCQMu3cpTqbRiyhiV1UkFMA7O5u5wyPf4x0fzai1uR7v7GxGY22lrd/XMO5Oe7C7AF7krEKVsLE00V3c8VFBI7G48EzPYtm1S8nuh3nq0nWp388uLEInuhcDHxVFVk/PYiyeG8aOjfX3JL7k6nqSK0Em39cNXB9XtpDcChahE82MgY+K0tkfxfb9HY5lJZqZiC2ravBMUy3e6xrKGawyE2QKfd1UykDKMMpuT6YaFqETFYeBj4qmQvG1hnRbMFFf5xUsQicqHuv4qGiZPT2dardV7Lf0S9DjHR5R6bjjo5J9NBDFm8d6cajrGpJeOSd0Gd7hEZWPgY/Kdn7oJv7pD044Mg3cT8IhHZtX1mD2rCDGJhKoCod4h0dkAY86qWwra+fgqdW1jmV7eh2PMYnkYOAjS2T19fQzHmMSycWjTrJMhWxPt1syN4zVi6t4jElkA+74yDIVsj3dLBIKYF/rBu7siGzCHR8JY2Z7vn9uGBrSA1lNQYtTzb2K9XdE9mPgI+FGY3G0nxlA9+DNaVmIMAz81ZFe7grBxBUiJzHwka0yd4WAd3pjzmSmmYNMXCFyDgMfOcLcFf7kgz4M3phw+nGkeXBJFVYunMP6OyKFMPCRo5xufi3bU00L8eMdjzr9GESUgYNoyVHrllVjz9YmRELe/FWsCoecfgQiyuLNTxtyldbmeuzZuhqRUACalv9rC/xxWV+na+m7uHBQ7D+HcFBPJ/UQkVJ41EnKyFcOkZkU8syaWhw6OyTs63a3NGBpdWRaJmpFQMfPz161NKsvFNDQ8Z2neJ9HpBgGPlLOTOUQ2Ukhor8u22P/6TCu3YyX/feonVOBD7/7dNn/fyKSg4GPKIeRWBwbv38ECQujJ7jjI1IT7/iIcmg/PQC90IVjAQFNQ/uZAUFPRESiMPAR5dB9dcxycf3EVArdgzcFPRERicLAR5TD2MSUoHUSQtYhInEY+IhyqAqLGVzCOj4i9TDwEeXQtKgKFRbr+ljHR6QmBj6iHLZtqLO8hgFg23rr6xCRWAx8RDksqKzAw8usTU5Yv7yapQxECmLgIyIiX2HgI8phJBbHb/qjltY4czmK0Vj5nV+ISA4GPqIc2k9bLzzXABawEymIgY8oBxawE3kXAx9RDixgJ/IuBj6iHFjATuRdDHxEObCAnci7GPiIcmABO5F3MfAR5cACdiLvYuAjIiJfYeAjyoEF7ETexcBHlAML2Im8i4GPKAcWsBN5FwMfUQ4sYCfyLgY+ohxYwE7kXQx8RDmwgJ3Iuxj4iHIQUcCeSKZYwE6kIAY+ohwWVFZgc2ONpTUMAJ9Gx8U8EBEJoxmGYTj9EJlGYnG0nx5A99UxjE1MoSocRNOiKnx1Qx27YJCtOvujeO6vf4FUmf9CNADPfrEW+1ofEfpcRGSNmBt8ATr7o3jjWC+O9wwDwLRU8nDwKl4/3IOWVTXYvbkB6yy2kiIqxtJ5EeiahlSZ74YGgPfPDWM0FudLG5FClDjqbOvow/b9HTjUNYT4VOqe+qmJz/+3984OYfv+DrR19DnzoOQr7acHENA1S2uwiJ1IPY7v+No6+rD3YBfGE4WLhQ0DGE8ksfdgFwCgtble8tORn7GIncibHN3xdfZHsfdgd1FBL9N4IoVX3v0Er7z7MXshkjQsYifyJtt3fJnJK/+vdwTjiWRZ6yQN4EDHJfzvX/Xz7o+kYBE7kTfZFvjyJa+UK2Xgzt3fiZ4R7NnaxONPEqZpURUC2hUkLeQ9s4idSD22BL70PV43JqaSkFE8Yd79vfLuJzhxfgR/8dxDzKIjy1YvnmMp6AGcwk6kIumBr5TkFauSBvDe2SG8f+4atjQt5PEnWfL2h5ctr/Hkqhq+hBEpRmpyS7nJK1YlkgZLH8iSkVj8zrG8FV/7vfsFPA0RiSQ18L1xrBcTU+Ulr1iVWfrA4EelEjGINqhrODs4JuBpiEgkaYHPfGN2uiEaSx+oHCJq+KZSBmv4iBQkLfCJeGMWxSx9ePy1o9jVdgqd/VGnH4kUxxo+Iu+SFvhEvDGLlFn6wLs/KoQ1fETeJS3wiXpjFo13f1SMdA2ftTVYw0ekJmmBT9QbsyzjiRT2HuzGRwM89qR7sYaPyLukBb6mRVWoCCox/GFGE1NJvHms1+nHIAWxho/Iu6RFpm0b1H/TNQzgUNc19A4x847uYg0fkbdJC3wLKiuwubEGmsV7EtmSKQPP/uAEsz3pDtbwEXmb1LPIF1saEA4GZH4LIcxWZ8z2JIA1fEReJzXwrVtWjT1bmxAJqX3XBzDbk+5iDR+Rt0mPSK3N9dizdTUioYDyx54Asz2JNXxEXmfLVqy1uR7v7GzGs2tqURHUEVQ8AI4nkvh2eydbnPkUa/iIvE0zDHu7aY7G4mg/M4C/OdmHT6MTdn7rks0KaHiS441853jPNex461eW1qgI6vjg5S0sZyBSkO2Xb/MrK3DfrAA+uzVp97cu2STHG/kSa/iIvM32wOfUjL5yMenFX1jDR+R9tgc+0TP6IiEdf7B2sfTMUSa9+ANr+Ii8z9bAJ2NGX/2C+/D1Lz1gS+Yok168jzV8RN5na+CTMaOv++pNbN/fAQB3MkcDurzo1zMUw8bvH2GnF49iDR+R99ka+GTM6Mu8g/toIIp9rY/g53/6Zcvp6Pkw6cW7WMNH5H22Bj6ZM/oy7+BW1s7BU6trpR57MunFm25PWr9/Zg0fkdpsDXyyZ/Rljhmyq08ok168o7M/ihMCMjo5h49IbbYGPtkz+gwDeP/cMEZjcVv7hHKunze8cawX8aS1o3hNYw0fkepsDXx2zOjTALSfSSfR2NUnlHP93E9UxnFFQMfulgYxD0VEUtga+OyY0TcxlZqWSp7ZJ3RWQN5fl3P93E1UxvHmxhqsrWN7OyKV2V7AbsfdW3Yq+dq6auxrfQQnv7MFKxdWSvu+nOvnXqIyjmfPknuPTUTW2R747Lh7mymVfH5lBf5y2zpEQvICL7M93Yn1e0T+4ciEWJl3b4VSye1KemG2p7uMCOrGw/o9IvU5Nho9e0ZfWFC2ZzGp5HYlvTDb0x3aOvpw9or13pqs3yNyB9vn8eVizujrHryJ988NITpe/rHTxge+gL/9k41Ffe1HA1G8eawXR7uHMWkxjX0mugZ888kG7NhYzxR3BXX2R7F9fwfGE9YL1zmDj8gdlAh8mZ7/0Ul8+I+flf3/LyXwmUZjcWzf34Hz12Jlf998AhoQDOhoWVXDobaK2XngFA51DVkuY9A04Nk1tdjX+oiYByMiaRw76sxlJBbHbyyWApy5HC15eoLspJekAcSnUsz4VIzIaSHhYID1e0QuoVTgE1FLlVnAXgo7kl6Y8akWUbV7QR3Ys7WJ9XtELqFU4BNRS5VdwF4Ku5JemPGpBlG1ew8umYvW5nrrD0REtlAq8KlQS5WZbSpzrh+H2jpP1JR0JrMQuYtSgU+VWWhmpxfZc/041NY5bR19uCAomYm1e0TuolTgEzG9QWQtlR1z/TjU1n6d/VHsPdiNpJCkFtbuEbmNUoFPxPSGRDIldBaaHb1FmfRirzeO9WJiynrdHsDZe0RupFTgEzG9wQDws48HhT2TnXP9mPQin8gSBs7eI3InpQIfYH2HlTIgPHjYle0JsM2ZbP/16HkkBHXpYe0ekTsFXn311VedfohMi+aGUR0J4ljPMMp9KU8aBq7fmsTvr10i7LnW1lVj08oFuH5rEv3Xx6EhHWRluDhyC8mUgcbaORxzI1BbRx9+eOS8kP9uAQ343u+vwTNrFllfjIhspVzLMiB9HNX8F0cwZeETSmbfxNFYHD892Yf/9n6vtODHNmditXX0Ye/BLownxOz2VtVW4u9f2ixkLSKyl3JHnUC6o4bVGrpEMoU/k1QnN7+yAv/+mVV4WmLGJ9uciWNmcYoKegCwZvFcYWsRkb2UDHwiOmqkDOBEzzAef+2otDo5Zny6g8gsToAlDERup+RR57/+6a9wtPuasPU0LZ2IsGdrk/DWUqKP0PIJaMDvLp+HunkRNC2qwlc31DGjsICRWBxPvHZUSGsyE8cPEbmbkpkTojq4mDJ3TQCEBj9zrb0HuzExlRSSJj+TpAGcunQdpy5dRzh4Fa8f7uEdYAEiszgBljAQeYGSR50iOrjkIqtOLrO/56yAPT/SiakU7wALaOvoQ1vHJaEJSCxhIHI/JQOfiA4uM5FVJ2f29zz5nS1YubBS+Poz4R1gbuYRtIi2ZKZISOf4ISIPUDLwiejgMhPDAN4/NyxtKoLsobYzYdeXu2RkcQY0YM/W1Rw/ROQBSgY+QG7GZLnDaotlZ5uzTOOJJHa1nca+4xd8O+5oJBbHt9s7MZ4Ql8Wpa8AfNt/PoEfkEUpmdZpkZkw+9/BSvP78w8LXzZR+fvlJL9kqAhqgab5KfOnsj+KNY704dm4YkwKTWQBmcRJ5jZJZnSaZGZNWhtUWq7W5HmvrqvHmsV68f24YyZRhqRtNseJJA0B63NGJnhEpZRwqkfmCwSxOIu9R9qjTlJkxWRHUIWooul3DQ82klw9e3oLdLSuEPX8x/JD4cvdUQM6umlmcRN6j9FFnttFYHH/W3okTPcOWUtTDQR3feqYRuzatEPdwRdp54BQOdQ3ZevQJeLP4vbM/iu37O4Te52VKZ3EyoYXIa1wV+AAxnTgCGvDL7z7tyAe/7A/rYoSDOgzA9XeAO976JY73DEtZO6ABf/6VLzLoEXmQ8ked2VQcVlsKpzI+M7m9+L2zP4oXfiIv6DGLk8jbXLfjA8TsmiKhAN7Z2exYMbJTGZ+5BHUNa5ZUYUFlBarCQaWPQs2fm8wdM7M4ibzNlYEPSH8Afu/dT8q+69M04Nk1tdjX+ojYByvBRwPROxmfGtI7MRWochQ6Eouj/fQAuq+OYWxiCqOxOD65cgMyf0wq/F4QkVyuDXyqD6stxWgsjvYzA+gevImB67dx5vJ1oa22yqUBCDiwGzRr8syjTJGTFQpx+iSAiORzbeDbd/wCXj/cY+lDUdeATY01+C/b1jke/DLZOeqoVJm7wX/12HJ0Dd68syMrNTBm7+iqwkHcnpzCiZ4RxJMp24+AmcVJ5A+uDXwvvfNr/N/fXLG8jq4BoYDu+LFeNpXuAPMJaJi2O80+Jl06L3JPcKsKh3D5s9s4eXEUgL07ulxkzmskIvW4NvC5aVhtuTLvAAHnA0QpNKR/phqAYEBX9tlnBTRsaVqI3S0NPN4k8gmlW5bl46ZhteUyu76Yd4A/+aAPgzcmnH6sohjAnZ1qUtGg11hbib/9erNSx9xEJJ/r6vhMbhtWa8X8ygrs2rQC+762wfZxR14VCQXwl4rd7RKRPVwb+Nw4rNYqFYrfvYADZYn8zbWfoG4eVmtFa3M99mxdjUgoIOXv7nWRUICZm0Q+59rkFkBu30tdA1YvrsIfrF2iZBcTVYvfVbZlVQ1eerqROz0in3N14APk17yp0sVkJqoWv6vmyVU1eOuFx5x+DCJSgOsDH2BPzZuK5Q65qFz87hR2YyGiTIFXX331Vacfwqq1ddXYtHIBrt+aRP/1cRiGARnxbypl4OTFUVRHQsp+iK6tq0Z1JISTFz9D0v3vNJaZ3VieWbPI6UchIkV4YseXSdSw2nzcsIPw+x2gW3boRGQ/zwU+QMyw2nzc1ME/8w5wbCKB0VgcH0uecOAk8072yVU17MZCRDl5MvABwM4Dp3Coa0janZ8qkx3K4ZY+oMUI6hq+eGd6RAhNi+dg23r1snCJSB2eDXwySx2A9M7iW880YtemFVLWl83tR6E8yiRyVq7pKioPsc7k2cAHyM9wfO7hpXj9+YelrG2X3EehY5bmHMrEo0wiZ+Wbl1mo/EuVYOnpwAfIPdb7csMCHPjj3xO7qALy7QaDumZLUNQ0oCKgY3NjDWbPCmJsIsGjTCKHFft5mn0iYyVYyuD5wAfIO9bTNeCZNbVKFraLkL0bNAPPmsVVePvDSzl/nuGgjqmUgZRhlJVVyx0dkXiFdlr5/twA0H56AAc/HsTHn94o6d91JKTj6dW1ONx1reRgKZMvAp/J/CB/9zdX0HV1TEi5g5/vmmYKjNvW1+HT6PiMLxtmcHt8xXzcP382btye4o6OKI9yjwgL7bSShoF5s2fh+u1J6Jo27c9nBe6e7ugabMsEN2tvZX6e+irwmWSUO9jxH8uN8gVHBjei/Eo5Ilw6LzItOI7E4jh7ZQzJlJyGHjLJrpX2ZeAD5JQ7uKGwnYjcoZT8BF0DdE1DQNek1S/bSXattGvHEln1YksDwkGxQ11VneNHRO5yNyO9uKS8lJFuqeiFoAfIHw3n28AnY6irynP8iEhtI7E49h2/gB1vfYjvvfuJ7xvNawDazwxIWTsoZVWXMO/jRJY7JJIpPP+jk3hw6VzXFHMSkVz5klMGro/PeI/nZxNTKXQP3pSytm/v+DKZ5Q7vnR0S2tha9Vl+RGRNoWzLQskpiWQKBtKnRb7/IM7hqaaF+PGOR4Wvy8CX4Q9//CH+oXdE+Lp+Lnkg8qJisi0fqLkPF4dvYTKZcn1PXKfI6o7l66PObPMrZ0lZ1zCA8UQSew92AQCDH5GLFcq2NGtWuyQd0/lFOKijafEcKWv7Nrkll6ZFVagIyvuRjCdS2HuwGx8NRKV9DyseKj0AAActSURBVCKSp9RsSyqfAWDb+jopazPwZdi2Qc4PORNLHojcqbM/ir0Hu32fbWkHTUu3LZSVGMjAl2FBZQU2N9ZA0+R9D8MA/v7sEP7N26ex7/gFlj4QKc4sM/jG26eljTmj6cLBAHa3NEhbn8ktWWTP8cvErE8i55SSkWkYBiaT/Ki0A3t1OkT2HL9szPoksg8zMtXE6QwKkDnHbyZsdE0klxP/rik/M6HQzlFkDHx5yJrjlw8bXRPJYfdJDhW2ZG4YOx6vt31aCwNfETJH6/z20ygujtwS2uElk+yu5ER+kXmHN3B9HL++fB28prvLnMf3hdmz8NntSQQ0bdrLfeY8vqCuTbvjNI+E1y+vxpnL0bLarDn5ks/AVyIZs/yyVQR1fPDyFvb4JCpDvjs8Lym15VlQ1/DgkirMr6y4Zy5mvrmZAPLO1CxnJ+30tQ4DXxlkzPLLpGvAAwvuY6NrohL54Q5P14BNK2uwccV8bFtfh0+j4zNeyZg7M9n3Z8X+3FVJ5GPgKwNLHojU44c7vHw7pXy7NjtenPPlRNgVgIvFwFcmljwQOSe7Bi+ZSuEXvaN37qS8xk3//p0OwMVg4LOAJQ9E9vLq/Z2uAbqmIahrSu+UvIKBzyKWPBDZw233d5oGzNJ1rFh4Hy4M3yp4/Le0OqL8TskrGPgEMbf3nZej+PnZq9LKHUyNCyuxZklVzlZLRG6Wq5XY7ckkTvQM2/JiaVWugmw3HP/5CQOfBLKzPnNhEgy5nReOMZ0qyKbSMPBJYGfWZzY3XYITmdx2jJkLryDcg2OJJFi3rBp7tjYhErL/x5s57b2to8/2709UKi8Md00nnTUx6LkEA58krc312LN1NSKhgNT5fjPhtHdyA7cPd9W09E6PmdbuwqNOyZzI+jSx7yepJjtxpWtwDIM3Jpx+rHuUmpHJnZ67MPDZxM5G15lmBTR8Y/MKXP7sNjNAyTFuSVzJFdCYkek9DHwOsKPRdaagrk3raMEMUBIt3zTzn308qHTiSkAD1i+fh7p5sxnQfIKBzyFOlDxkYwYoWVVomrk5PUDVTmLshORPDHwOcbLkIRv/8VM53FyCwJc+f2Pgc5BK3eTDQR3PP7oMN8YTvAukglT63S0Fk1IIYOBznEpvzbo2/UiKd4GU6+5ubiSEd37V74r2YUFdw5caFiCga0xKoTsY+BTgZMlDMXgs5D/57u6yX5BUxSN8mgkDn0JypU1/cuUGzl+LQYX/SJkfJPmy+Pg27W4qnUKUgy9qVAgDn+JUSoIBgIqAjt9dXo1f96c7wmRn8fFo1B1menEBDPzgyHnX3d0BvL+j4jHwuYDbEgn4xq2ufEeYswIaJpPu+DgIBzVsblyI2bOCLCqnkjHwuYQbj594x6IWN/4OZeNLFYnAwOci+ZJgAhqg4st6JBTAf29dj7ODN3kfKFnh7inuOTXIxmNMEomBz4VyJcEs+0IE+45fxGRSvQ82XQNCAZ33gZIU6p6SNAwkU4YrMjEzLZkbxurFVTzGJOEY+DxEhTZopco+umK26L3c3AezXBzqSjIx8HmIahmgpagIaHhgYSUuDt8CUHy2qFsDZTHP7fY+mOXi3TDJxsDnMW7LAC1F5u7woaXVeYOCiGNUGUG1UDAzn/t35t+Hn5685LmdXD5MXCG7MPB5kBey9/IJ6oCmpUct5fv7lXuMWmxwygyqxazt9f8uhegaoGsagrrGoa7kKAY+j8qXAeqWllOilHKM+ttPo0UFJzOo7th4Py6O3CpyB9fnyZ14IZkvIP/swcUc6kqOY+DzuFwZoFWRoGuaDNtF04CApkHTgESJdSEaoERLOafN1OScOzlSDQOfT3n5LpDsFw7q2P7oMtwYn+JOjpQXdPoByBlm8oCf75xIDGZhkttwx+dz+e4CzaOq9curceZydNr9FRGzMMmtGPgIQO67wMyjKh6N+ld282re3ZHbMfBR0fyeju83kZCOl55aCWgaszDJUxj4qCSFjkYnkylflUp4EY8wyesY+KgsMx2Nrl40B7vazriybZpf6BoQ0DUENBaSkz8x8JFwvA9Ul5mByUJy8jMGPpKC94Fq4fEl0V0MfCRNMaUSK2ruw4XhWyyVsIh9MImKx8BH0hVXKlFcf8xy24q5VaF2aOyDSVQ6Bj5SQjG7Q3PX8tFAcY2kVVVsMHth4/34x9FbRf1MuJMjKh4DHyml0O7QJOsYtdiRR+WIhHS8sLG+5GBW7M+EiIrDwEeuJvIY1TwyXFtXXdTu83cW3IeffFB4WGyuxBIGMyLnMPCR55VyjJp5ZFhMcCp3bSJyDgMf+YbMXRZ3cETuwcBHRES+ojv9AERERHZi4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl9h4CMiIl/5/3f13LbiQzu8AAAAAElFTkSuQmCC\n",
"text/plain": [
"\u003cFigure size 432x288 with 1 Axes\u003e"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sentence_graph \u003d get_connect_graph_by_text_rank(\u0027 \u0027.join(token_by_sentence_first))\n",
"networkx.draw(sentence_graph)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"ranking_sentence \u003d networkx.pagerank(sentence_graph)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"def split_sentence(sentence):\n",
" pattern \u003d re.compile(\u0027[。,,.]\u0027)\n",
" split \u003d pattern.sub(\u0027 \u0027, sentence).split() # split sentence\n",
" return split"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q6. 切句子是如何实现的?如何使用正则表达式进行句子分割? "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#分割句子,将句子按照逗号和句号分隔开。\n",
"def split_sentence(sentence):\n",
" pattern \u003d re.compile(\u0027[(, 。\\s)!?。.]\u0027)\n",
" split \u003d pattern.sub(\u0027 \u0027, sentence).split() # split sentence\n",
" return split"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[\u0027我生气了\u0027, \u0027我不开心\u0027]"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"split_sentence(\u0027我生气了,我不开心。\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q7. 如果对切词之后的句子的标点符号进行恢复?"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"pycharm": {
"is_executing": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"\u0027原来他们每天偷偷摸摸干这事。 原来他们每天偷偷摸摸干这事。 大家还记得今年4月光谷曾发生的一件大事吗。 抢购高峰期,网页打开慢,网银交易出现比较迟钝现象。 有不法分子会冒充客服或店主,以单子出现“调单”“卡单”等说法为幌子,故意说没有收到款项欺诈消费者,取得信任后要求消费者以其他办法进行转账。 识骗方法:消费者要注意,调单、卡单、激活订单等多为诈骗术语,见此类词语基本可以断定对方是骗子。 没有收到款项这样的问题,是不会在东京、天猫这样的大型网络购物平台出现的。 抢购高峰期,网页打开慢,网银交易出现比较迟钝现象。 有不法分子会冒充客服或店主,以单子出现“调单”“卡单”等说法为幌子,故意说没有收到款项欺诈消费者,取得信任后要求消费者以其他办法进行转账。 识骗方法:消费者要注意,调单、卡单、激活订单等多为诈骗术语,见此类词语基本可以断定对方是骗子。 没有收到款项这样的问题,是不会在东京、天猫这样的大型网络购物平台出现的。 同时,提醒大家:保护好自己账户信息,遇到情况一定及时报警。 武汉破特大网络诈骗案抓808人:以\"内幕消息\"骗人\u0027"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def get_summarization_simple_with_text_rank(text, constraint\u003d200):\n",
" return get_summarization_simple(text, sentence_ranking_by_text_ranking, constraint)\n",
"\n",
"\n",
"#建立句子和标点符号之间的关系,例如,建立一个字典\n",
"def get_summarization_simple(text, score_fn, constraint\u003d200):\n",
" sub_sentence \u003d split_sentence(text)\n",
" ranking_sentence \u003d score_fn(sub_sentence)\n",
" selected_text \u003d set()\n",
" current_text \u003d \u0027\u0027\n",
" \n",
" for sen, _ in ranking_sentence:\n",
" if len(current_text) \u003c constraint:\n",
" current_text +\u003d sen\n",
" selected_text.add(sen)\n",
" else:\n",
" break\n",
"\n",
" summarized \u003d []\n",
" for sen in sub_sentence: # print the selected sentence by sequent\n",
" if sen in selected_text:\n",
" summarized.append(sen)\n",
" return summarized\n",
"\n",
"\n",
"def sentence_ranking_by_text_ranking(split_sentence):\n",
" sentence_graph \u003d get_connect_graph_by_text_rank(\u0027 \u0027.join(split_sentence))\n",
" ranking_sentence \u003d networkx.pagerank(sentence_graph)\n",
" ranking_sentence \u003d sorted(ranking_sentence.items(), key\u003dlambda x: x[1], reverse\u003dTrue)\n",
" return ranking_sentence\n",
"\n",
"\n",
"sharp_news \u003d pure_content.iloc[8][\u0027content\u0027]\n",
"\u0027。 \u0027.join(get_summarization_simple_with_text_rank(sharp_news, constraint\u003d250))"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1296----\n",
"江南华南强降雨持续 北方旱区多雷阵雨 这几天,暴雨成了天气关键词 其中,广东、福建、台湾等地一天下了四五百毫米的超级暴雨;江浙沪则是连绵不绝的“梅雨”;还有东北以及京津冀等地将会有冷涡雷雨 当它在低纬度以较强形式出现时,就是我们熟知的台风;而在中高纬度出现时,就是雨雪“制造机”了 历史上,从蒙古国来的低涡也曾造成多次暴雨事件 比如就北京来说据统计1956年-2000年蒙古低涡共出现131次占北京暴雨过程总次数386次的34%,是北京地区出现频率较高的暴雨天气系统 不过单纯低涡并不足以形成降雨,需要水汽条件,近日京津冀等地气温持续偏高,水汽条件从南方北上,所以降雨一触即发\n"
]
}
],
"source": [
"for index in random.sample(list(range(len(pure_content))), 30):\n",
" content \u003d pure_content.iloc[index][\u0027content\u0027]\n",
" if len(content) \u003e 1000:\n",
" print(\u0027{}----\u0027.format(index))\n",
" print(\u0027 \u0027.join(get_summarization_simple_with_text_rank(content, constraint\u003d250)))"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"scrolled": false,
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[(\u0027一名女子言语不清\u0027, 0.008761809701694283),\n",
" (\u0027行走在南坪快速上\u0027, 0.008761809701694281),\n",
" (\u0027期间还起了轻生年头\u0027, 0.00853806788025346),\n",
" (\u0027淮安市涟水县公安局刑警大队突然接到了一个奇怪的报警电话\u0027, 0.00853806788025346),\n",
" (\u0027一辅警发现后赶紧为其披上黄衣\u0027, 0.008371719895408159),\n",
" (\u0027去年6月7号上午\u0027, 0.008371719895408159),\n",
" (\u0027并一路劝说她\u0027, 0.008245759268329758),\n",
" (\u0027女方从20岁到50岁不等\u0027, 0.008245759268329758),\n",
" (\u0027那么事发时\u0027, 0.00815029910456809),\n",
" (\u0027男子迷奸网友拍418个视频\u0027, 0.00815029910456809),\n",
" (\u0027@SJ-李赫海i这个交警很暖有木有\u0027, 0.008078401421739694),\n",
" (\u0027到底都发生了些什么呢\u0027, 0.008078401421739692),\n",
" (\u0027南都记者带您一起还原现场\u0027, 0.008024087516959199),\n",
" (\u0027@Tomchlee蜀黍帅\u0027, 0.008024087516959199),\n",
" (\u0027南都记者在龙岗大队坂田中队见到了辅警刘青发现女生的辅警\u0027, 0.007983207314774927),\n",
" (\u0027@中華云盾:警察……警察就是群众最需时申出援手\u0027, 0.007983207314774927),\n",
" (\u0027一位外表高大帅气\u0027, 0.007952624377193676),\n",
" (\u0027@火心聆听心灵:点赞交警\u0027, 0.007952624377193674),\n",
" (\u0027说话略带些腼腆的90后青年\u0027, 0.007929884597094566),\n",
" (\u0027同时也感谢交警蜀黍\u0027, 0.007929884597094566),\n",
" (\u0027刘青介绍\u0027, 0.007913142240506744),\n",
" (\u0027想想自己的家人\u0027, 0.007913142240506744),\n",
" (\u0027@原谅我这一辈子浪荡不羁爱萨摩耶:有什么过不去的要轻生嘛?\u0027, 0.007900964870248895),\n",
" (\u00276月16日早上7时36分\u0027, 0.007900964870248892),\n",
" (\u0027他正在环城南路附近值勤\u0027, 0.007892232774304273),\n",
" (\u0027@弓常yan桦就想问这个小哥哥有女票吗\u0027, 0.007892232774304273),\n",
" (\u0027接到中队关于一位女子裸身进入机动车可能有危险的警情\u0027, 0.00788607704919873),\n",
" (\u0027交警暖男点ZAN\u0027, 0.00788607704919873),\n",
" (\u0027一众网友纷纷为\u0027, 0.007881820981426759),\n",
" (\u0027随后骑着小铁骑开始沿路寻找\u0027, 0.007881820981426757),\n",
" (\u0027因善良的原因\u0027, 0.007878941618434662),\n",
" (\u0027大概花了十多分钟在南坪大道坂田出口往龙岗方向的逆行辅道上发现该女子\u0027, 0.00787894161843466),\n",
" (\u0027你们说呢\u0027, 0.007877040414333012),\n",
" (\u0027女子身上一丝不挂地逆车流而行\u0027, 0.00787704041433301),\n",
" (\u0027时走时停\u0027, 0.007875818243366639),\n",
" (\u0027其实真爱的到来并不存在年龄的限制\u0027, 0.007875818243366639),\n",
" (\u0027时坐时躺\u0027, 0.007875055326830038),\n",
" (\u0027大大君只希望姑娘能早点康复\u0027, 0.007875055326830038),\n",
" (\u0027险象环生\u0027, 0.007874594202822473),\n",
" (\u0027陈某已经被送往深圳某精神病医院进行治疗\u0027, 0.007874594202822473),\n",
" (\u0027目前\u0027, 0.007874325165885149),\n",
" (\u0027刘青停好小铁骑\u0027, 0.007874325165885147),\n",
" (\u0027女子遂产生轻生念头\u0027, 0.00787417418096783),\n",
" (\u0027和另外一名巡防员追了上去\u0027, 0.007874174180967829),\n",
" (\u0027但约会受挫导致情绪异常\u0027, 0.007874093011541456),\n",
" (\u0027发现女子的情绪很低落\u0027, 0.007874093011541454),\n",
" (\u0027话不多\u0027, 0.007874051412730365),\n",
" (\u0027陈某从老家来深圳约会网友\u0027, 0.007874051412730365),\n",
" (\u0027刘青尝试和女子交流\u0027, 0.007874031209340058),\n",
" (\u0027三天前\u0027, 0.007874031209340058),\n",
" (\u0027劝说女子离开\u0027, 0.007874021979828482),\n",
" (\u0027据家属反映其有精神病史\u0027, 0.007874021979828482),\n",
" (\u0027今年44岁\u0027, 0.00787401805200212),\n",
" (\u0027可女子并不愿意接受\u0027, 0.007874018052002118),\n",
" (\u0027继续缓慢地往南坪快速路的主干道上走去\u0027, 0.007874016514985274),\n",
" (\u0027系湖北人\u0027, 0.007874016514985274),\n",
" (\u0027此时路边上已经聚集了很市民围观\u0027, 0.007874015971942193),\n",
" (\u0027该女子姓陈\u0027, 0.007874015971942193),\n",
" (\u0027为了不刺激女子的情绪\u0027, 0.007874015803169621),\n",
" (\u0027据警方透露\u0027, 0.007874015803169621),\n",
" (\u0027你也会这样”\u0027, 0.007874015758793634),\n",
" (\u0027刘青和巡防员一边盯着女子一边驱赶着围观的群众\u0027, 0.007874015758793632),\n",
" (\u0027现场还原\u0027, 0.007874015749519759),\n",
" (\u0027“要是你也遭遇我的事\u0027, 0.007874015749519759),\n",
" (\u0027从警方提供的一份视频了解到\u0027, 0.00787401574814256),\n",
" (\u0027才会说\u0027, 0.00787401574814256),\n",
" (\u002716日早上7时25分\u0027, 0.007874015748031496),\n",
" (\u0027女子出现在坂雪岗大道与环城南路的监控视频中\u0027, 0.007874015748031496),\n",
" (\u0027此时女子还穿着白色的内裤\u0027, 0.007874015748031496),\n",
" (\u0027正沿着坂雪岗大道往南坪快速的方向缓慢地走着\u0027, 0.007874015748031496),\n",
" (\u0027当时正值上班高峰期\u0027, 0.007874015748031496),\n",
" (\u0027十字路口的车流已经排起了长队\u0027, 0.007874015748031496),\n",
" (\u0027当女子出现时\u0027, 0.007874015748031496),\n",
" (\u0027路上的市民纷纷驻足观望\u0027, 0.007874015748031496),\n",
" (\u0027不少车辆也放慢了速度\u0027, 0.007874015748031496),\n",
" (\u0027但女子并不为市民观望停下脚步\u0027, 0.007874015748031496),\n",
" (\u0027依然缓慢走着\u0027, 0.007874015748031496),\n",
" (\u0027当女子行进到十字路口中间时\u0027, 0.007874015748031496),\n",
" (\u0027一辆大货车挡住了镜头\u0027, 0.007874015748031496),\n",
" (\u0027但是当女子再次出现镜头时\u0027, 0.007874015748031496),\n",
" (\u0027可以发现女子已经没穿内裤了\u0027, 0.007874015748031496),\n",
" (\u0027全身裸露继续朝着南坪快速方向走去\u0027, 0.007874015748031496),\n",
" (\u0027记者发现\u0027, 0.007874015748031496),\n",
" (\u0027视频中女子周围并没有人尾随或者上前劝止的市民\u0027, 0.007874015748031496),\n",
" (\u0027一大清早路上看到这样的情况\u0027, 0.007874015748031496),\n",
" (\u0027恐怕大家都没办法淡定\u0027, 0.007874015748031496),\n",
" (\u0027面对这一情况\u0027, 0.007874015748031496),\n",
" (\u0027刘青表示\u0027, 0.007874015748031496),\n",
" (\u0027“一开始根本不敢看她\u0027, 0.007874015748031496),\n",
" (\u0027心里挺别扭\u0027, 0.007874015748031496),\n",
" (\u0027感觉很尴尬”\u0027, 0.007874015748031496),\n",
" (\u0027但当刘青跟随女子上了南坪快速路主干道时\u0027, 0.007874015748031496),\n",
" (\u0027女子作出了让人意想不到的举动\u0027, 0.007874015748031496),\n",
" (\u0027她突然靠近护栏要从上面跳下去\u0027, 0.007874015748031496),\n",
" (\u0027刘青赶忙冲上去拉住了女子的手\u0027, 0.007874015748031496),\n",
" (\u0027将其控制住并远离护栏\u0027, 0.007874015748031496),\n",
" (\u0027碍于女子没有穿衣服\u0027, 0.007874015748031496),\n",
" (\u0027刘青递上衣服\u0027, 0.007874015748031496),\n",
" (\u0027女子没接受还把衣服扔到排水沟里\u0027, 0.007874015748031496),\n",
" (\u0027继续往前走\u0027, 0.007874015748031496),\n",
" (\u0027没办法刘青只能紧紧拉着她的一只手跟在后面\u0027, 0.007874015748031496),\n",
" (\u0027刘青一路上耐心地开导安慰她\u0027, 0.007874015748031496),\n",
" (\u0027但只听到她不断地重复着一句话“要是你也遭遇我的事\u0027, 0.007874015748031496),\n",
" (\u0027你也会这样的”\u0027, 0.007874015748031496),\n",
" (\u0027期间她还不时试图挣脱刘青的手要冲向护栏往下跳\u0027, 0.007874015748031496),\n",
" (\u0027就这样\u0027, 0.007874015748031496),\n",
" (\u0027我被牵着走了大概十多分钟\u0027, 0.007874015748031496),\n",
" (\u0027天突然下起了大暴雨\u0027, 0.007874015748031496),\n",
" (\u0027雨大的连眼睛都睁不开”刘青继续说着\u0027, 0.007874015748031496),\n",
" (\u0027瞬间他们就被雨透了\u0027, 0.007874015748031496),\n",
" (\u0027但女子依然不愿意接受刘青的帮助\u0027, 0.007874015748031496),\n",
" (\u0027就继续冒着大雨往前走\u0027, 0.007874015748031496),\n",
" (\u0027大概走了有四十分钟吧\u0027, 0.007874015748031496),\n",
" (\u0027女子突然停下来说“我想回家了”\u0027, 0.007874015748031496),\n",
" (\u0027然后女子也接受了刘青递过来的小黄衣\u0027, 0.007874015748031496),\n",
" (\u0027就出现了深圳微博上的照片\u0027, 0.007874015748031496),\n",
" (\u0027女子披着小黄衣\u0027, 0.007874015748031496),\n",
" (\u0027刘青小心翼翼地在旁边走着的场景\u0027, 0.007874015748031496),\n",
" (\u0027从南平快速下来后\u0027, 0.007874015748031496),\n",
" (\u0027刘青和巡防员将女子带到了附近的坂田派出所\u0027, 0.007874015748031496),\n",
" (\u0027那姑娘到底是遭遇了什么样的事情\u0027, 0.007874015748031496),\n",
" (\u0027声称自己遭到了侵害\u0027, 0.007760391420088102),\n",
" (\u0027@深圳交警微博称:昨日清晨交警发现有一女子赤裸上身\u0027, 0.007760391420088101),\n",
" (\u0027暴雨中裸身奔走……\u0027, 0.006743520732558356),\n",
" (\u0027女子、被侵害、言语不清\u0027, 0.006743520732558355),\n",
" (\u0027原标题44岁女子跑深圳约会网友被拒\u0027, 0.005706295418150805),\n",
" (\u0027几个关键词令接到电话的民警瞬间紧张起来\u0027, 0.005706295418150804)]"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(ranking_sentence.items(), key\u003dlambda x: x[1], reverse\u003dTrue)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"keywords_graph \u003d get_connect_graph_by_text_rank(first_content, window\u003d5)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"ranking_words \u003d networkx.pagerank(keywords_graph)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 39553 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 40857 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 39553 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 40857 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20316 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20026 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20316 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20026 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21807 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 19968 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21807 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 19968 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 36890 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 36807 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 36890 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 36807 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26700 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 38754 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26700 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 38754 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24179 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21488 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24179 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21488 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 35748 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 35777 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 35748 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 35777 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 30340 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 30340 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 22788 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 29702 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 22120 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 22788 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 29702 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 22120 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 65292 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 65292 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 39640 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 39640 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24378 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 35843 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24378 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 35843 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 19981 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20250 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 19981 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20250 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 22240 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 22240 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21482 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 21482 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 32771 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 34385 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 32771 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 34385 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24615 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 33021 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24615 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 33021 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 32780 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 32780 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21435 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 21435 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 23631 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 34109 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 25481 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 23631 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 34109 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 25481 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 23567 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 23567 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26680 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24515 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26680 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24515 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 12290 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 12290 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 30456 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21453 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 30456 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21453 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20182 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20204 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20182 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20204 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 27491 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 27491 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 32852 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 25163 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 32852 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 25163 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24494 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 36719 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24494 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 36719 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 25214 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21040 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 25214 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21040 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 31181 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 31181 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 36866 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21512 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 36866 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21512 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 12289 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 12289 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20860 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 39038 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20860 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 39038 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21644 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 21644 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21151 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 32791 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21151 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 32791 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 23436 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 32654 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 23436 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 32654 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26041 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26696 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26041 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26696 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 25253 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 36947 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 25253 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 36947 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 31216 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 31216 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24050 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 32463 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24050 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 32463 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 25343 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 25343 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20102 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 20102 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20123 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20123 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26032 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 26032 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 28304 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 30721 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 28304 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 30721 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20197 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20415 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20197 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20415 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26356 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 22909 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26356 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 22909 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 22320 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 22320 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 35299 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 35299 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26550 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26500 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26550 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26500 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 36164 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26009 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 36164 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26009 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26174 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 31034 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26174 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 31034 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 27454 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 27454 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 38598 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 25104 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 38598 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 25104 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 22522 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24102 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 22522 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24102 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 34013 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 29273 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 34013 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 29273 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 27604 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 27604 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20256 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 32479 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20256 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 32479 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21487 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21487 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 33410 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 30465 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 33410 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 30465 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 33267 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 23569 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 33267 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 23569 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 31354 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 38388 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 31354 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 38388 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 25353 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 35745 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21010 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 25353 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 35745 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21010 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20170 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24180 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20170 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24180 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21326 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 30805 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21326 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 30805 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24800 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26222 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24800 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26222 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24819 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24819 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 23558 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 23558 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 39318 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21457 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 39318 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21457 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 30005 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 33041 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 30005 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 33041 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 39044 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 39044 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 22343 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 22343 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26159 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 26159 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20108 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20108 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24418 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24577 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24418 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24577 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20135 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 21697 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20135 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21697 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24403 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 28982 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24403 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 28982 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 21482 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26159 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20010 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 20010 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 24320 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 22987 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 24320 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 22987 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26410 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26469 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26410 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26469 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20063 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 35768 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20063 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 35768 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 36824 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 36824 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 33021 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 35265 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 35265 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 19977 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 26143 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 19977 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 26143 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 31185 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 31185 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 40594 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 40607 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 40594 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 40607 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 31859 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 23567 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 31859 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 28558 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 28227 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 28558 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 28227 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 31561 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:176: RuntimeWarning: Glyph 31561 missing from current font.\n",
" font.load_char(ord(s), flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 36827 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:211: RuntimeWarning: Glyph 20837 missing from current font.\n",
" font.set_text(s, 0.0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 36827 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n",
"c:\\python36\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:180: RuntimeWarning: Glyph 20837 missing from current font.\n",
" font.set_text(s, 0, flags\u003dflags)\n"
]
},
{
"data": {
"image/png": "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\u003d\n",
"text/plain": [
"\u003cFigure size 432x288 with 1 Axes\u003e"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import rcParams\n",
"rcParams[\u0027font.family\u0027] \u003d \u0027../data/SourceHanSerifSC-Regular.otf\u0027\n",
"networkx.draw_networkx(keywords_graph)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[(\u0027\u0027, 0.04971796909107254),\n",
" (\u0027的\u0027, 0.032169208603727614),\n",
" (\u0027。\u0027, 0.02860228225909264),\n",
" (\u0027、\u0027, 0.02771502328849811),\n",
" (\u0027骁龙\u0027, 0.017759850248184172),\n",
" (\u0027Windows\u0027, 0.015115542829056361),\n",
" (\u002710\u0027, 0.014661459543306039),\n",
" (\u0027835\u0027, 0.01417195081727616),\n",
" (\u0027桌面\u0027, 0.013938442660657342),\n",
" (\u0027平台\u0027, 0.012843338290542764)]"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(ranking_words.items(), key\u003dlambda x: x[1], reverse\u003dTrue)[:10]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"metadata": false,
"name": "#%% md\n"
}
},
"source": [
"一、文本预处理的常见步骤\n",
"\n",
"1.使用正则表达式去除文本多余的换行符及空格,数字及英文字母;\n",
"\n",
"2.文章分句:分句的依据为文章中出现句子结束符“.!?。!?”从而实现句子之间的切分;\n",
"\n",
"3.使用python的中文分词库jieba进行句子分词\n",
"\n",
"4.使用停用词表去除停用词;\n",
"\n",
"5.TF_IDF特征词提取\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"#### Task3 在Pycharm里边合并代码合并成一个单独的函数实现输入一篇文章输出该文本的摘要流程"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"`Jupyter Notebook`里边适合做中间结果的记录以及想法验证真正开发还是要在Pycharm等集成IDE里边进行"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## 使用词向量进行自动摘要"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q8. 使用词向量进行自动摘要的基本假设是什么? "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"**句子向量能够衡量句子之间的相似度,故而可以通过该方法判断某个句子是否和文本含义相关**"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"#### Task4. 使用普林斯顿2017年的sentence embedding方法进行句子embedding的构建"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q9. 该句子embedding的原理是什么有什么优势 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"第一步将句子里所有的词向量都乘以一个权重这个权重是a/a+frequency其中a是一个常数然后把所有的词向量相加得到一个简单的句向量。\n",
"\n",
"第二步将所有的句向量减去他们在句向量矩阵的主成分U的投影有点类似PCA然后得到的就是该句子的句向量。\n",
"\n",
"优点:快,无监督,性能好,运算简单"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"提示:频率,重要性,快速,性能好"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q10. embedding是什么 用数学的方式解释embedding。"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:将数据中个体原本之间的关系能够在低维空间上表示,同时能够用数学的方法来保留这些个体之间的相互关系"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"提示假设两个entity保持具有某种“偏序”特性可以比较那么将这两个 entity 投影到另外的空间中,在该空间中,这种“偏序”依然能够保持"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.63d0.793a.ff1a.5047.8bbe.4e24.4e2a.65.6e.74.69.74.79.4fdd.6301.5177.6709.67d0.79cd.201c.504f.5e8f.201d.7279.6027.ff0c.5373.ff0c.53ef.4ee5.6bd4.8f83.ff0c.90a3.4e48.ff0c.5c06.8fd9.4e24.4e2a.20.65.6e.74.69.74.79.20.6295.5f71.5230.53e6.5916.7684.7a7a.95f4.4e2d.ff0c.5728.8be5.7a7a.95f4.4e2d.ff0c.8fd9.79cd.201c.504f.5e8f.201d.4f9d.7136.80fd.591f.4fdd.6301.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q11. 除了word embedding sentence embedding embedding还可以应用到哪些场景"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:用户、商品。对于之间的关系描述性非常强,更加准确。"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"例如社交网络里边人员的embedding进行好友推荐 购物网站商品的embedding进行商品推荐\n",
"另外可以思考一下基于这种embedding的推荐的优点在哪里 "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.4f8b.5982.793e.4ea4.7f51.7edc.91cc.8fb9.4eba.5458.7684.65.6d.62.65.64.64.69.6e.67.ff08.8fdb.884c.597d.53cb.63a8.8350.ff09.ff0c.20.8d2d.7269.7f51.7ad9.5546.54c1.7684.65.6d.62.65.64.64.69.6e.67.ff08.8fdb.884c.5546.54c1.63a8.8350.ff09.a.53e6.5916.ff0c.53ef.4ee5.601d.8003.4e00.4e0b.57fa.4e8e.8fd9.79cd.65.6d.62.65.64.64.69.6e.67.7684.63a8.8350.7684.4f18.70b9.5728.54ea.91cc.ff1f.20.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q12. 这种embedding的方法和tfidf有何异同 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答tf-idf通过计算某个单字在一段文字中出现的频率与在全部文档中出现的频率来计算这个词出现的频率通常用来表示这个词对于一段文字的重要程度 embedding方法是计算这个词上下文中的词出现的概率通过这个矩阵来表示这个词的语义。"
]
},
{
"cell_type": "raw",
"metadata": {
"pycharm": {}
},
"source": [
"提示tfidf考虑的频率其 tf 和 idf 分别是什么? 该embedding的频率类似于什么 "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"hint(\u0027a.63d0.793a.ff1a.74.66.69.64.66.8003.8651.7684.9891.7387.5176.20.74.66.20.548c.20.69.64.66.20.5206.522b.662f.4ec0.4e48.ff1f.20.8be5.65.6d.62.65.64.64.69.6e.67.7684.9891.7387.7c7b.4f3c.4e8e.4ec0.4e48.ff1f.20.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q13. 构建句子想了的过程中,面对未知的单词,如果解决?"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:省略、随机值、古德-图灵法"
]
},
{
"cell_type": "raw",
"metadata": {
"pycharm": {}
},
"source": [
"提示:开发型问题,可以省略,可以赋予随机值,可以给一特定值,具体情况需要经过试验进行分析"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.5f00.53d1.578b.95ee.9898.ff0c.53ef.4ee5.7701.7565.ff0c.53ef.4ee5.8d4b.4e88.968f.673a.503c.ff0c.53ef.4ee5.7ed9.4e00.7279.5b9a.503c.ff0c.5177.4f53.60c5.51b5.9700.8981.7ecf.8fc7.8bd5.9a8c.8fdb.884c.5206.6790.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q14. 构建完成句子向量之后,句子相似度如何判断? "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:计算两个矩阵的余弦距离(cosine余弦距离)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.63.6f.73.69.6e.65.ff0c.20.4f59.5f26.8ddd.79bb.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q15. 为什么要用cosine距离进行判断为何不用欧几里得 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答:\n"
]
},
{
"cell_type": "raw",
"metadata": {
"pycharm": {}
},
"source": [
"提示请参考word2vec训练时候的的概率分布的定义可以看到其loss当时优化的就是 exp(v1 . v2), 那么当 v1 . v2最大的时候\n",
"就是这两个向量方向一致的时候所以该词向量在训练的时候的loss的衡量就是依据方向进行的。 "
]
},
{
"cell_type": "raw",
"metadata": {
"pycharm": {}
},
"source": [
"另外,也不是不能用欧几里得,但是依据上一提示之分析,欧几里得是不能很好保持语义相似性的。"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"pycharm": {
"metadata": false,
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def cosine_similarity(vec1, vec2):\n",
" \u0027\u0027\u0027\n",
" 计算两个向量之间的余弦相似度\n",
" :param vec1:\n",
" :param vec2:\n",
" :return:\n",
" \u0027\u0027\u0027\n",
" tx \u003d np.array(vec1)\n",
" ty \u003d np.array(vec2)\n",
" cos1 \u003d np.sum(tx * ty)\n",
" cos21 \u003d np.sqrt(sum(tx ** 2))\n",
" cos22 \u003d np.sqrt(sum(ty ** 2))\n",
" cosine_value \u003d cos1 / float(cos21 * cos22)\n",
" return cosine_value\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.63d0.793a.ff1a.8bf7.53c2.8003.77.6f.72.64.32.76.65.63.8bad.7ec3.65f6.5019.7684.7684.6982.7387.5206.5e03.7684.5b9a.4e49.ff0c.53ef.4ee5.770b.5230.5176.6c.6f.73.73.5f53.65f6.4f18.5316.7684.5c31.662f.20.65.78.70.28.76.31.20.2e.20.76.32.29.2c.20.90a3.4e48.5f53.20.76.31.20.2e.20.76.32.6700.5927.7684.65f6.5019.ff0c.a.5c31.662f.8fd9.4e24.4e2a.5411.91cf.65b9.5411.4e00.81f4.7684.65f6.5019.ff0c.6240.4ee5.ff0c.8be5.8bcd.5411.91cf.5728.8bad.7ec3.7684.65f6.5019.7684.6c.6f.73.73.7684.8861.91cf.ff0c.5c31.662f.4f9d.636e.65b9.5411.8fdb.884c.7684.3002.20.a\u0027)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.53e6.5916.ff0c.4e5f.4e0d.662f.4e0d.80fd.7528.6b27.51e0.91cc.5f97.ff0c.4f46.662f.4f9d.636e.4e0a.4e00.63d0.793a.4e4b.5206.6790.ff0c.6b27.51e0.91cc.5f97.662f.4e0d.80fd.5f88.597d.4fdd.6301.8bed.4e49.76f8.4f3c.6027.7684.3002.20.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q16. cosine距离的时候如果两个向量的长度区别很大但是方向类似cosine的距离是小还是大 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"回答cosine只考虑“方向“是否一样"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u002763.6f.73.69.6e.65.53ea.8003.8651.201c.65b9.5411.201c.662f.5426.4e00.6837\u0027)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#先将所有的词向量都乘以一个常数alpha然后将它们相加之后再通过PCA提取他们的句向量\n",
"\n",
"def sentence_embedding(sentence, cut\u003dcut):\n",
" # weight \u003d alpah/(alpah + p) \n",
" # alpha is a parameter, 1e-3 ~ 1e-5\n",
" alpha \u003d 1e-4\n",
" \n",
" global frequence\n",
" \n",
" max_fre \u003d max(frequence.values())\n",
" \n",
" words \u003d cut(sentence).split()\n",
" \n",
" sentence_vec \u003d np.zeros_like(model.wv[\u0027测试\u0027])\n",
" \n",
" words \u003d [w for w in words if w in model]\n",
" \n",
" for w in words:\n",
" weight \u003d alpha / (alpha + frequence.get(w, max_fre))\n",
" sentence_vec +\u003d weight * model.wv[w]\n",
" \n",
" sentence_vec /\u003d len(words)\n",
" # Skip the PCA\n",
" return sentence_vec"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"from scipy.spatial.distance import cosine\n",
"from functools import partial\n",
"def get_corrlations(text, cut_fn):\n",
" if isinstance(text, list): text \u003d \u0027 \u0027.join(text)\n",
" \n",
" sub_sentences \u003d split_sentence(text)\n",
" sentence_vector \u003d sentence_embedding(text, cut_fn)\n",
" \n",
" correlations \u003d {}\n",
" \n",
" for sub_sentence in sub_sentences:\n",
" sub_sen_vec \u003d sentence_embedding(sub_sentence, cut_fn)\n",
" correlation \u003d cosine(sentence_vector, sub_sen_vec)\n",
" correlations[sub_sentence]\u003d correlation\n",
"\n",
" return sorted(correlations.items(), key\u003dlambda x: x[1], reverse\u003dTrue)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"corrlations_with_global_cut \u003d partial(get_corrlations, cut_fn\u003dcut)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"def get_summarization_simple_by_sen_embedding(text, constraint\u003d200):\n",
" return get_summarization_simple(text, corrlations_with_global_cut, constraint)"
]
},
{
"cell_type": "code",
"execution_count": 127,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\ipykernel_launcher.py:16: DeprecationWarning: Call to deprecated `__contains__` (Method will be removed in 4.0.0, use self.wv.__contains__() instead).\n",
" app.launch_new_instance()\n"
]
}
],
"source": [
"corrlations \u003d get_corrlations(sharp_news, cut)"
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"\u0027虽然至今夏普智能手机在市场上无法排得上号已经完全没落并于 2013 年退出中国市场,但是今年 3 月份官方突然宣布回归中国,预示着很快就有夏普新机在中国登场了。那么,第一款夏普手机什么时候登陆中国呢?又会是怎么样的手机呢?\\r\\n近日一款型号为 FS8016 的夏普神秘新机悄然出现在 GeekBench 的跑分库上。从其中相关信息了解到,这款机子并非旗舰定位,所搭载的是高通骁龙 660 处理器,配备有 4GB 的内存。骁龙 660 是高通今年最受瞩目的芯片之一,采用 14 纳米工艺,八个 Kryo 260 核心设计,集成 Adreno 512 GPU 和 X12 LTE 调制解调器。\\r\\n当前市面上只有一款机子采用了骁龙 660 处理器,那就是已经上市销售的 OPPO R11。骁龙 660 尽管并非旗舰芯片,但在多核新能上比去年骁龙 820 强,单核改进也很明显,所以放在今年仍可以让很多手机变成高端机。不过,由于 OPPO 与高通签署了排他性协议,可以独占两三个月时间。\\r\\n考虑到夏普既然开始测试新机了说明只要等独占时期一过夏普就能发布骁龙 660 新品了。按照之前被曝光的渲染图了解,夏普的新机核心竞争优势还是全面屏,因为从 2013 年推出全球首款全面屏手机 EDGEST 302SH 至今,夏普手机推出了多达 28 款的全面屏手机。\\r\\n在 5 月份的媒体沟通会上惠普罗忠生表示“我敢打赌12 个月之后,在座的各位手机都会换掉。因为全面屏时代的到来,我们怀揣的手机都将成为传统手机。”\\r\\n\u0027"
]
},
"execution_count": 128,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sharp_news"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"data": {
"text/plain": [
"[(\u002728\u0027, 1.016034135594964),\n",
" (\u00275\u0027, 1.0141534013673663),\n",
" (\u0027Kryo\u0027, 0.9813904333859682),\n",
" (\u002714\u0027, 0.9812515676021576),\n",
" (\u0027X12\u0027, 0.944944329559803),\n",
" (\u00273\u0027, 0.9362230375409126),\n",
" (\u0027Adreno\u0027, 0.9205908104777336),\n",
" (\u0027R11\u0027, 0.8780125975608826),\n",
" (\u0027GeekBench\u0027, 0.8449447751045227),\n",
" (\u0027512\u0027, 0.8348383456468582),\n",
" (\u0027和\u0027, 0.8271111249923706),\n",
" (\u0027260\u0027, 0.755718469619751),\n",
" (\u00272013\u0027, 0.7396700978279114),\n",
" (\u0027的跑分库上\u0027, 0.7396254241466522),\n",
" (\u0027在\u0027, 0.7283863425254822),\n",
" (\u0027FS8016\u0027, 0.722855269908905),\n",
" (\u0027302SH\u0027, 0.7159470021724701),\n",
" (\u0027新品了\u0027, 0.6967576444149017),\n",
" (\u0027”\u0027, 0.6781797707080841),\n",
" (\u0027660\u0027, 0.6705841720104218),\n",
" (\u0027调制解调器\u0027, 0.6603162884712219),\n",
" (\u0027820\u0027, 0.656488835811615),\n",
" (\u0027EDGEST\u0027, 0.644380509853363),\n",
" (\u0027月份的媒体沟通会上惠普罗忠生表示“我敢打赌12\u0027, 0.6281294524669647),\n",
" (\u0027不过由于\u0027, 0.5738721489906311),\n",
" (\u0027又会是怎么样的手机呢\u0027, 0.5254146158695221),\n",
" (\u0027LTE\u0027, 0.4806997776031494),\n",
" (\u0027与高通签署了排他性协议可以独占两三个月时间\u0027, 0.46851474046707153),\n",
" (\u0027个月之后在座的各位手机都会换掉\u0027, 0.4561747908592224),\n",
" (\u00274GB\u0027, 0.4518991708755493),\n",
" (\u0027纳米工艺八个\u0027, 0.4441490173339844),\n",
" (\u0027GPU\u0027, 0.43543368577957153),\n",
" (\u0027的夏普神秘新机悄然出现在\u0027, 0.4312923550605774),\n",
" (\u0027年退出中国市场但是今年\u0027, 0.42829495668411255),\n",
" (\u0027核心设计集成\u0027, 0.39412999153137207),\n",
" (\u0027骁龙\u0027, 0.3783636689186096),\n",
" (\u0027OPPO\u0027, 0.3694418668746948),\n",
" (\u0027处理器配备有\u0027, 0.36644911766052246),\n",
" (\u0027月份官方突然宣布回归中国预示着很快就有夏普新机在中国登场了\u0027, 0.3652356266975403),\n",
" (\u0027的内存\u0027, 0.34972482919692993),\n",
" (\u0027那么第一款夏普手机什么时候登陆中国呢\u0027, 0.30330872535705566),\n",
" (\u0027近日一款型号为\u0027, 0.2991504669189453),\n",
" (\u0027是高通今年最受瞩目的芯片之一采用\u0027, 0.29484617710113525),\n",
" (\u0027至今夏普手机推出了多达\u0027, 0.28605204820632935),\n",
" (\u0027年推出全球首款全面屏手机\u0027, 0.24424141645431519),\n",
" (\u0027因为全面屏时代的到来我们怀揣的手机都将成为传统手机\u0027, 0.24134373664855957),\n",
" (\u0027虽然至今夏普智能手机在市场上无法排得上号已经完全没落并于\u0027, 0.24057024717330933),\n",
" (\u0027强单核改进也很明显所以放在今年仍可以让很多手机变成高端机\u0027, 0.2193922996520996),\n",
" (\u0027尽管并非旗舰芯片但在多核新能上比去年骁龙\u0027, 0.19502663612365723),\n",
" (\u0027当前市面上只有一款机子采用了骁龙\u0027, 0.18982809782028198),\n",
" (\u0027款的全面屏手机\u0027, 0.18976688385009766),\n",
" (\u0027从其中相关信息了解到这款机子并非旗舰定位所搭载的是高通骁龙\u0027, 0.15708070993423462),\n",
" (\u0027按照之前被曝光的渲染图了解夏普的新机核心竞争优势还是全面屏因为从\u0027, 0.1554616093635559),\n",
" (\u0027处理器那就是已经上市销售的\u0027, 0.14474469423294067),\n",
" (\u0027考虑到夏普既然开始测试新机了说明只要等独占时期一过夏普就能发布骁龙\u0027, 0.13174527883529663)]"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"corrlations"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"# 将列表元组转换为字典形式\n",
"# corrlations \u003d dict(corrlations)"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\ipykernel_launcher.py:16: DeprecationWarning: Call to deprecated `__contains__` (Method will be removed in 4.0.0, use self.wv.__contains__() instead).\n",
" app.launch_new_instance()\n"
]
},
{
"data": {
"text/plain": [
"\u00272013。 年退出中国市场,但是今年。 3。 又会是怎么样的手机呢。 FS8016。 的夏普神秘新机悄然出现在。 GeekBench。 的跑分库上。 660。 4GB。 660。 14。 纳米工艺,八个。 Kryo。 260。 核心设计,集成。 Adreno。 512。 GPU。 和。 X12。 LTE。 调制解调器。 660。 R11。 660。 820。 不过,由于。 与高通签署了排他性协议,可以独占两三个月时间。 660。 新品了。 2013。 EDGEST。 302SH。 28。 在。 5。 月份的媒体沟通会上惠普罗忠生表示“我敢打赌12。 个月之后,在座的各位手机都会换掉。 ”\u0027"
]
},
"execution_count": 131,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sharp_news \u003d pure_content.iloc[6][\u0027content\u0027]\n",
"\u0027。 \u0027.join(get_summarization_simple_by_sen_embedding(sharp_news, constraint\u003d200))"
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\ipykernel_launcher.py:16: DeprecationWarning: Call to deprecated `__contains__` (Method will be removed in 4.0.0, use self.wv.__contains__() instead).\n",
" app.launch_new_instance()\n"
]
}
],
"source": [
"corrlations \u003d get_corrlations(sharp_news, cut)"
]
},
{
"cell_type": "code",
"execution_count": 143,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"corrlations_with_global_cut \u003d partial(get_corrlations, cut_fn\u003dcut)"
]
},
{
"cell_type": "code",
"execution_count": 144,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"def split_sentence(sentence):\n",
" pattern \u003d re.compile(\u0027[。,,.]\u0027)\n",
" split \u003d pattern.sub(\u0027 \u0027, sentence).split() # split sentence\n",
" return split"
]
},
{
"cell_type": "code",
"execution_count": 145,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"def get_sequent_correlation(text):\n",
" sub_sentence \u003d split_sentence(text)\n",
" corrleations \u003d corrlations_with_global_cut(sub_sentence)\n",
" correlation_with_sequent \u003d [(sen, corrlations[sen]) for sen in sub_sentence]\n",
" return correlation_with_sequent"
]
},
{
"cell_type": "code",
"execution_count": 146,
"metadata": {
"pycharm": {}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python36\\lib\\site-packages\\ipykernel_launcher.py:16: DeprecationWarning: Call to deprecated `__contains__` (Method will be removed in 4.0.0, use self.wv.__contains__() instead).\n",
" app.launch_new_instance()\n"
]
},
{
"ename": "AttributeError",
"evalue": "\u0027list\u0027 object has no attribute \u0027items\u0027",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m\u003cipython-input-146-1b5f0a80968e\u003e\u001b[0m in \u001b[0;36m\u003cmodule\u003e\u001b[1;34m\u001b[0m\n\u001b[1;32m----\u003e 1\u001b[1;33m \u001b[0msub_sentence\u001b[0m \u001b[1;33m\u003d\u001b[0m \u001b[0mget_sequent_correlation\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msharp_news\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0msub_sentence\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m\u003cipython-input-145-eb59d122b975\u003e\u001b[0m in \u001b[0;36mget_sequent_correlation\u001b[1;34m(text)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mget_sequent_correlation\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0msub_sentence\u001b[0m \u001b[1;33m\u003d\u001b[0m \u001b[0msplit_sentence\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----\u003e 3\u001b[1;33m \u001b[0mcorrleations\u001b[0m \u001b[1;33m\u003d\u001b[0m \u001b[0mcorrlations_with_global_cut\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msub_sentence\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mcorrelation_with_sequent\u001b[0m \u001b[1;33m\u003d\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcorrlations\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0msen\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0msen\u001b[0m \u001b[1;32min\u001b[0m \u001b[0msub_sentence\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mcorrelation_with_sequent\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m\u003cipython-input-141-9aea96e7ce9e\u003e\u001b[0m in \u001b[0;36mget_corrlations\u001b[1;34m(text, cut_fn)\u001b[0m\n\u001b[0;32m 12\u001b[0m \u001b[0mcorrelations\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0msub_sentence\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u003d\u001b[0m \u001b[0mcorrelation\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---\u003e 14\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0msorted\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcorrlations\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m\u003d\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreverse\u001b[0m\u001b[1;33m\u003d\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m: \u0027list\u0027 object has no attribute \u0027items\u0027"
]
}
],
"source": [
"sub_sentence \u003d get_sequent_correlation(sharp_news)\n",
"sub_sentence"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"#### Task15 基于Sentene Embedding 在pycharm里边完成句子摘要的完整过程"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q17. 找出几个句子进行plot 解释其与全文的相关性的排序"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"请阐述:"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q18. 不同类型的文章,例如时政,财经,社会,故事,其相关性分布有何区别? "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"请阐述:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.63d0.793a.ff1a.53ef.4ee5.4ece.5176.5206.5e03.7684.5bc6.5ea6.ff0c.5206.5e03.53d8.5316.7b49.8d8b.52bf.8fdb.884c.89c2.5bdf.3002.a\u0027)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## More Added Feature"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"### KNN思想"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"\u003e 对于一个sub_sentence来说它的重要性取决于他本身的重要性和周围的句子(neighbors)的重要性的综合;"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"例如,当我们有一个列表是 [1, 1, 2, 3, 8, 1, 2]的时候,其中的 8 数值太大,这在我们的摘要中的表现为,该句子周围的句子都是不那么相关的,但是该句子单独的相关性很高。 那么,如果把这个句子摘录进来,就会导致“不通顺”. 我们可以采用KNN的思想将这个列表进行重新计算让它每一个元素的值等于自己的值和周围的几个值的一个计算结果。 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q19. 如何使用KNN思想进行“平滑”操作? 请代码实现"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": "回答:\n\n我们会发现句子的评分分布是这样起伏很大的尖锐曲线这样抽取的句子会断断续续显得很突兀因此我们需要根据句子自身的重要性和周围句子的重要性结合KNN算法使得结果更加平滑。\n\n`请补全代码:`\n```\nL \u003d []\ndef knn_smooth(): pass\n\n```"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.23.4e00.4e2a.53ef.4ee5.7684.73.6f.6c.75.74.69.6f.6e.662f.ff1a.a.a.4c.20.3d.20.5b.31.2c.20.32.2c.20.33.2c.20.34.2c.20.31.30.2c.20.31.2c.20.32.5d.a.77.69.6e.64.6f.77.20.3d.20.33.a.a.4c.20.3d.20.5b.6e.70.2e.6d.65.61.6e.28.4c.5b.69.2d.77.69.6e.64.6f.77.3a.69.2b.77.69.6e.64.6f.77.5d.29.20.66.6f.72.20.69.20.69.6e.20.72.61.6e.67.65.28.6c.65.6e.28.4c.29.29.5d.a.23.20.5f53.7136.ff0c.8fd9.91cc.7684.6e.70.2e.6d.65.61.6e.662f.4e00.79cd.6700.7b80.5355.7684.5e73.5747.5316.65b9.6cd5.ff0c.6211.4eec.8fd8.53ef.4ee5.8003.8651.5176.4ed6.7684.4f8b.5982.8ddd.79bb.52a0.6743.ff0c.7b49.65b9.6cd5.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"### Title 标题"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"\u003e 如果一个文章有标题,那么,其实这个标题已经包含了很多它的摘要信息, 在考虑语义建模的时候,就应该对标题更加重要的考虑;"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"如果该文本有标题那么标题可以帮助我们很多。在之前我们计算每个句子与文章整体的相似度是对每个子句与整体文章进行相似度距离计算那么我们这个时候就可以把标题的embedding结果拿出来那么每句话的相似度就是这句话与整体文章的相似度和标题的相似度的一个“结合”。"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"Q20. 请代码实现这一思路。"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": "回答:\n\n如果你文本存在标题那么标题已经包含了其中的重要信息摘要时应当把标题考虑进去。\n"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {}
},
"outputs": [],
"source": [
"#hint(\u0027a.74.69.74.6c.65.20.3d.20.27.73.6f.6d.65.20.77.6f.72.64.73.27.a.63.6f.6e.74.65.6e.74.20.3d.20.27.6d.6f.72.65.20.61.6e.64.20.6d.6f.72.65.20.77.6f.72.64.73.27.a.73.65.6e.74.65.6e.65.5f.76.65.63.5f.74.69.74.6c.65.20.3d.20.67.65.74.5f.73.65.6e.74.65.6e.63.65.5f.76.65.63.28.74.69.74.6c.65.29.a.73.65.6e.74.65.6e.65.5f.76.65.63.5f.63.6f.6e.74.65.6e.74.20.3d.20.67.65.74.5f.73.65.6e.74.65.6e.63.65.5f.76.65.63.28.63.6f.6e.74.65.6e.74.29.a.23.5bf9.4e8e.4e00.4e2a.5b50.53e5.20.73.75.62.5f.73.65.6e.5f.6e.2c.20.4ee5.524d.7684.73.69.6d.69.6c.61.72.69.74.79.662f.20.63.6f.73.69.6e.65.28.67.65.74.5f.73.65.6e.74.65.6e.65.5f.76.65.63.28.73.75.62.5f.73.65.6e.5f.6e.29.2c.20.73.65.6e.74.65.6e.65.5f.76.65.63.5f.63.6f.6e.74.65.6e.74.29.a.23.73b0.5728.53ef.4ee5.662f.a.70.20.3d.20.30.2e.35.a.73.65.6e.5f.76.65.63.20.3d.20.67.65.74.5f.73.65.6e.74.65.6e.65.5f.76.65.63.28.73.75.62.5f.73.65.6e.5f.6e.29.a.73.69.6d.69.6c.61.72.69.74.79.20.3d.20.70.20.2a.20.63.6f.73.69.6e.65.28.73.65.6e.5f.76.65.63.2c.20.73.65.6e.74.65.6e.65.5f.76.65.63.5f.74.69.74.6c.65.29.20.2b.20.28.31.20.2d.20.70.29.20.2a.20.63.6f.73.69.6e.65.28.73.65.6e.5f.76.65.63.2c.20.73.65.6e.74.65.6e.65.5f.76.65.63.5f.63.6f.6e.74.65.6e.74.29.a.23.20.5f53.7136.ff0c.8fd9.91cc.7684.70.4ee5.53ca.70.548c.63.6f.73.69.6e.65.7684.6784.5efa.90fd.662f.53ef.4ee5.53d8.5316.7684.3002.20.70.20.548c.20.31.2d.70.662f.7ebf.6027.5173.7cfb.ff0c.53ef.4ee5.662f.5176.4ed6.7684.5173.7cfb.3002.81ea.5df1.5b9a.5373.53ef.a\u0027)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"### Keywords 关键字"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"\u003e 关键字是很重要的,如果我们能够比较准确的提取出来关键词/字,然后对关键字/词包含的句子增加其权重;"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"对整篇文章提取关键字该关键字可以通过TextRank或者tfidf或者gensim自带的包进行提取。 然后对包含了关键词的句子进行手动加权"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": "#### Task 请代码实现\n\n在文本中存在关键词的句子往往包含了比较重要的信息当一个句子包含比关键词时应适当增加此句子的评分。\n"
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"### Position 位置信息"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"对于句子而言,如果其出现在段落开端,结尾,是否是重要的? 请做实验证明之,并且代码进行改进。 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"\u003e 对于一些文本文章例如一个故事的这种文章那么他的textRank sentence embedding 会发现并不会出现很明显有些句子是重要的有些句子不重要的如果plot他的曲线的话我们这个时候就要考虑他的位置开头结尾增加一些权重"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": "#### Task 加入位置信息的考量\n\n在阅读理解时开头、结尾、段首和段尾等几乎都起着总领全文、总结或承上启下的作用在摘要时必须也要把句子的位置考虑进去。\n"
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"### Topic 主题信息"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": "自学Gensim LDA的使用方法对于文章获得其主题然后依据主题对每个句子进行判断每个句子是否和该主题相关。 \n参考网站 \n1. Google Search Gensim LDA\n2. https://github.com/xiaoyichao/-python-gensim-LDA-/blob/master/topicmodel3.py\n\n【参考地址】https://blog.csdn.net/Yellow_python/article/details/83097994\n![gensim_LDA流程](https://img-blog.csdn.net/20181021090249778?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1llbGxvd19weXRob24\u003d/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA\u003d\u003d/dissolve/70)\n"
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": "\u003e LDA主题模型得到的主题分布我们可以用每句话和的出来的这些主题进行相似度对比我们不仅仅是是考虑他的整个的text 我们还有考虑主题;\n\n根据LDA总结出来的话题我们可以用分句与其对比把话题也考虑到摘要中。\n"
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"#### Task 合并以上功能,实现一个单独的函数,该函数接受一个长文本和字数限制,输出一个短文中"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## Questions 思考题:"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"1. 除了Sentence Embedding和TextRank, 还有什么方案?"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"2. 为什么这个课题不用Seq2Seq?"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"3. 深度学习、机器学习与NLP之间的关系是什么 "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"4. 你还有什么其他的思考和心得? "
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {}
},
"source": [
"## 最后一步: 使用Flask、Bottle、Bootstrap变成一个网络应用并且部署在服务器上这样别人就可以直接通过网址访问你的应用啦。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}