├── flask ├── app │ ├── templates │ │ ├── base.html │ │ ├── form.html │ │ ├── review_extraction.html │ │ └── index.html │ ├── static │ │ └── images │ │ │ ├── 对话情绪识别.PNG │ │ │ ├── 情感倾向分析.PNG │ │ │ ├── 文章分类.PNG │ │ │ ├── 文章标签管理.PNG │ │ │ ├── 新闻摘要.PNG │ │ │ ├── 自主纠错.PNG │ │ │ └── 评论观点提取.PNG │ ├── __init__.py │ ├── forms.py │ ├── forms.py.bak │ ├── routes.py │ └── review_content.py ├── .gitattributes ├── config.py ├── myproject.py ├── cws.model ├── ner.model ├── pisrl.model ├── pos.model ├── merge_corpus ├── parser.model ├── merge_corpus.model ├── merge_corpus.model.wv.vectors.npy ├── merge_corpus.model.trainables.syn1neg.npy ├── md5.txt ├── review_content.py └── stopwords.txt ├── Home.PNG ├── pro1.png ├── pro1_1.png ├── review_content.PNG ├── 基于语义角色分析的事件抽取技术.pdf ├── 汉语语篇中人称指代消歧研究.pdf ├── templates ├── .ss.html.swp ├── hello.html ├── use_template.html ├── testform.html ├── pvuv.html ├── demo1.html ├── qunliao.html ├── web_sckone.html ├── base.html ├── index.html ├── index.html.bak ├── autoSummary.html ├── news-extraction.html └── ss.html ├── .gitattributes ├── git lfs传输大文件的经历.md ├── app.py ├── pickup.py └── README.md /flask/app/templates/base.html: -------------------------------------------------------------------------------- 1 | {% extends "bootstrap/base.html" %} 2 | -------------------------------------------------------------------------------- /flask/.gitattributes: -------------------------------------------------------------------------------- 1 | flask/cws.model filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /Home.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/Home.PNG -------------------------------------------------------------------------------- /pro1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/pro1.png -------------------------------------------------------------------------------- /pro1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/pro1_1.png -------------------------------------------------------------------------------- /review_content.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/review_content.PNG -------------------------------------------------------------------------------- /基于语义角色分析的事件抽取技术.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/基于语义角色分析的事件抽取技术.pdf -------------------------------------------------------------------------------- /汉语语篇中人称指代消歧研究.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/汉语语篇中人称指代消歧研究.pdf -------------------------------------------------------------------------------- /templates/.ss.html.swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/templates/.ss.html.swp -------------------------------------------------------------------------------- /flask/config.py: -------------------------------------------------------------------------------- 1 | class Config(object): 2 | #设置密匙要没有规律,别被人轻易猜到哦 3 | SECRET_KEY = 'a9087FFJFF9nnvc2@#$%FSD' 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | flask/*.model filter=lfs diff=lfs merge=lfs -text 2 | flask/merge_corpus* filter=lfs diff=lfs merge=lfs -text 3 | -------------------------------------------------------------------------------- /flask/app/static/images/对话情绪识别.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/flask/app/static/images/对话情绪识别.PNG -------------------------------------------------------------------------------- /flask/app/static/images/情感倾向分析.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/flask/app/static/images/情感倾向分析.PNG -------------------------------------------------------------------------------- /flask/app/static/images/文章分类.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/flask/app/static/images/文章分类.PNG -------------------------------------------------------------------------------- /flask/app/static/images/文章标签管理.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/flask/app/static/images/文章标签管理.PNG -------------------------------------------------------------------------------- /flask/app/static/images/新闻摘要.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/flask/app/static/images/新闻摘要.PNG -------------------------------------------------------------------------------- /flask/app/static/images/自主纠错.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/flask/app/static/images/自主纠错.PNG -------------------------------------------------------------------------------- /flask/app/static/images/评论观点提取.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/HEAD/flask/app/static/images/评论观点提取.PNG -------------------------------------------------------------------------------- /flask/myproject.py: -------------------------------------------------------------------------------- 1 | #从app模块中导入app应用 2 | from app import app 3 | 4 | #防止被引用后执行,只有在当前模块中才可以使用 5 | if __name__=='__main__': 6 | app.run(debug=True) 7 | -------------------------------------------------------------------------------- /flask/cws.model: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4794f4e6736fa4792efaf17e4a9d0e9bb2d5e4d62250888dd46d36122c954aae 3 | size 182672934 4 | -------------------------------------------------------------------------------- /flask/ner.model: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:df56f7e794887b06726986e04b429a0b65d99a2126c0a3d61ab452e952a45649 3 | size 22091814 4 | -------------------------------------------------------------------------------- /flask/pisrl.model: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:91c0d155f77b4285241ccc4057cebcc7c0879c341ef31661d83326f7ae0616db 3 | size 196372381 4 | -------------------------------------------------------------------------------- /flask/pos.model: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c64a7fab77f509c8215733370722be49211fd21de6926a8618772b4019f97f3b 3 | size 433443857 4 | -------------------------------------------------------------------------------- /flask/merge_corpus: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e4aeed16c0c405f8f1553f7a15a6dc608d6b9252858712527365d2e21b575c9d 3 | size 1077822031 4 | -------------------------------------------------------------------------------- /flask/parser.model: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e4c4c486bdc0b985ce00b3f42c357e70a3c54f7d08a7e1ee16a3f0c6b59ecd35 3 | size 367819616 4 | -------------------------------------------------------------------------------- /flask/merge_corpus.model: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fd8fa95654ab6cf86b88078f748b209f5de38e77dccdea20ceb23a1accf6abcd 3 | size 44823913 4 | -------------------------------------------------------------------------------- /flask/merge_corpus.model.wv.vectors.npy: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9ec9c111dd2f4ef078e56be920d2f84fd5a96f5fa20144706128f1a2a61ae108 3 | size 688891128 4 | -------------------------------------------------------------------------------- /flask/merge_corpus.model.trainables.syn1neg.npy: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6f8a2e1fe5157b786215ff7a68ecb4d4fed91b28daca88ff0015864e8e0db319 3 | size 688891128 4 | -------------------------------------------------------------------------------- /flask/app/templates/form.html: -------------------------------------------------------------------------------- 1 |
2 |

用户名:

3 |

4 |
5 | -------------------------------------------------------------------------------- /templates/hello.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 |

"hello world 2"

9 | 10 | -------------------------------------------------------------------------------- /flask/md5.txt: -------------------------------------------------------------------------------- 1 | MD5 (cws.model) = 88c35b61c437c0b92683b4fa17f11f03 2 | MD5 (ner.model) = 6599ec38c1a3b564b6743fa044892e6e 3 | MD5 (parser.model) = f1d5daa61cac15167517a60740a95c0b 4 | MD5 (pisrl.model) = 7c31be2573b9eaa13def19698d21ae6c 5 | MD5 (pos.model) = 423d6adc4b174bf44958905078da6a1c 6 | -------------------------------------------------------------------------------- /flask/app/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask import Flask, request, render_template, session, redirect 3 | #创建app应用,__name__是python预定义变量,被设置为使用本模块. 4 | from app import review_content 5 | 6 | from config import Config 7 | app = Flask(__name__) 8 | app.config.from_object(Config) 9 | 10 | from app import routes 11 | -------------------------------------------------------------------------------- /flask/app/forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField,PasswordField,BooleanField,SubmitField 3 | from wtforms.validators import DataRequired 4 | 5 | class NameForm(FlaskForm): 6 | #DataRequired,当你在当前表格没有输入而直接到下一个表格时会提示你输入 7 | name = StringField('Input News in Chinese',validators=[DataRequired(message='Input NEWs')]) 8 | submit = SubmitField('Submit') 9 | -------------------------------------------------------------------------------- /templates/use_template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 |

{{ title }}

> 9 | {% for data in datas %} 10 | {% if data[0] != 2 %} 11 |

12 | {{data[0]}} - {{data[1]}} 13 |

14 | {% endif %} 15 | {% endfor %} 16 | 17 | -------------------------------------------------------------------------------- /flask/app/forms.py.bak: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField,PasswordField,BooleanField,SubmitField 3 | from wtforms.validators import DataRequired 4 | 5 | class LoginForm(FlaskForm): 6 | #DataRequired,当你在当前表格没有输入而直接到下一个表格时会提示你输入 7 | username = StringField('用户名',validators=[DataRequired(message='请输入名户名')]) 8 | password = PasswordField('密码',validators=[DataRequired(message='请输入密码')]) 9 | remember_me = BooleanField('记住我') 10 | submit = SubmitField('登录') 11 | -------------------------------------------------------------------------------- /templates/testform.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | test about javascript 4 | 11 | 12 |
13 |
14 |
15 | 16 |
17 | 18 | -------------------------------------------------------------------------------- /templates/pvuv.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 网站信息点击 6 | 7 | 8 |

网站的PVUV数据

9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {% for row in data %} 18 | 19 | 20 | 21 | 22 | 23 | {% endfor %} 24 |
日期PVUV
{{row[0]}} {{row[1]}} {{row[2]}}
25 |
26 | 27 | -------------------------------------------------------------------------------- /templates/demo1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Simple Grid 7 | 8 | 9 | 10 | 16 | 17 | 18 | 19 | 20 | 29 |
30 | 31 |
32 | 33 | 34 | > 35 | 36 | -------------------------------------------------------------------------------- /templates/qunliao.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 群聊 6 | 7 | 8 |

9 | 10 | 11 |

12 | 13 |
14 | 15 |
16 | 17 | 33 | 34 | -------------------------------------------------------------------------------- /git lfs传输大文件的经历.md: -------------------------------------------------------------------------------- 1 | 总结一下最近遇到的git lfs 2 | ========================== 3 | ## 1 gitlfs安装 4 | ___________ 5 | centos的机子安装git lfs非常容易,直接运行 6 | ```Shell 7 | yum install gitlfs -y 8 | ``` 9 | ## 2 git lfs怎么配合git上传大型文件 10 | > * 使用track命令: 11 | ```Shell 12 | git lfs track "relative path" 13 | ``` 14 | > * for example, 当前你的仓库绝对路径是/root/project1/,大文件绝对路径是/root/project1/flask/cws.model,然后git lfs就需要写成: 15 | ```Shell 16 | git lfs track "./flask/cws.model" 17 | ``` 18 | > * 在git add之前先用git lfs track命令,会在仓库文件夹下生成一个.gitattrbute文件,可以查看加入的大文件属性 19 | > * track "relative path"支持正则匹配,例如.model类型的文件可以写成*.model 20 | 21 | ## 3 git add . 22 | > * 添加本地仓库文件夹下的所有文件包含文件夹 23 | ```Shell 24 | git add . 25 | ``` 26 | > * 如果要添加单个文件或者层级目标文件,需要指定目标文件的层级目录,相对路径即可。 27 | ## 5 git commit -m "description of this commit" 28 | > * 加入本地缓存 29 | ```Shell 30 | git commit -m "description of this commit" 31 | ``` 32 | ## 6 git push origin master 33 | > * push之后的origin 和 master分别是本地branch的名称和远程仓库的名称。 34 | ```Shell 35 | git push origin master 36 | ``` 37 | 38 | * have fun~ 39 | -------------------------------------------------------------------------------- /flask/app/routes.py: -------------------------------------------------------------------------------- 1 | #从app模块中即从__init__.py中导入创建的app应用 2 | from app import app 3 | from flask_bootstrap import Bootstrap 4 | from flask import render_template, redirect 5 | from app.forms import NameForm 6 | #from app.numpy import 7 | #建立路由,通过路由可以执行其覆盖的方法,可以多个路由指向同一个方法。 8 | import pandas 9 | from app import review_content 10 | 11 | @app.route('/') 12 | @app.route('/index') 13 | def index(): 14 | return render_template("index.html") 15 | 16 | @app.route('/Review_Extraction',methods=['GET','POST']) 17 | def Review_Extraction (): 18 | name = None 19 | form = NameForm() 20 | if form.validate_on_submit(): 21 | 22 | name = form.name.data 23 | 24 | 25 | old_width = pandas.get_option('display.max_colwidth') 26 | pandas.set_option('display.max_colwidth', -1) 27 | 28 | df = review_content.review_fc(name) 29 | form.name.data = '' 30 | columns = ['Person','SBV','speech_content','sentence'] 31 | return render_template('review_extraction.html', title='Zh_Cola',form=form,tables=[df.to_html(classes='data',escape=True,index=True,sparsify=False,border=1,index_names=False,header=True,columns=columns)], titles=df.columns.values) 32 | 33 | pandas.set_option('display.max_colwidth', old_width) 34 | else: 35 | return render_template('review_extraction.html', title='Zh_Cola',form=form) 36 | 37 | 38 | @app.route('/News_push') 39 | def News_push(): 40 | return "更新中~~~" 41 | 42 | bootstrap = Bootstrap(app) 43 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | # Pro1 3 | import pickup 4 | # Pro2 5 | import main_pro2 6 | import sents2vec 7 | from preprocess_autosummary import get_word_frequency,sentence_and_doc 8 | 9 | from flask_wtf import FlaskForm 10 | 11 | from flask import Flask, render_template, request # 引入类 12 | 13 | class NameForm(FlaskForm): 14 | text = '' 15 | 16 | app = Flask(__name__) # Flask实例化一个对象,与我们当前运行的模块名当做参数 17 | app.config["SECRET_KEY"] = "12345678" 18 | 19 | @app.route('/') 20 | def hh(): 21 | return render_template('index.html') 22 | 23 | content1 = None 24 | 25 | @app.route('/news-extraction', methods=["POST","GET"]) 26 | def deal_project1(): 27 | form = NameForm() 28 | if request.form: 29 | global content1 30 | content1 = request.form.get("desc") 31 | #print(content) 32 | user_input = content1 33 | form.text = pickup.main(user_input) 34 | return render_template('news-extraction.html',text=form.text, form=form) 35 | 36 | else: 37 | return render_template('news-extraction.html',form=form) # 没提交的时候显示页面 38 | 39 | content2 = None 40 | 41 | @app.route("/autoSummary", methods=["POST", "GET"]) 42 | def deal_project2(): 43 | form = NameForm() 44 | if request.form: 45 | global content2 46 | content2 = request.form.get("desc") 47 | #print(content) 48 | user_input = content2 49 | form.text = main_pro2.autoSummary(user_input) 50 | return render_template('autoSummary.html',text=form.text, form=form) 51 | 52 | else: 53 | return render_template('autoSummary.html',form=form) # 没提交的时候显示页面 54 | 55 | if __name__ == '__main__': 56 | app.run(host="0.0.0.0", port=5000, debug=True) 57 | -------------------------------------------------------------------------------- /flask/app/templates/review_extraction.html: -------------------------------------------------------------------------------- 1 | {% extends "bootstrap/base.html" %} 2 | {% block title %}Zh_Cola_Lab{% endblock %} 3 | {% block navbar %} 4 | 25 |
26 |
27 | 28 | 29 | {{ form.hidden_tag() }} 30 |

31 | {{ form.name.label }}
32 | {{ form.name(size=100) }} 33 |

34 | 35 |

{{ form.submit() }}

36 | 37 |
38 |
39 | 40 |
41 | 42 |

The result of review_Extraction is

43 | 44 | {% for table in tables %} 45 |
46 | 47 | {{titles[loop.index]}} 48 | {{ table|safe }} 49 | 50 |
51 | {% endfor %} 52 | 53 |
54 | 55 | {% endblock %} 56 | -------------------------------------------------------------------------------- /templates/web_sckone.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 多人聊天 7 | 8 | 9 |

10 | 您的昵称: 11 | {# 发送者名字 #} 12 | 13 |

14 |

15 | 给 {# to_user 接收者#} 16 | 17 | 18 |

19 |
20 | 21 |
22 | 23 | 24 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /flask/app/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "bootstrap/base.html" %} 2 | {% block title %}Zh_Cola Lab{% endblock %} 3 | {% block navbar %} 4 | 25 | {% endblock %} 26 | {% block content %} 27 | 35 |
36 |

Welcome to our Lab!

37 |

Members

38 |

袁 禾 王路宁 范倩文 崔少华

39 | 40 |

Fuctions

41 | Review Extraction
42 | News Push 43 | 44 |

what can N-L-P do ?

45 | test 46 | test 47 | test 48 | test 49 | test 50 | test 51 | 52 |
53 | {% endblock %} 54 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Appra AI Lab 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | 20 | 21 | 34 | 47 |
48 | 49 |
50 |
51 | 52 | 73 |
74 |
75 | 76 | 80 |
81 | 82 | 89 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Appra AI Lab 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | 20 | 21 | 27 | 40 |
41 | 42 |
43 |
44 | 45 | 66 |
67 |
68 | 69 |
70 | 71 |
72 | 内容主体区域 73 | 74 |

75 | 76 |
77 | 注意:该页面只是简单的后台布局示例,并不是一整套后台系统方案,您可以关注 layui 官方提供后台模板解决方案: 78 | layuiAdmin 79 |
80 | 81 |
82 | layui 之所以赢得如此多人的青睐,更多是在于它“前后台系统通吃”的能力。既可编织出绚丽的前台页面,又可满足繁杂的后台功能需求。 83 |
layui 后台布局, 致力于让每一位开发者都能轻松搭建自己的后台模板。 84 |
85 | 86 | 获取该布局代码 87 | 88 |



89 | 90 |
91 |
92 | 93 | 97 |
98 | 99 | 106 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /templates/index.html.bak: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Appra AI Lab 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | 20 | 21 | 27 | 40 |
41 | 42 |
43 |
44 | 45 | 66 |
67 |
68 | 69 |
70 | 71 |
72 | 内容主体区域 73 | 74 |

75 | 76 |
77 | 注意:该页面只是简单的后台布局示例,并不是一整套后台系统方案,您可以关注 layui 官方提供后台模板解决方案: 78 | layuiAdmin 79 |
80 | 81 |
82 | layui 之所以赢得如此多人的青睐,更多是在于它“前后台系统通吃”的能力。既可编织出绚丽的前台页面,又可满足繁杂的后台功能需求。 83 |
layui 后台布局, 致力于让每一位开发者都能轻松搭建自己的后台模板。 84 |
85 | 86 | 获取该布局代码 87 | 88 |



89 | 90 |
91 |
92 | 93 | 97 |
98 | 99 | 106 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /templates/autoSummary.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Appra AI Lab 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 28 | 41 |
42 | 43 |
44 |
45 | 46 | 67 |
68 |
69 | 70 |
71 | 72 |
73 |
74 |

示例

75 | 76 |
77 | 示例1 78 | 79 | 80 |
81 |
82 | 83 |
84 |

实操

85 |
86 | 87 |
88 | {{ form.hidden_tag() }} 89 |
90 |
91 | 92 |
93 | 94 |
95 |
96 | 97 |
98 | 99 |
100 | 101 |
102 |
103 | 104 |
105 |
106 | 107 | 108 |
109 |
110 | 111 |
112 |
113 |
114 | 129 | 130 |
131 |
132 | 133 |
134 |

其他功能

135 |
136 |

PCA

137 |

LDA

138 |
139 |
140 | 141 |
142 | 143 | 150 | 151 |
152 | 153 | 157 | 158 | 159 | 166 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /flask/review_content.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ python 2 | # -*- coding: utf-8 -*- 3 | import sys, os 4 | from zhon.hanzi import punctuation 5 | from zhon.hanzi import non_stops 6 | from zhon.hanzi import stops 7 | import logging 8 | 9 | zhon_char = punctuation + non_stops + stops 10 | import pyltp 11 | 12 | import gc 13 | import re 14 | # 从single_sents读句子也可以 15 | def sentence_read(): 16 | 17 | # 0 18 | #Input = open("./single_sents", "r", encoding="utf-8") 19 | # 1 利用sentencesplitter再分一遍句子 20 | with open("./article_corpus", 'r', encoding="utf-8") as fo: 21 | pass 22 | 23 | # 中文文本分句,返回值为字符串组成的列表 24 | def cut_sent(para): 25 | para = re.sub('([。!?\?])([^”’])', r"\1\n\2", para) # 单字符断句符 26 | para = re.sub('(\.{6})([^”’])', r"\1\n\2", para) # 英文省略号 27 | para = re.sub('(\…{2})([^”’])', r"\1\n\2", para) # 中文省略号 28 | para = re.sub('([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para) 29 | # 如果双引号前有终止符,那么双引号才是句子的终点,把分句符\n放到双引号后,注意前面的几句都小心保留了双引号 30 | para = para.rstrip() # 段尾如果有多余的\n就去掉它 31 | # 很多规则中会考虑分号;,但是这里我把它忽略不计,破折号、英文双引号等同样忽略,需要的再做些简单调整即可。 32 | return para.split("\n") 33 | 34 | 35 | # ltp_process,只分析SBV类型的句子。输出SBV主语、谓语“说”和说话内容 36 | def ltp_process(sentence): 37 | stop_words = get_stops_words() # 提取停用词,为SBV词【如“是”等停用词】在SBV词中删除。 38 | 39 | # 分词 40 | segmentor = pyltp.Segmentor() 41 | segmentor.load("./cws.model") 42 | words = segmentor.segment(sentence) 43 | print("\t".join(words)) 44 | segmentor.release() 45 | 46 | # 词性 47 | postagger = pyltp.Postagger() 48 | postagger.load("./pos.model") 49 | postags = postagger.postag(words) 50 | # list-of-string parameter is support in 0.1.5 51 | # postags = postagger.postag(["中国","进出口","银行","与","中国银行","加强","合作"]) 52 | print("\t".join(postags)) 53 | postagger.release() 54 | 55 | # 依存句法分析 56 | parser = pyltp.Parser() 57 | parser.load("./parser.model") 58 | arcs = parser.parse(words, postags) 59 | parser.release() 60 | 61 | # 角色分析,暂时没用上 62 | # 拿到前面来是有用意的,在进行判断了当前的SBV的子节点与"说"有关后,需要抽取这个词,简而言之,是SBV,又对应A0,则这个词一定是主语。 63 | labeller = pyltp.SementicRoleLabeller() 64 | labeller.load("./pisrl.model") 65 | roles = labeller.label(words, postags, arcs) 66 | 67 | print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) 68 | 69 | SBV_set = list() 70 | Subject_label_set = list() 71 | Word_of_speech_content = list() 72 | 73 | Index_of_Subjet = 0 74 | 75 | for arc in arcs: 76 | #SBV_index = get_repeat(arc.head, "SBV") 77 | k = Index_of_Subjet 78 | if arc.relation == "SBV" and words[arc.head - 1] not in stop_words: # 这个地方难道真的不够严谨,不能只判断是不是SBV,因为一旦判断有SBV了,那么必然这个词就是A0 79 | 80 | SBV_set.append(words[arc.head - 1]) # arc.head是从1开始计数,存储SBV指向的谓语动词 81 | Subject_label_set.append(words[Index_of_Subjet]) # 如果有SBV,那么这个词对应的位置肯定是主语 82 | Word_of_speech_content.append(words[arc.head:]) # 拿出来的相当于SBV主语词以后的部分。 83 | 84 | Index_of_Subjet += 1 85 | 86 | else: 87 | Index_of_Subjet += 1 88 | continue # 如果为空列表,该句子没有分析的必要性 89 | 90 | 91 | 92 | ''' 93 | recognizer = pyltp.NamedEntityRecognizer() 94 | recognizer.load("./ner.model") 95 | netags = recognizer.recognize(words, postags) 96 | print("\t".join(netags)) 97 | 98 | labeller = pyltp.SementicRoleLabeller() 99 | labeller.load("./pisrl.model") 100 | roles = labeller.label(words, postags, arcs) 101 | 102 | for role in roles: 103 | print(role.index, "".join( 104 | ["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments])) 105 | ''' 106 | 107 | return SBV_set, Subject_label_set, Word_of_speech_content # 返回的是一个列表,第一个值是SBV的子节点词(HED),第二个是当前SBV的主语。一定要注意,是不是都是[] 108 | 109 | 110 | import pandas as pd 111 | from collections import defaultdict 112 | 113 | def pd_DataFram(): 114 | 115 | ''' 116 | DataFram 结构是这样的 117 | 118 | 列索引 119 | 0 120 | 分句结果 SVB 说话人 说话内容 121 | 行索引 0 句子0 句子0的SVB结果[SVB词的索引列表] [per1, per2, per3,...] [speech1, speech2, speech3] 122 | 1 句子1 句子1的SVB结果[SVB次的索引列表] [per1, per2, per3,...] [speech1, speech2, speech3] 123 | 2 . ... 124 | 3 . 125 | ''' 126 | 127 | #句子成分分析结果 128 | 129 | result_of_data = defaultdict(list) 130 | 131 | return result_of_data 132 | 133 | 134 | import gensim as gm 135 | 136 | # verb_speak是一个包含SBV的列表,非一个词 137 | def is_there_speak(Verb_and_Subject_result_of_ltp_process): 138 | 139 | # 1 投入SBV的词进行检测,看下是不是位于词的列表中。 140 | # 1.1 手动写的这些 141 | manl_add_speak = ['讨论', '交流', '讲话', '说话', '吵架', '争吵', '勉励', '告诫', '戏言', '嗫嚅', '沟通', '切磋', '争论', '研究', '辩解', '坦言', '喧哗', '嚷嚷', '吵吵', '喊叫', '呼唤', '讥讽', '咒骂', '漫骂', '七嘴八舌', '滔滔不绝', '口若悬河', '侃侃而谈', '念念有词', '喋喋不休', '说话', '谈话', '讲话', '叙述', '陈述', '复述', '申述', '说明', '声明', '讲明', '谈论', '辩论', '议论', '讨论', '商谈', '哈谈', '商量', '畅谈', '商讨', '话语', '呓语', '梦话', '怪话', '黑话', '谣言', '谰言', '恶言', '狂言', '流言', '巧言', '忠言', '疾言', '傻话', '胡话', '俗话', '废话', '发言', '婉言', '危言', '谎言', '直言', '预言', '诺言', '诤言'] 142 | # 1.2 迭代10次加入的这些 143 | gensim_speak_list =['说', '却说', '答道', '回答', '问起', '说出', '追问', '干什么', '质问', '不在乎', '没错', '请问', '问及', '问到', '感叹', '告诫', '说谎', '说完', '开玩笑', '讲出', '直言', '想想', '想到', '问说', '责骂', '讥笑', '问过', '转述', '闭嘴', '撒谎', '谈到', '有没有', '骂', '责怪', '取笑', '吹嘘', '听过', '不该', '询问', '坚称', '怒斥', '答', '该死', '忘掉', '说起', '反问', '问道', '忍不住', '苦笑', '没事', '道谢', '问', '对不起', '戏弄', '埋怨', '发脾气', '说道', '原谅', '责备', '大笑', '听罢', '放过', '不解', '没想', '训斥', '认错', '想来', '自嘲', '还好', '打趣', '嘲笑', '后悔', '讥讽', '发怒', '心疼', '发牢骚', '数落', '点头', '认得', '醒悟', '装作', '要死', '流泪', '哭诉', '走开', '动怒', '不屑', '悔恨', '咒骂', '捉弄'] 144 | speak_list = manl_add_speak + gensim_speak_list 145 | 146 | final_speak = list() 147 | final_label = list() 148 | final_speech_content = list() 149 | #tmp_SBV_label_set = Verb_and_Subject_result_of_ltp_process 150 | 151 | for speak, label, speech_content in Verb_and_Subject_result_of_ltp_process: 152 | if speak in speak_list: 153 | 154 | final_speak.append(speak) 155 | final_label.append(label) 156 | final_speech_content.append(speech_content) 157 | 158 | else: 159 | # # 2 如果不在列表中,采用gensim.most_similar()进行判断,相似性大于0.4,认为就是说的同义词 160 | logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s", level=logging.INFO) 161 | mode = gm.models.Word2Vec.load("./merge_corpus.model") 162 | if mode.wv.similarity('说', speak) > 0.4: 163 | print(speak, mode.wv.similarity('说', speak)) 164 | 165 | final_speak.append(speak) 166 | final_label.append(label) 167 | final_speech_content.append(speech_content) 168 | 169 | else: 170 | 171 | continue 172 | print(final_speak, final_label, final_speech_content) 173 | return final_speak, final_label, final_speech_content 174 | 175 | # 把停用词再删除 176 | def get_stops_words(): 177 | with open("./stopwords.txt", "r") as fo: 178 | 179 | stop_words = fo.read().split('\n') 180 | 181 | return stop_words 182 | 183 | def refine_speech_content(): 184 | 185 | # 01 如果只有引号能把所有内容包括,则把引号里的内容拿出来 186 | # 02 如果没有引号,则按逗号进行拆分,并判断是不是一句话。 187 | pass 188 | 189 | 190 | 191 | # 主函数 192 | def review_fc(para): 193 | 194 | #0 输入一个句子或者一个段落 195 | paragraph = "党的十八大以来,习近平总书记一直牵挂着广大人民群众的身体健康和用药安全,他强调:要始终把人民群众的身体健康放在首位。他指出,“要密切监测药品短缺情况,采取有效措施,解决好低价药、‘救命药’、‘孤儿药’以及儿童用药的供应问题。" 196 | paragraph = para 197 | result_of_data = pd_DataFram() # 空defaultdict 198 | #0.1 判断句子是否可以分句 199 | cut_result = cut_sent(paragraph) 200 | result_of_data["sentence"] = cut_result 201 | 202 | print(result_of_data["sentence"]) 203 | if cut_result: 204 | for sent in cut_result: # 一个句子一个句子分析 205 | #0.2 判断这个句子是不是含有SBV的成分 206 | ltp_result = ltp_process(sent) # 返回的已经是words[“SVB”]和SBV对应的主语。 207 | verb_of_ltp_result, label_of_ltp_result, Word_of_speech_content = ltp_result 208 | if verb_of_ltp_result: #只要verb_of_ltp_result不为空,就进行判断说,否则该句子就没有说 209 | (sp_list, label_list, speech_list) = is_there_speak(zip(verb_of_ltp_result, label_of_ltp_result, Word_of_speech_content)) 210 | 211 | if sp_list != None: 212 | 213 | result_of_data["SBV"].append(sp_list) 214 | result_of_data["Person"].append(label_list) 215 | result_of_data["speech_content"].append([''.join(k) for k in speech_list if speech_list[0] != ',:']) 216 | 217 | else: 218 | 219 | result_of_data["sentence"].pop() 220 | 221 | print("句子不含有动词说") 222 | 223 | else: 224 | result_of_data["sentence"].pop() 225 | print("该句子不是SBV类型") # 不是SBV类型可以再加一部分判断,按照袁禾那种从动词verb出发,判断是不是说 226 | #可以调袁禾的接口去做 227 | 228 | result_all = pd.DataFrame(result_of_data) 229 | 230 | return result_all 231 | 232 | def main(): 233 | main_fuc() 234 | 235 | if __name__ == "__main__": 236 | 237 | print(main) 238 | -------------------------------------------------------------------------------- /flask/app/review_content.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ python 2 | # -*- coding: utf-8 -*- 3 | import sys, os 4 | from zhon.hanzi import punctuation 5 | from zhon.hanzi import non_stops 6 | from zhon.hanzi import stops 7 | import logging 8 | 9 | zhon_char = punctuation + non_stops + stops 10 | import pyltp 11 | 12 | import gc 13 | import re 14 | # 从single_sents读句子也可以 15 | def sentence_read(): 16 | 17 | # 0 18 | #Input = open("./single_sents", "r", encoding="utf-8") 19 | # 1 利用sentencesplitter再分一遍句子 20 | with open("./article_corpus", 'r', encoding="utf-8") as fo: 21 | pass 22 | 23 | # 中文文本分句,返回值为字符串组成的列表 24 | def cut_sent(para): 25 | para = re.sub('([。!?\?])([^”’])', r"\1\n\2", para) # 单字符断句符 26 | para = re.sub('(\.{6})([^”’])', r"\1\n\2", para) # 英文省略号 27 | para = re.sub('(\…{2})([^”’])', r"\1\n\2", para) # 中文省略号 28 | para = re.sub('([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para) 29 | # 如果双引号前有终止符,那么双引号才是句子的终点,把分句符\n放到双引号后,注意前面的几句都小心保留了双引号 30 | para = para.rstrip() # 段尾如果有多余的\n就去掉它 31 | # 很多规则中会考虑分号;,但是这里我把它忽略不计,破折号、英文双引号等同样忽略,需要的再做些简单调整即可。 32 | return para.split("\n") 33 | 34 | 35 | # ltp_process,只分析SBV类型的句子。输出SBV主语、谓语“说”和说话内容 36 | def ltp_process(sentence): 37 | stop_words = get_stops_words() # 提取停用词,为SBV词【如“是”等停用词】在SBV词中删除。 38 | 39 | # 分词 40 | segmentor = pyltp.Segmentor() 41 | segmentor.load("./cws.model") 42 | words = segmentor.segment(sentence) 43 | print("\t".join(words)) 44 | segmentor.release() 45 | 46 | # 词性 47 | postagger = pyltp.Postagger() 48 | postagger.load("./pos.model") 49 | postags = postagger.postag(words) 50 | # list-of-string parameter is support in 0.1.5 51 | # postags = postagger.postag(["中国","进出口","银行","与","中国银行","加强","合作"]) 52 | print("\t".join(postags)) 53 | postagger.release() 54 | 55 | # 依存句法分析 56 | parser = pyltp.Parser() 57 | parser.load("./parser.model") 58 | arcs = parser.parse(words, postags) 59 | parser.release() 60 | 61 | # 角色分析,暂时没用上 62 | # 拿到前面来是有用意的,在进行判断了当前的SBV的子节点与"说"有关后,需要抽取这个词,简而言之,是SBV,又对应A0,则这个词一定是主语。 63 | labeller = pyltp.SementicRoleLabeller() 64 | labeller.load("./pisrl.model") 65 | roles = labeller.label(words, postags, arcs) 66 | 67 | print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) 68 | 69 | SBV_set = list() 70 | Subject_label_set = list() 71 | Word_of_speech_content = list() 72 | 73 | Index_of_Subjet = 0 74 | 75 | for arc in arcs: 76 | #SBV_index = get_repeat(arc.head, "SBV") 77 | k = Index_of_Subjet 78 | if arc.relation == "SBV" and words[arc.head - 1] not in stop_words: # 这个地方难道真的不够严谨,不能只判断是不是SBV,因为一旦判断有SBV了,那么必然这个词就是A0 79 | 80 | SBV_set.append(words[arc.head - 1]) # arc.head是从1开始计数,存储SBV指向的谓语动词 81 | Subject_label_set.append(words[Index_of_Subjet]) # 如果有SBV,那么这个词对应的位置肯定是主语 82 | Word_of_speech_content.append(words[arc.head:]) # 拿出来的相当于SBV主语词以后的部分。 83 | 84 | Index_of_Subjet += 1 85 | 86 | else: 87 | Index_of_Subjet += 1 88 | continue # 如果为空列表,该句子没有分析的必要性 89 | 90 | 91 | 92 | ''' 93 | recognizer = pyltp.NamedEntityRecognizer() 94 | recognizer.load("./ner.model") 95 | netags = recognizer.recognize(words, postags) 96 | print("\t".join(netags)) 97 | 98 | labeller = pyltp.SementicRoleLabeller() 99 | labeller.load("./pisrl.model") 100 | roles = labeller.label(words, postags, arcs) 101 | 102 | for role in roles: 103 | print(role.index, "".join( 104 | ["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments])) 105 | ''' 106 | 107 | return SBV_set, Subject_label_set, Word_of_speech_content # 返回的是一个列表,第一个值是SBV的子节点词(HED),第二个是当前SBV的主语。一定要注意,是不是都是[] 108 | 109 | 110 | import pandas as pd 111 | from collections import defaultdict 112 | 113 | def pd_DataFram(): 114 | 115 | ''' 116 | DataFram 结构是这样的 117 | 118 | 列索引 119 | 0 120 | 分句结果 SVB 说话人 说话内容 121 | 行索引 0 句子0 句子0的SVB结果[SVB词的索引列表] [per1, per2, per3,...] [speech1, speech2, speech3] 122 | 1 句子1 句子1的SVB结果[SVB次的索引列表] [per1, per2, per3,...] [speech1, speech2, speech3] 123 | 2 . ... 124 | 3 . 125 | ''' 126 | 127 | #句子成分分析结果 128 | 129 | result_of_data = defaultdict(list) 130 | 131 | return result_of_data 132 | 133 | 134 | import gensim as gm 135 | 136 | # verb_speak是一个包含SBV的列表,非一个词 137 | def is_there_speak(Verb_and_Subject_result_of_ltp_process): 138 | 139 | # 1 投入SBV的词进行检测,看下是不是位于词的列表中。 140 | # 1.1 手动写的这些 141 | manl_add_speak = ['讨论', '交流', '讲话', '说话', '吵架', '争吵', '勉励', '告诫', '戏言', '嗫嚅', '沟通', '切磋', '争论', '研究', '辩解', '坦言', '喧哗', '嚷嚷', '吵吵', '喊叫', '呼唤', '讥讽', '咒骂', '漫骂', '七嘴八舌', '滔滔不绝', '口若悬河', '侃侃而谈', '念念有词', '喋喋不休', '说话', '谈话', '讲话', '叙述', '陈述', '复述', '申述', '说明', '声明', '讲明', '谈论', '辩论', '议论', '讨论', '商谈', '哈谈', '商量', '畅谈', '商讨', '话语', '呓语', '梦话', '怪话', '黑话', '谣言', '谰言', '恶言', '狂言', '流言', '巧言', '忠言', '疾言', '傻话', '胡话', '俗话', '废话', '发言', '婉言', '危言', '谎言', '直言', '预言', '诺言', '诤言'] 142 | # 1.2 迭代10次加入的这些 143 | gensim_speak_list =['说', '却说', '答道', '回答', '问起', '说出', '追问', '干什么', '质问', '不在乎', '没错', '请问', '问及', '问到', '感叹', '告诫', '说谎', '说完', '开玩笑', '讲出', '直言', '想想', '想到', '问说', '责骂', '讥笑', '问过', '转述', '闭嘴', '撒谎', '谈到', '有没有', '骂', '责怪', '取笑', '吹嘘', '听过', '不该', '询问', '坚称', '怒斥', '答', '该死', '忘掉', '说起', '反问', '问道', '忍不住', '苦笑', '没事', '道谢', '问', '对不起', '戏弄', '埋怨', '发脾气', '说道', '原谅', '责备', '大笑', '听罢', '放过', '不解', '没想', '训斥', '认错', '想来', '自嘲', '还好', '打趣', '嘲笑', '后悔', '讥讽', '发怒', '心疼', '发牢骚', '数落', '点头', '认得', '醒悟', '装作', '要死', '流泪', '哭诉', '走开', '动怒', '不屑', '悔恨', '咒骂', '捉弄'] 144 | speak_list = manl_add_speak + gensim_speak_list 145 | 146 | final_speak = list() 147 | final_label = list() 148 | final_speech_content = list() 149 | #tmp_SBV_label_set = Verb_and_Subject_result_of_ltp_process 150 | 151 | for speak, label, speech_content in Verb_and_Subject_result_of_ltp_process: 152 | if speak in speak_list: 153 | 154 | final_speak.append(speak) 155 | final_label.append(label) 156 | final_speech_content.append(speech_content) 157 | 158 | else: 159 | # # 2 如果不在列表中,采用gensim.most_similar()进行判断,相似性大于0.4,认为就是说的同义词 160 | logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s", level=logging.INFO) 161 | mode = gm.models.Word2Vec.load("./merge_corpus.model") 162 | if mode.wv.similarity('说', speak) > 0.4: 163 | print(speak, mode.wv.similarity('说', speak)) 164 | 165 | final_speak.append(speak) 166 | final_label.append(label) 167 | final_speech_content.append(speech_content) 168 | 169 | else: 170 | 171 | continue 172 | print(final_speak, final_label, final_speech_content) 173 | return final_speak, final_label, final_speech_content 174 | 175 | # 把停用词再删除 176 | def get_stops_words(): 177 | with open("./stopwords.txt", "r") as fo: 178 | 179 | stop_words = fo.read().split('\n') 180 | 181 | return stop_words 182 | 183 | def refine_speech_content(): 184 | 185 | # 01 如果只有引号能把所有内容包括,则把引号里的内容拿出来 186 | # 02 如果没有引号,则按逗号进行拆分,并判断是不是一句话。 187 | pass 188 | 189 | 190 | 191 | # 主函数 192 | def review_fc(para): 193 | 194 | #0 输入一个句子或者一个段落 195 | paragraph = "党的十八大以来,习近平总书记一直牵挂着广大人民群众的身体健康和用药安全,他强调:要始终把人民群众的身体健康放在首位。他指出,“要密切监测药品短缺情况,采取有效措施,解决好低价药、‘救命药’、‘孤儿药’以及儿童用药的供应问题。" 196 | paragraph = para 197 | result_of_data = pd_DataFram() # 空defaultdict 198 | #0.1 判断句子是否可以分句 199 | cut_result = cut_sent(paragraph) 200 | #result_of_data["sentence"] = cut_result 201 | 202 | print(result_of_data["sentence"]) 203 | if cut_result: 204 | for sent in cut_result: # 一个句子一个句子分析 205 | #0.2 判断这个句子是不是含有SBV的成分 206 | ltp_result = ltp_process(sent) # 返回的已经是words[“SVB”]和SBV对应的主语。 207 | verb_of_ltp_result, label_of_ltp_result, Word_of_speech_content = ltp_result 208 | if verb_of_ltp_result: #只要verb_of_ltp_result不为空,就进行判断说,否则该句子就没有说 209 | (sp_list, label_list, speech_list) = is_there_speak(zip(verb_of_ltp_result, label_of_ltp_result, Word_of_speech_content)) 210 | 211 | if sp_list != None: 212 | 213 | result_of_data["SBV"].append(sp_list) 214 | result_of_data["Person"].append(label_list) 215 | result_of_data["speech_content"].append([''.join(k) for k in speech_list if k != ',']) 216 | 217 | else: 218 | 219 | result_of_data["sentence"].pop() 220 | 221 | print("句子不含有动词说") 222 | 223 | else: 224 | result_of_data["sentence"].pop() 225 | print("该句子不是SBV类型") # 不是SBV类型可以再加一部分判断,按照袁禾那种从动词verb出发,判断是不是说 226 | #可以调袁禾的接口去做 227 | 228 | result_of_data["sentence"] = cut_result 229 | result_all = pd.DataFrame(result_of_data) 230 | 231 | return result_all 232 | 233 | def main(): 234 | main_fuc() 235 | 236 | if __name__ == "__main__": 237 | 238 | print(main) 239 | -------------------------------------------------------------------------------- /templates/news-extraction.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Appra AI Lab ` 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 19 | 20 | 26 | 39 |
40 | 41 |
42 |
43 | 44 | 65 |
66 |
67 | 68 |
69 | 70 |
71 |
72 |

示例

73 |
  • 74 | 示例1:
    75 | 输入: 76 | 党的十八大以来,习近平总书记一直牵挂着我们广大人民群众的身体健康和用药安全。他强调:“要始终把人民群众的身体健康放在首位。他指出,“要密切监测药品短缺情况,采取有效措施,解决好低价药、‘救命药’、‘孤儿药’以及儿童用药的供应问题。”
    77 |
    输出:
    78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 |
    IndexPersonSpeakContent
    1 习近平 强调 要始终把人民群众的身体健康放在首位
    2 习近平 指出 要密切监测药品短缺情况,采取有效措施,解决好低价药、‘救命药’、‘孤儿药’以及儿童用药的供应问题
    108 |
  • 109 |
    110 | 111 |
    112 |

    动手操作

    113 |
    114 | 115 |
    116 | {{ form.hidden_tag() }} 117 |
    118 | 119 |
    120 | 121 | 122 | 123 |
    124 |
    125 |
    126 |
    127 | 128 | 129 |
    130 |
    131 | 132 |
    133 | 134 |
    135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | {% for row in text %} 153 | 154 | 155 | 156 | 157 | 158 | 159 | {% endfor %} 160 | 161 | 162 |
    IndexPersonSpeakContent
    {{row[0]}} {{row[1][0]}} {{row[2][0]}} {{row[3][0]}}
    163 | 164 |
    165 |
    166 | 167 |
    168 | 196 | 197 |
    198 |
    199 |
    200 |

    其他功能

    201 |
    202 |

    Word CLoud

    203 |
    204 |
    205 |
    206 | 207 | 215 | 216 |
    217 | 218 | 222 |
    223 | 224 | 230 | 239 | 240 | 241 | 242 | -------------------------------------------------------------------------------- /templates/ss.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 与客服1聊天中 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
    15 |
    16 | 17 |

    点击头像继续聊天

    18 | 19 |
    20 |
    21 |
    22 |

    !发送内容不能为空

    23 | 24 |
    25 | 26 | 27 |
    28 |
    29 |
    30 | 31 |
    32 | 33 |
    34 |

    XX银行客服

    35 |

    我是您的专属客服 工号 000001

    36 |
    37 |
    38 |
    39 |
    40 | 43 |
    44 |
    45 |

    !发送内容不能为空

    46 | 47 |
    48 | 49 | 50 | 51 |
    52 |
    53 |
    54 |
    55 | 352 | 353 | 354 | -------------------------------------------------------------------------------- /pickup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ python 2 | # -*- coding: utf-8 -*- 3 | import sys, os 4 | from zhon.hanzi import punctuation 5 | from zhon.hanzi import non_stops 6 | from zhon.hanzi import stops 7 | import logging 8 | 9 | zhon_char = punctuation + non_stops + stops 10 | import pyltp 11 | 12 | import gc 13 | import re 14 | import numpy as np 15 | 16 | def tlist_to_dkeys(a): 17 | return np.transpose(np.array(a), axes=[1,0])[0] 18 | 19 | # 中文文本分句,返回值为字符串组成的列表 20 | def cut_sent(para): 21 | para = re.sub('([。!?\?])([^”’])', r"\1\n\2", para) # 单字符断句符 22 | para = re.sub('(\.{6})([^”’])', r"\1\n\2", para) # 英文省略号 23 | para = re.sub('(\…{2})([^”’])', r"\1\n\2", para) # 中文省略号 24 | para = re.sub('([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para) 25 | # 如果双引号前有终止符,那么双引号才是句子的终点,把分句符\n放到双引号后,注意前面的几句都小心保留了双引号 26 | para = para.rstrip() # 段尾如果有多余的\n就去掉它 27 | # 很多规则中会考虑分号;,但是这里我把它忽略不计,破折号、英文双引号等同样忽略,需要的再做些简单调整即可。 28 | return para.split("\n") 29 | 30 | def get_stops_words(): 31 | with open("./data/stopwords.txt", "r", encoding='utf-8') as fo: 32 | stop_words = fo.read().split('\n') 33 | 34 | return stop_words 35 | 36 | def intro_speech(sentence): 37 | 38 | sentence = sentence.strip(":“”") 39 | sentence = sentence.strip(",“”") 40 | sentence = sentence.strip('“”') 41 | return sentence 42 | 43 | 44 | # focus_point_set 45 | class Si: 46 | 47 | def __init__(self, words, postags, old_SI = {}): 48 | 49 | self.words = words # 名词及索引 50 | 51 | self.postags = postags # 主语、宾语、辅助名词及索引 52 | self.params = {} # {'word':'score'} 53 | self.old_SI = old_SI 54 | 55 | def score(self): 56 | # 根据名词和索引及主宾辅的索引情况进行归类并且赋值初始分数 57 | weight_adment = [] 58 | for i,j in self.postags.items(): 59 | # i代表["SBV",'VOB'],j代表索引 60 | # 加入一个权重的修正,将名词词组的得分提高,如score(习近平) = score(总书记) 61 | 62 | if i=='SBV': 63 | for k in j: 64 | if k[0] in self.words.keys() and self.words[k[0]] == k[1]: 65 | self.params[k[0]] = 5 66 | weight_adment.append(k[1]) 67 | else: 68 | pass 69 | elif i=='VOB': 70 | for m in j: 71 | if m[0] in self.words.keys() and self.words[m[0]] == m[1]: 72 | self.params[m[0]] = 2 73 | else: 74 | pass 75 | else: 76 | self.params[i] = 1# "SBV":(词,初始分数) 77 | 78 | for word, index in self.words.items(): 79 | if word not in self.params.keys(): 80 | self.params[word] = 1 81 | # 修正 82 | #print(weight_adment) 83 | for f, k in self.words.items(): 84 | if k in (np.array(weight_adment) + 1).tolist() or k in (np.array(weight_adment) - 1).tolist(): 85 | self.params[f] = 5 86 | 87 | return self.params 88 | 89 | 90 | def update(self): 91 | # 先调用一次score,获得当前的params 92 | params = self.score() 93 | # 比较当前postags和之前的postags 94 | if self.old_SI: 95 | for i, j in self.old_SI.params.items(): 96 | if i not in list(params.keys()) and j>=1: 97 | j -= 1 # 进行简化,衰减程度都变成1 98 | self.old_SI.params[i] = j 99 | 100 | if j <= 0: 101 | self.old_SI.params[i] = 0 102 | #print('update', self.old_SI.params) 103 | return self.old_SI.params 104 | 105 | def ltp_process(sentence, old_SI={}): 106 | 107 | stop_words = get_stops_words() # 提取停用词,为SBV词【如“是”等停用词】在SBV词中删除。 108 | 109 | # 分词 110 | segmentor = pyltp.Segmentor() 111 | segmentor.load("./model/cws.model") 112 | words = segmentor.segment(sentence) 113 | #print("\t".join(words)) 114 | segmentor.release() 115 | 116 | # 词性 117 | postagger = pyltp.Postagger() 118 | postagger.load("./model/pos.model") 119 | postags = postagger.postag(words) 120 | # list-of-string parameter is support in 0.1.5 121 | #print("\t".join(postags)) 122 | postagger.release() 123 | 124 | # 依存句法分析 125 | parser = pyltp.Parser() 126 | parser.load("./model/parser.model") 127 | arcs = parser.parse(words, postags) 128 | parser.release() 129 | 130 | # 拿到前面来是有用意的,在进行判断了当前的SBV的子节点与"说"有关后,需要抽取这个词,简而言之,是SBV,又对应A0,则这个词一定是主语。 131 | labeller = pyltp.SementicRoleLabeller() 132 | labeller.load("./model/pisrl.model") 133 | roles = labeller.label(words, postags, arcs) 134 | 135 | #print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) # 依存句法分析 136 | 137 | noun_tags = ['nh','nd','n','ni','nl','ns','nt','nz'] 138 | SI_words = {} # 词和索引 139 | for tag in noun_tags: 140 | SI_index = np.argwhere(np.array(postags)==tag).reshape(-1).tolist() 141 | for j in SI_index: 142 | SI_words[words[j]] = j 143 | 144 | #print(SI_words) 145 | 146 | SBV_set = list() 147 | Subject_label_set = list() 148 | Word_of_speech_content = list() 149 | 150 | Index_of_Subjet = 0 151 | SI_postags = {} 152 | si_SBV_postag = [] 153 | si_VOB_postag = [] 154 | for arc in arcs: 155 | # SBV_index = get_repeat(arc.head, "SBV") 156 | k = Index_of_Subjet 157 | if arc.relation == "SBV" and words[arc.head - 1] not in stop_words: # 这个地方难道真的不够严谨,不能只判断是不是SBV,因为一旦判断有SBV了,那么必然这个词就是A0 158 | #print(arc.head, words[arc.head -1]) 159 | SBV_set.append(words[arc.head - 1]) # arc.head是从1开始计数,存储SBV指向的谓语动词 160 | # 加入主语的判断 161 | if words[Index_of_Subjet] in ['他','他们','你','你们','我','我们', '她','她们']: 162 | # 进行指代消解 163 | # 查看当前old_SI,如果old_SI中有相同角色,取积分最高值进行替换人称代词。需要做一次修正,名词词组如习近平+总书记应该是一个词,或者把习近平的权重设置为总书记一样 164 | if old_SI: 165 | ag2entity = np.argmax(old_SI.params.keys()) 166 | 167 | words[Index_of_Subjet] = list(old_SI.params.keys())[ag2entity] 168 | 169 | else: 170 | pass 171 | 172 | Subject_label_set.append(words[Index_of_Subjet]) 173 | 174 | else: 175 | Subject_label_set.append(words[Index_of_Subjet]) # 如果不是指示代词,那么这个词对应的位置肯定是主语 176 | #SI_postag[words[Index_of_Subjet].split(':')[1]] = Index_of_Subjet 177 | if postags[arc.head -1] == 'v': 178 | si_SBV_postag.append((words[Index_of_Subjet], Index_of_Subjet)) 179 | 180 | Word_of_speech_content.append(intro_speech(''.join(words[arc.head:]))) # 拿出所说内容。 181 | #print(intro_speech(''.join(words[arc.head:]))) 182 | Index_of_Subjet += 1 183 | SI_postags[arc.relation] = si_SBV_postag 184 | 185 | 186 | 187 | elif arc.relation == 'VOB' and words[arc.head -1] not in stop_words: 188 | # 加入宾语的判断 189 | if words[Index_of_Subjet] in ['他','他们','你','你们','我','我们', '她','她们']: 190 | # 进行指代消解 191 | # 引入前一句的宾语位置和积分最高元素 192 | pass 193 | 194 | else: 195 | Subject_label_set.append(words[Index_of_Subjet]) # 如果不是指示代词,那么这个词对应的位置肯定是主语 196 | 197 | 198 | si_VOB_postag.append((words[Index_of_Subjet], Index_of_Subjet)) 199 | 200 | Index_of_Subjet += 1 201 | SI_postags[arc.relation] = si_VOB_postag 202 | 203 | else: 204 | Index_of_Subjet += 1 205 | continue # 如果为空列表,该句子没有分析的必要性 206 | 207 | Forcus_point = Si(SI_words, SI_postags,old_SI) # 关注焦点集 208 | # 需要更新self.params 209 | Forcus_point.score() 210 | 211 | recognizer = pyltp.NamedEntityRecognizer() 212 | recognizer.load("./model/ner.model") 213 | netags = recognizer.recognize(words, postags) 214 | #print("\t".join(netags)) 215 | ''' 216 | labeller = pyltp.SementicRoleLabeller() 217 | labeller.load("./pisrl.model") 218 | roles = labeller.label(words, postags, arcs) 219 | 220 | for role in roles: 221 | print(role.index, "".join( 222 | ["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments])) 223 | ''' 224 | return SBV_set, Subject_label_set, Word_of_speech_content, Forcus_point # 返回的是一个列表,第一个值是SBV的子节点词(HED),第二个是当前SBV的主语,结果有可能是空。 225 | 226 | 227 | import pandas as pd 228 | from collections import defaultdict 229 | 230 | 231 | def pd_DataFram(): 232 | ''' 233 | DataFram 结构是这样的 234 | 235 | 列索引 236 | 0 237 | 分句结果 SVB 说话人 说话内容 238 | 行索引 0 句子0 句子0的SVB结果[SVB词的索引列表] [per1, per2, per3,...] [speech1, speech2, speech3] 239 | 1 句子1 句子1的SVB结果[SVB次的索引列表] [per1, per2, per3,...] [speech1, speech2, speech3] 240 | 2 . ... 241 | 3 . 242 | ''' 243 | 244 | # 句子成分分析结果 245 | 246 | result_of_data = defaultdict(list) 247 | 248 | return result_of_data 249 | 250 | import pickle as pkl 251 | import gensim as gm 252 | 253 | 254 | # verb_speak是一个包含SBV的列表,非一个词 255 | def is_there_speak(Verb_and_Subject_result_of_ltp_process): 256 | # 1 投入SBV的词进行检测,看下是不是位于词的列表中。 257 | # 1.1 手动写的这些 258 | manl_add_speak = ['讨论', '交流', '讲话', '说话', '吵架', '争吵', '勉励', '告诫', '戏言', '嗫嚅', '沟通', '切磋', '争论', '研究', '辩解', '坦言', 259 | '喧哗', '嚷嚷', '吵吵', '喊叫', '呼唤', '讥讽', '咒骂', '漫骂', '七嘴八舌', '滔滔不绝', '口若悬河', '侃侃而谈', '念念有词', '喋喋不休', 260 | '说话', '谈话', '讲话', '叙述', '陈述', '复述', '申述', '说明', '声明', '讲明', '谈论', '辩论', '议论', '讨论', '商谈', '哈谈', 261 | '商量', '畅谈', '商讨', '话语', '呓语', '梦话', '怪话', '黑话', '谣言', '谰言', '恶言', '狂言', '流言', '巧言', '忠言', '疾言', 262 | '傻话', '胡话', '俗话', '废话', '发言', '婉言', '危言', '谎言', '直言', '预言', '诺言', '诤言'] 263 | # 1.2 迭代10次加入的这些 264 | gensim_speak_list = ['说', '却说', '答道', '回答', '问起', '说出', '追问', '干什么', '质问', '不在乎', '没错', '请问', '问及', '问到', '感叹', 265 | '告诫', '说谎', '说完', '开玩笑', '讲出', '直言', '想想', '想到', '问说', '责骂', '讥笑', '问过', '转述', '闭嘴', '撒谎', 266 | '谈到', '有没有', '骂', '责怪', '取笑', '吹嘘', '听过', '不该', '询问', '坚称', '怒斥', '答', '该死', '忘掉', '说起', '反问', 267 | '问道', '忍不住', '苦笑', '没事', '道谢', '问', '对不起', '戏弄', '埋怨', '发脾气', '说道', '原谅', '责备', '大笑', '听罢', 268 | '放过', '不解', '没想', '训斥', '认错', '想来', '自嘲', '还好', '打趣', '嘲笑', '后悔', '讥讽', '发怒', '心疼', '发牢骚', 269 | '数落', '点头', '认得', '醒悟', '装作', '要死', '流泪', '哭诉', '走开', '动怒', '不屑', '悔恨', '咒骂', '捉弄'] 270 | speak_list = manl_add_speak + gensim_speak_list 271 | 272 | final_speak = list() 273 | final_label = list() 274 | final_speech_content = list() 275 | # tmp_SBV_label_set = Verb_and_Subject_result_of_ltp_process 276 | 277 | for speak, label, speech_content in Verb_and_Subject_result_of_ltp_process: 278 | if speak in speak_list: 279 | 280 | final_speak.append(speak) 281 | final_label.append(label) 282 | final_speech_content.append(speech_content) 283 | 284 | else: 285 | # # 2 如果不在列表中,采用gensim.most_similar()进行判断,相似性大于0.4,认为就是说的同义词 286 | logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s", level=logging.INFO) 287 | fi = open('./model/new.model','rb') 288 | model = pkl.load(fi) 289 | fi.close() 290 | try: 291 | if model.similarity('说', speak) > 0.35: 292 | 293 | #print(speak, model.similarity('说', speak)) 294 | 295 | final_speak.append(speak) 296 | final_label.append(label) 297 | final_speech_content.append(speech_content) 298 | 299 | else: 300 | 301 | continue 302 | except KeyError: 303 | continue 304 | #print(final_speak, final_label, final_speech_content) 305 | if final_speak: 306 | return final_speak, final_label, final_speech_content 307 | else: 308 | return None, None, None 309 | 310 | 311 | # 主函数 312 | def main(para): 313 | # 0 输入一个句子或者一个段落 314 | #paragraph = '党的十八大以来,习近平总书记一直牵挂着我们广大人民群众的身体健康和用药安全。' 315 | #paragraph = "党的十八大以来,习近平总书记一直牵挂着广大人民群众的身体健康和用药安全,他强调:要始终把人民群众的身体健康放在首位。他指出,“要密切监测药品短缺情况,采取有效措施,解决好低价药、‘救命药’、‘孤儿药’以及儿童用药的供应问题。" 316 | #paragraph = "党的十八大以来,习近平总书记一直牵挂着我们广大人民群众的身体健康和用药安全。他强调:“要始终把人民群众的身体健康放在首位。他指出,“要密切监测药品短缺情况,采取有效措施,解决好低价药、‘救命药’、‘孤儿药’以及儿童用药的供应问题。”" 317 | #paragraph = "蒋丽芸说,自己曾经与年轻人交谈过,很多人都不想“港独”,并表示支持“一国两制”,但经常会有人将“独立”加诸年轻人口中。她提到,有民调亦显示绝大多数年轻人是不支持“港独”的。" 318 | paragraph = para 319 | result_of_data = pd_DataFram() # 空defaultdict 320 | # 0.1 判断句子是否可以分句 321 | cut_result = cut_sent(paragraph) 322 | # result_of_data["sentence"] = cut_result 323 | 324 | #print(result_of_data["sentence"]) 325 | if cut_result: 326 | 327 | # 第一句特殊,拿出来单独计算关注焦点集 328 | first_ltp_result = ltp_process(cut_result[0], old_SI={}) 329 | fist_sent_verb, first_label, first_speech_cont, first_SI = first_ltp_result 330 | global old_SI 331 | old_SI = first_SI 332 | #print(1, old_SI.params) 333 | if fist_sent_verb: 334 | (first_sk_verb, first_sk_label, fisrt_sk_content) = is_there_speak(zip(fist_sent_verb, first_label, first_speech_cont)) 335 | 336 | if first_sk_verb: 337 | 338 | result_of_data["SBV"].append(first_sk_verb) 339 | result_of_data["Person"].append(first_sk_label) 340 | result_of_data["speech_content"].append(fisrt_sk_content) 341 | 342 | 343 | # 第二句开始 344 | for sent in cut_result[1:]: # 一个句子一个句子分析 345 | #refine_speech_content(sent) 346 | # 0.2 判断这个句子是不是含有SBV的成分 347 | #print(type(old_SI)) 348 | #print(old_SI.params) 349 | ltp_result = ltp_process(sent, old_SI=old_SI) # 返回的已经是words[“SVB”]和SBV对应的主语。 350 | verb_of_ltp_result, label_of_ltp_result, Word_of_speech_content, SI_result = ltp_result 351 | old_SI = SI_result # 指代消歧的继续 352 | if verb_of_ltp_result: # 只要verb_of_ltp_result不为空,就进行判断说,否则该句子就没有说 353 | (sp_list, label_list, speech_list) = is_there_speak( 354 | zip(verb_of_ltp_result, label_of_ltp_result, Word_of_speech_content)) 355 | 356 | if sp_list: 357 | 358 | result_of_data["SBV"].append(sp_list) 359 | result_of_data["Person"].append(label_list) 360 | result_of_data["speech_content"].append(speech_list) 361 | 362 | else: 363 | result_of_data["sentence"].pop() 364 | #print("警告:该句子不是SBV类型") # 不是SBV类型可以再加一部分判断 365 | old_SI.params = old_SI.update() 366 | #print(2, old_SI.params) 367 | #result_of_data["sentence"] = cut_result 368 | result_all = pd.DataFrame(result_of_data) 369 | #result_data = result_all.drop(columns=['sentence']) 370 | if result_all.empty is False: 371 | Index = list(range(1, len(cut_result)+1)) 372 | OUP = list(zip(Index,result_all['Person'],result_all['SBV'],result_all['speech_content'])) 373 | return OUP 374 | else: 375 | OUP = "" 376 | return OUP 377 | #result_data = result_data[['Index','Person','SBV','speech_content']] 378 | 379 | 380 | if __name__ == "__main__": 381 | print(main()) 382 | -------------------------------------------------------------------------------- /flask/stopwords.txt: -------------------------------------------------------------------------------- 1 | ! 2 | " 3 | # 4 | $ 5 | % 6 | & 7 | ' 8 | ( 9 | ) 10 | * 11 | + 12 | , 13 | - 14 | -- 15 | . 16 | .. 17 | ... 18 | ...... 19 | ................... 20 | ./ 21 | .一 22 | .数 23 | .日 24 | / 25 | // 26 | 0 27 | 1 28 | 2 29 | 3 30 | 4 31 | 5 32 | 6 33 | 7 34 | 8 35 | 9 36 | : 37 | :// 38 | :: 39 | ; 40 | < 41 | = 42 | > 43 | >> 44 | ? 45 | @ 46 | A 47 | Lex 48 | [ 49 | \ 50 | ] 51 | ^ 52 | _ 53 | ` 54 | exp 55 | sub 56 | sup 57 | | 58 | } 59 | ~ 60 | ~~~~ 61 | · 62 | × 63 | ××× 64 | Δ 65 | Ψ 66 | γ 67 | μ 68 | φ 69 | φ. 70 | В 71 | — 72 | —— 73 | ——— 74 | ‘ 75 | ’ 76 | ’‘ 77 | “ 78 | ” 79 | ”, 80 | … 81 | …… 82 | …………………………………………………③ 83 | ′∈ 84 | ′| 85 | ℃ 86 | Ⅲ 87 | ↑ 88 | → 89 | ∈[ 90 | ∪φ∈ 91 | ≈ 92 | ① 93 | ② 94 | ②c 95 | ③ 96 | ③] 97 | ④ 98 | ⑤ 99 | ⑥ 100 | ⑦ 101 | ⑧ 102 | ⑨ 103 | ⑩ 104 | ── 105 | ■ 106 | ▲ 107 |   108 | 、 109 | 。 110 | 〈 111 | 〉 112 | 《 113 | 》 114 | 》), 115 | 」 116 | 『 117 | 』 118 | 【 119 | 】 120 | 〔 121 | 〕 122 | 〕〔 123 | ㈧ 124 | 一 125 | 一. 126 | 一一 127 | 一下 128 | 一个 129 | 一些 130 | 一何 131 | 一切 132 | 一则 133 | 一则通过 134 | 一天 135 | 一定 136 | 一方面 137 | 一旦 138 | 一时 139 | 一来 140 | 一样 141 | 一次 142 | 一片 143 | 一番 144 | 一直 145 | 一致 146 | 一般 147 | 一起 148 | 一转眼 149 | 一边 150 | 一面 151 | 七 152 | 万一 153 | 三 154 | 三天两头 155 | 三番两次 156 | 三番五次 157 | 上 158 | 上下 159 | 上升 160 | 上去 161 | 上来 162 | 上述 163 | 上面 164 | 下 165 | 下列 166 | 下去 167 | 下来 168 | 下面 169 | 不 170 | 不一 171 | 不下 172 | 不久 173 | 不了 174 | 不亦乐乎 175 | 不仅 176 | 不仅...而且 177 | 不仅仅 178 | 不仅仅是 179 | 不会 180 | 不但 181 | 不但...而且 182 | 不光 183 | 不免 184 | 不再 185 | 不力 186 | 不单 187 | 不变 188 | 不只 189 | 不可 190 | 不可开交 191 | 不可抗拒 192 | 不同 193 | 不外 194 | 不外乎 195 | 不够 196 | 不大 197 | 不如 198 | 不妨 199 | 不定 200 | 不对 201 | 不少 202 | 不尽 203 | 不尽然 204 | 不巧 205 | 不已 206 | 不常 207 | 不得 208 | 不得不 209 | 不得了 210 | 不得已 211 | 不必 212 | 不怎么 213 | 不怕 214 | 不惟 215 | 不成 216 | 不拘 217 | 不择手段 218 | 不敢 219 | 不料 220 | 不断 221 | 不日 222 | 不时 223 | 不是 224 | 不曾 225 | 不止 226 | 不止一次 227 | 不比 228 | 不消 229 | 不满 230 | 不然 231 | 不然的话 232 | 不特 233 | 不独 234 | 不由得 235 | 不知不觉 236 | 不管 237 | 不管怎样 238 | 不经意 239 | 不胜 240 | 不能 241 | 不能不 242 | 不至于 243 | 不若 244 | 不要 245 | 不论 246 | 不起 247 | 不足 248 | 不过 249 | 不迭 250 | 不问 251 | 不限 252 | 与 253 | 与其 254 | 与其说 255 | 与否 256 | 与此同时 257 | 专门 258 | 且 259 | 且不说 260 | 且说 261 | 两者 262 | 严格 263 | 严重 264 | 个 265 | 个人 266 | 个别 267 | 中小 268 | 中间 269 | 丰富 270 | 串行 271 | 临 272 | 临到 273 | 为 274 | 为主 275 | 为了 276 | 为什么 277 | 为什麽 278 | 为何 279 | 为止 280 | 为此 281 | 为着 282 | 主张 283 | 主要 284 | 举凡 285 | 举行 286 | 乃 287 | 乃至 288 | 乃至于 289 | 么 290 | 之 291 | 之一 292 | 之前 293 | 之后 294 | 之後 295 | 之所以 296 | 之类 297 | 乌乎 298 | 乎 299 | 乒 300 | 乘 301 | 乘势 302 | 乘机 303 | 乘胜 304 | 乘虚 305 | 乘隙 306 | 九 307 | 也 308 | 也好 309 | 也就是说 310 | 也是 311 | 也罢 312 | 了 313 | 了解 314 | 争取 315 | 二 316 | 二来 317 | 二话不说 318 | 二话没说 319 | 于 320 | 于是 321 | 于是乎 322 | 云云 323 | 云尔 324 | 互 325 | 互相 326 | 五 327 | 些 328 | 交口 329 | 亦 330 | 产生 331 | 亲口 332 | 亲手 333 | 亲眼 334 | 亲自 335 | 亲身 336 | 人 337 | 人人 338 | 人们 339 | 人家 340 | 人民 341 | 什么 342 | 什么样 343 | 什麽 344 | 仅 345 | 仅仅 346 | 今 347 | 今后 348 | 今天 349 | 今年 350 | 今後 351 | 介于 352 | 仍 353 | 仍旧 354 | 仍然 355 | 从 356 | 从不 357 | 从严 358 | 从中 359 | 从事 360 | 从今以后 361 | 从优 362 | 从古到今 363 | 从古至今 364 | 从头 365 | 从宽 366 | 从小 367 | 从新 368 | 从无到有 369 | 从早到晚 370 | 从未 371 | 从来 372 | 从此 373 | 从此以后 374 | 从而 375 | 从轻 376 | 从速 377 | 从重 378 | 他 379 | 他人 380 | 他们 381 | 他是 382 | 他的 383 | 代替 384 | 以 385 | 以上 386 | 以下 387 | 以为 388 | 以便 389 | 以免 390 | 以前 391 | 以及 392 | 以后 393 | 以外 394 | 以後 395 | 以故 396 | 以期 397 | 以来 398 | 以至 399 | 以至于 400 | 以致 401 | 们 402 | 任 403 | 任何 404 | 任凭 405 | 任务 406 | 企图 407 | 伙同 408 | 会 409 | 伟大 410 | 传 411 | 传说 412 | 传闻 413 | 似乎 414 | 似的 415 | 但 416 | 但凡 417 | 但愿 418 | 但是 419 | 何 420 | 何乐而不为 421 | 何以 422 | 何况 423 | 何处 424 | 何妨 425 | 何尝 426 | 何必 427 | 何时 428 | 何止 429 | 何苦 430 | 何须 431 | 余外 432 | 作为 433 | 你 434 | 你们 435 | 你是 436 | 你的 437 | 使 438 | 使得 439 | 使用 440 | 例如 441 | 依 442 | 依据 443 | 依照 444 | 依靠 445 | 便 446 | 便于 447 | 促进 448 | 保持 449 | 保管 450 | 保险 451 | 俺 452 | 俺们 453 | 倍加 454 | 倍感 455 | 倒不如 456 | 倒不如说 457 | 倒是 458 | 倘 459 | 倘使 460 | 倘或 461 | 倘然 462 | 倘若 463 | 借 464 | 借以 465 | 借此 466 | 假使 467 | 假如 468 | 假若 469 | 偏偏 470 | 做到 471 | 偶尔 472 | 偶而 473 | 傥然 474 | 像 475 | 儿 476 | 允许 477 | 元/吨 478 | 充其极 479 | 充其量 480 | 充分 481 | 先不先 482 | 先后 483 | 先後 484 | 先生 485 | 光 486 | 光是 487 | 全体 488 | 全力 489 | 全年 490 | 全然 491 | 全身心 492 | 全部 493 | 全都 494 | 全面 495 | 八 496 | 八成 497 | 公然 498 | 六 499 | 兮 500 | 共 501 | 共同 502 | 共总 503 | 关于 504 | 其 505 | 其一 506 | 其中 507 | 其二 508 | 其他 509 | 其余 510 | 其后 511 | 其它 512 | 其实 513 | 其次 514 | 具体 515 | 具体地说 516 | 具体来说 517 | 具体说来 518 | 具有 519 | 兼之 520 | 内 521 | 再 522 | 再其次 523 | 再则 524 | 再有 525 | 再次 526 | 再者 527 | 再者说 528 | 再说 529 | 冒 530 | 冲 531 | 决不 532 | 决定 533 | 决非 534 | 况且 535 | 准备 536 | 凑巧 537 | 凝神 538 | 几 539 | 几乎 540 | 几度 541 | 几时 542 | 几番 543 | 几经 544 | 凡 545 | 凡是 546 | 凭 547 | 凭借 548 | 出 549 | 出于 550 | 出去 551 | 出来 552 | 出现 553 | 分别 554 | 分头 555 | 分期 556 | 分期分批 557 | 切 558 | 切不可 559 | 切切 560 | 切勿 561 | 切莫 562 | 则 563 | 则甚 564 | 刚 565 | 刚好 566 | 刚巧 567 | 刚才 568 | 初 569 | 别 570 | 别人 571 | 别处 572 | 别是 573 | 别的 574 | 别管 575 | 别说 576 | 到 577 | 到了儿 578 | 到处 579 | 到头 580 | 到头来 581 | 到底 582 | 到目前为止 583 | 前后 584 | 前此 585 | 前者 586 | 前进 587 | 前面 588 | 加上 589 | 加之 590 | 加以 591 | 加入 592 | 加强 593 | 动不动 594 | 动辄 595 | 勃然 596 | 匆匆 597 | 十分 598 | 千 599 | 千万 600 | 千万千万 601 | 半 602 | 单 603 | 单单 604 | 单纯 605 | 即 606 | 即令 607 | 即使 608 | 即便 609 | 即刻 610 | 即如 611 | 即将 612 | 即或 613 | 即是说 614 | 即若 615 | 却 616 | 却不 617 | 历 618 | 原来 619 | 去 620 | 又 621 | 又及 622 | 及 623 | 及其 624 | 及时 625 | 及至 626 | 双方 627 | 反之 628 | 反之亦然 629 | 反之则 630 | 反倒 631 | 反倒是 632 | 反应 633 | 反手 634 | 反映 635 | 反而 636 | 反过来 637 | 反过来说 638 | 取得 639 | 取道 640 | 受到 641 | 变成 642 | 古来 643 | 另 644 | 另一个 645 | 另一方面 646 | 另外 647 | 另悉 648 | 另方面 649 | 另行 650 | 只 651 | 只当 652 | 只怕 653 | 只是 654 | 只有 655 | 只消 656 | 只要 657 | 只限 658 | 叫 659 | 叫做 660 | 召开 661 | 叮咚 662 | 叮当 663 | 可 664 | 可以 665 | 可好 666 | 可是 667 | 可能 668 | 可见 669 | 各 670 | 各个 671 | 各人 672 | 各位 673 | 各地 674 | 各式 675 | 各种 676 | 各级 677 | 各自 678 | 合理 679 | 同 680 | 同一 681 | 同时 682 | 同样 683 | 后 684 | 后来 685 | 后者 686 | 后面 687 | 向 688 | 向使 689 | 向着 690 | 吓 691 | 吗 692 | 否则 693 | 吧 694 | 吧哒 695 | 吱 696 | 呀 697 | 呃 698 | 呆呆地 699 | 呐 700 | 呕 701 | 呗 702 | 呜 703 | 呜呼 704 | 呢 705 | 周围 706 | 呵 707 | 呵呵 708 | 呸 709 | 呼哧 710 | 呼啦 711 | 咋 712 | 和 713 | 咚 714 | 咦 715 | 咧 716 | 咱 717 | 咱们 718 | 咳 719 | 哇 720 | 哈 721 | 哈哈 722 | 哉 723 | 哎 724 | 哎呀 725 | 哎哟 726 | 哗 727 | 哗啦 728 | 哟 729 | 哦 730 | 哩 731 | 哪 732 | 哪个 733 | 哪些 734 | 哪儿 735 | 哪天 736 | 哪年 737 | 哪怕 738 | 哪样 739 | 哪边 740 | 哪里 741 | 哼 742 | 哼唷 743 | 唉 744 | 唯有 745 | 啊 746 | 啊呀 747 | 啊哈 748 | 啊哟 749 | 啐 750 | 啥 751 | 啦 752 | 啪达 753 | 啷当 754 | 喀 755 | 喂 756 | 喏 757 | 喔唷 758 | 喽 759 | 嗡 760 | 嗡嗡 761 | 嗬 762 | 嗯 763 | 嗳 764 | 嘎 765 | 嘎嘎 766 | 嘎登 767 | 嘘 768 | 嘛 769 | 嘻 770 | 嘿 771 | 嘿嘿 772 | 四 773 | 因 774 | 因为 775 | 因了 776 | 因此 777 | 因着 778 | 因而 779 | 固 780 | 固然 781 | 在 782 | 在下 783 | 在于 784 | 地 785 | 均 786 | 坚决 787 | 坚持 788 | 基于 789 | 基本 790 | 基本上 791 | 处在 792 | 处处 793 | 处理 794 | 复杂 795 | 多 796 | 多么 797 | 多亏 798 | 多多 799 | 多多少少 800 | 多多益善 801 | 多少 802 | 多年前 803 | 多年来 804 | 多数 805 | 多次 806 | 够瞧的 807 | 大 808 | 大不了 809 | 大举 810 | 大事 811 | 大体 812 | 大体上 813 | 大凡 814 | 大力 815 | 大多 816 | 大多数 817 | 大大 818 | 大家 819 | 大张旗鼓 820 | 大批 821 | 大抵 822 | 大概 823 | 大略 824 | 大约 825 | 大致 826 | 大都 827 | 大量 828 | 大面儿上 829 | 失去 830 | 奇 831 | 奈 832 | 奋勇 833 | 她 834 | 她们 835 | 她是 836 | 她的 837 | 好 838 | 好在 839 | 好的 840 | 好象 841 | 如 842 | 如上 843 | 如上所述 844 | 如下 845 | 如今 846 | 如何 847 | 如其 848 | 如前所述 849 | 如同 850 | 如常 851 | 如是 852 | 如期 853 | 如果 854 | 如次 855 | 如此 856 | 如此等等 857 | 如若 858 | 始而 859 | 姑且 860 | 存在 861 | 存心 862 | 孰料 863 | 孰知 864 | 宁 865 | 宁可 866 | 宁愿 867 | 宁肯 868 | 它 869 | 它们 870 | 它们的 871 | 它是 872 | 它的 873 | 安全 874 | 完全 875 | 完成 876 | 定 877 | 实现 878 | 实际 879 | 宣布 880 | 容易 881 | 密切 882 | 对 883 | 对于 884 | 对应 885 | 对待 886 | 对方 887 | 对比 888 | 将 889 | 将才 890 | 将要 891 | 将近 892 | 小 893 | 少数 894 | 尔 895 | 尔后 896 | 尔尔 897 | 尔等 898 | 尚且 899 | 尤其 900 | 就 901 | 就地 902 | 就是 903 | 就是了 904 | 就是说 905 | 就此 906 | 就算 907 | 就要 908 | 尽 909 | 尽可能 910 | 尽如人意 911 | 尽心尽力 912 | 尽心竭力 913 | 尽快 914 | 尽早 915 | 尽然 916 | 尽管 917 | 尽管如此 918 | 尽量 919 | 局外 920 | 居然 921 | 届时 922 | 属于 923 | 屡 924 | 屡屡 925 | 屡次 926 | 屡次三番 927 | 岂 928 | 岂但 929 | 岂止 930 | 岂非 931 | 川流不息 932 | 左右 933 | 巨大 934 | 巩固 935 | 差一点 936 | 差不多 937 | 己 938 | 已 939 | 已矣 940 | 已经 941 | 巴 942 | 巴巴 943 | 带 944 | 帮助 945 | 常 946 | 常常 947 | 常言说 948 | 常言说得好 949 | 常言道 950 | 平素 951 | 年复一年 952 | 并 953 | 并不 954 | 并不是 955 | 并且 956 | 并排 957 | 并无 958 | 并没 959 | 并没有 960 | 并肩 961 | 并非 962 | 广大 963 | 广泛 964 | 应当 965 | 应用 966 | 应该 967 | 庶乎 968 | 庶几 969 | 开外 970 | 开始 971 | 开展 972 | 引起 973 | 弗 974 | 弹指之间 975 | 强烈 976 | 归根到底 977 | 归根结底 978 | 归齐 979 | 当 980 | 当下 981 | 当中 982 | 当儿 983 | 当前 984 | 当即 985 | 当口儿 986 | 当地 987 | 当场 988 | 当头 989 | 当庭 990 | 当时 991 | 当然 992 | 当真 993 | 当着 994 | 形成 995 | 彻夜 996 | 彻底 997 | 彼 998 | 彼时 999 | 彼此 1000 | 往 1001 | 往往 1002 | 待 1003 | 待到 1004 | 很 1005 | 很多 1006 | 很少 1007 | 後来 1008 | 後面 1009 | 得 1010 | 得了 1011 | 得出 1012 | 得到 1013 | 得天独厚 1014 | 得起 1015 | 心里 1016 | 必 1017 | 必定 1018 | 必将 1019 | 必然 1020 | 必要 1021 | 必须 1022 | 快 1023 | 快要 1024 | 忽地 1025 | 忽然 1026 | 怎 1027 | 怎么 1028 | 怎么办 1029 | 怎么样 1030 | 怎奈 1031 | 怎样 1032 | 怎麽 1033 | 怕 1034 | 急匆匆 1035 | 怪 1036 | 怪不得 1037 | 总之 1038 | 总是 1039 | 总的来看 1040 | 总的来说 1041 | 总的说来 1042 | 总结 1043 | 总而言之 1044 | 恍然 1045 | 恐怕 1046 | 恰似 1047 | 恰好 1048 | 恰如 1049 | 恰巧 1050 | 恰恰 1051 | 恰恰相反 1052 | 恰逢 1053 | 您 1054 | 您们 1055 | 您是 1056 | 惟其 1057 | 惯常 1058 | 意思 1059 | 愤然 1060 | 愿意 1061 | 慢说 1062 | 成为 1063 | 成年 1064 | 成年累月 1065 | 成心 1066 | 我 1067 | 我们 1068 | 我是 1069 | 我的 1070 | 或 1071 | 或则 1072 | 或多或少 1073 | 或是 1074 | 或曰 1075 | 或者 1076 | 或许 1077 | 战斗 1078 | 截然 1079 | 截至 1080 | 所 1081 | 所以 1082 | 所在 1083 | 所幸 1084 | 所有 1085 | 所谓 1086 | 才 1087 | 才能 1088 | 扑通 1089 | 打 1090 | 打从 1091 | 打开天窗说亮话 1092 | 扩大 1093 | 把 1094 | 抑或 1095 | 抽冷子 1096 | 拦腰 1097 | 拿 1098 | 按 1099 | 按时 1100 | 按期 1101 | 按照 1102 | 按理 1103 | 按说 1104 | 挨个 1105 | 挨家挨户 1106 | 挨次 1107 | 挨着 1108 | 挨门挨户 1109 | 挨门逐户 1110 | 换句话说 1111 | 换言之 1112 | 据 1113 | 据实 1114 | 据悉 1115 | 据我所知 1116 | 据此 1117 | 据称 1118 | 据说 1119 | 掌握 1120 | 接下来 1121 | 接着 1122 | 接著 1123 | 接连不断 1124 | 放量 1125 | 故 1126 | 故意 1127 | 故此 1128 | 故而 1129 | 敞开儿 1130 | 敢 1131 | 敢于 1132 | 敢情 1133 | 数/ 1134 | 整个 1135 | 断然 1136 | 方 1137 | 方便 1138 | 方才 1139 | 方能 1140 | 方面 1141 | 旁人 1142 | 无 1143 | 无宁 1144 | 无法 1145 | 无论 1146 | 既 1147 | 既...又 1148 | 既往 1149 | 既是 1150 | 既然 1151 | 日复一日 1152 | 日渐 1153 | 日益 1154 | 日臻 1155 | 日见 1156 | 时候 1157 | 昂然 1158 | 明显 1159 | 明确 1160 | 是 1161 | 是不是 1162 | 是以 1163 | 是否 1164 | 是的 1165 | 显然 1166 | 显著 1167 | 普通 1168 | 普遍 1169 | 暗中 1170 | 暗地里 1171 | 暗自 1172 | 更 1173 | 更为 1174 | 更加 1175 | 更进一步 1176 | 曾 1177 | 曾经 1178 | 替 1179 | 替代 1180 | 最 1181 | 最后 1182 | 最大 1183 | 最好 1184 | 最後 1185 | 最近 1186 | 最高 1187 | 有 1188 | 有些 1189 | 有关 1190 | 有利 1191 | 有力 1192 | 有及 1193 | 有所 1194 | 有效 1195 | 有时 1196 | 有点 1197 | 有的 1198 | 有的是 1199 | 有着 1200 | 有著 1201 | 望 1202 | 朝 1203 | 朝着 1204 | 末##末 1205 | 本 1206 | 本人 1207 | 本地 1208 | 本着 1209 | 本身 1210 | 权时 1211 | 来 1212 | 来不及 1213 | 来得及 1214 | 来看 1215 | 来着 1216 | 来自 1217 | 来讲 1218 | 来说 1219 | 极 1220 | 极为 1221 | 极了 1222 | 极其 1223 | 极力 1224 | 极大 1225 | 极度 1226 | 极端 1227 | 构成 1228 | 果然 1229 | 果真 1230 | 某 1231 | 某个 1232 | 某些 1233 | 某某 1234 | 根据 1235 | 根本 1236 | 格外 1237 | 梆 1238 | 概 1239 | 次第 1240 | 欢迎 1241 | 欤 1242 | 正值 1243 | 正在 1244 | 正如 1245 | 正巧 1246 | 正常 1247 | 正是 1248 | 此 1249 | 此中 1250 | 此后 1251 | 此地 1252 | 此处 1253 | 此外 1254 | 此时 1255 | 此次 1256 | 此间 1257 | 殆 1258 | 毋宁 1259 | 每 1260 | 每个 1261 | 每天 1262 | 每年 1263 | 每当 1264 | 每时每刻 1265 | 每每 1266 | 每逢 1267 | 比 1268 | 比及 1269 | 比如 1270 | 比如说 1271 | 比方 1272 | 比照 1273 | 比起 1274 | 比较 1275 | 毕竟 1276 | 毫不 1277 | 毫无 1278 | 毫无例外 1279 | 毫无保留地 1280 | 汝 1281 | 沙沙 1282 | 没 1283 | 没奈何 1284 | 没有 1285 | 沿 1286 | 沿着 1287 | 注意 1288 | 活 1289 | 深入 1290 | 清楚 1291 | 满 1292 | 满足 1293 | 漫说 1294 | 焉 1295 | 然 1296 | 然则 1297 | 然后 1298 | 然後 1299 | 然而 1300 | 照 1301 | 照着 1302 | 牢牢 1303 | 特别是 1304 | 特殊 1305 | 特点 1306 | 犹且 1307 | 犹自 1308 | 独 1309 | 独自 1310 | 猛然 1311 | 猛然间 1312 | 率尔 1313 | 率然 1314 | 现代 1315 | 现在 1316 | 理应 1317 | 理当 1318 | 理该 1319 | 瑟瑟 1320 | 甚且 1321 | 甚么 1322 | 甚或 1323 | 甚而 1324 | 甚至 1325 | 甚至于 1326 | 用 1327 | 用来 1328 | 甫 1329 | 甭 1330 | 由 1331 | 由于 1332 | 由是 1333 | 由此 1334 | 由此可见 1335 | 略 1336 | 略为 1337 | 略加 1338 | 略微 1339 | 白 1340 | 白白 1341 | 的 1342 | 的确 1343 | 的话 1344 | 皆可 1345 | 目前 1346 | 直到 1347 | 直接 1348 | 相似 1349 | 相信 1350 | 相反 1351 | 相同 1352 | 相对 1353 | 相对而言 1354 | 相应 1355 | 相当 1356 | 相等 1357 | 省得 1358 | 看 1359 | 看上去 1360 | 看出 1361 | 看到 1362 | 看来 1363 | 看样子 1364 | 看看 1365 | 看见 1366 | 看起来 1367 | 真是 1368 | 真正 1369 | 眨眼 1370 | 着 1371 | 着呢 1372 | 矣 1373 | 矣乎 1374 | 矣哉 1375 | 知道 1376 | 砰 1377 | 确定 1378 | 碰巧 1379 | 社会主义 1380 | 离 1381 | 种 1382 | 积极 1383 | 移动 1384 | 究竟 1385 | 穷年累月 1386 | 突出 1387 | 突然 1388 | 窃 1389 | 立 1390 | 立刻 1391 | 立即 1392 | 立地 1393 | 立时 1394 | 立马 1395 | 竟 1396 | 竟然 1397 | 竟而 1398 | 第 1399 | 第二 1400 | 等 1401 | 等到 1402 | 等等 1403 | 策略地 1404 | 简直 1405 | 简而言之 1406 | 简言之 1407 | 管 1408 | 类如 1409 | 粗 1410 | 精光 1411 | 紧接着 1412 | 累年 1413 | 累次 1414 | 纯 1415 | 纯粹 1416 | 纵 1417 | 纵令 1418 | 纵使 1419 | 纵然 1420 | 练习 1421 | 组成 1422 | 经 1423 | 经常 1424 | 经过 1425 | 结合 1426 | 结果 1427 | 给 1428 | 绝 1429 | 绝不 1430 | 绝对 1431 | 绝非 1432 | 绝顶 1433 | 继之 1434 | 继后 1435 | 继续 1436 | 继而 1437 | 维持 1438 | 综上所述 1439 | 缕缕 1440 | 罢了 1441 | 老 1442 | 老大 1443 | 老是 1444 | 老老实实 1445 | 考虑 1446 | 者 1447 | 而 1448 | 而且 1449 | 而况 1450 | 而又 1451 | 而后 1452 | 而外 1453 | 而已 1454 | 而是 1455 | 而言 1456 | 而论 1457 | 联系 1458 | 联袂 1459 | 背地里 1460 | 背靠背 1461 | 能 1462 | 能否 1463 | 能够 1464 | 腾 1465 | 自 1466 | 自个儿 1467 | 自从 1468 | 自各儿 1469 | 自后 1470 | 自家 1471 | 自己 1472 | 自打 1473 | 自身 1474 | 臭 1475 | 至 1476 | 至于 1477 | 至今 1478 | 至若 1479 | 致 1480 | 般的 1481 | 良好 1482 | 若 1483 | 若夫 1484 | 若是 1485 | 若果 1486 | 若非 1487 | 范围 1488 | 莫 1489 | 莫不 1490 | 莫不然 1491 | 莫如 1492 | 莫若 1493 | 莫非 1494 | 获得 1495 | 藉以 1496 | 虽 1497 | 虽则 1498 | 虽然 1499 | 虽说 1500 | 蛮 1501 | 行为 1502 | 行动 1503 | 表明 1504 | 表示 1505 | 被 1506 | 要 1507 | 要不 1508 | 要不是 1509 | 要不然 1510 | 要么 1511 | 要是 1512 | 要求 1513 | 见 1514 | 规定 1515 | 觉得 1516 | 譬喻 1517 | 譬如 1518 | 认为 1519 | 认真 1520 | 认识 1521 | 让 1522 | 许多 1523 | 论 1524 | 论说 1525 | 设使 1526 | 设或 1527 | 设若 1528 | 诚如 1529 | 诚然 1530 | 话说 1531 | 该 1532 | 该当 1533 | 说来 1534 | 说说 1535 | 请勿 1536 | 诸 1537 | 诸位 1538 | 诸如 1539 | 谁 1540 | 谁人 1541 | 谁料 1542 | 谁知 1543 | 谨 1544 | 豁然 1545 | 贼死 1546 | 赖以 1547 | 赶 1548 | 赶快 1549 | 赶早不赶晚 1550 | 起 1551 | 起先 1552 | 起初 1553 | 起头 1554 | 起来 1555 | 起见 1556 | 起首 1557 | 趁 1558 | 趁便 1559 | 趁势 1560 | 趁早 1561 | 趁机 1562 | 趁热 1563 | 趁着 1564 | 越是 1565 | 距 1566 | 跟 1567 | 路经 1568 | 转动 1569 | 转变 1570 | 转贴 1571 | 轰然 1572 | 较 1573 | 较为 1574 | 较之 1575 | 较比 1576 | 边 1577 | 达到 1578 | 达旦 1579 | 迄 1580 | 迅速 1581 | 过 1582 | 过于 1583 | 过去 1584 | 过来 1585 | 运用 1586 | 近 1587 | 近几年来 1588 | 近年来 1589 | 近来 1590 | 还 1591 | 还是 1592 | 还有 1593 | 还要 1594 | 这 1595 | 这一来 1596 | 这个 1597 | 这么 1598 | 这么些 1599 | 这么样 1600 | 这么点儿 1601 | 这些 1602 | 这会儿 1603 | 这儿 1604 | 这就是说 1605 | 这时 1606 | 这样 1607 | 这次 1608 | 这点 1609 | 这种 1610 | 这般 1611 | 这边 1612 | 这里 1613 | 这麽 1614 | 进入 1615 | 进去 1616 | 进来 1617 | 进步 1618 | 进而 1619 | 进行 1620 | 连 1621 | 连同 1622 | 连声 1623 | 连日 1624 | 连日来 1625 | 连袂 1626 | 连连 1627 | 迟早 1628 | 迫于 1629 | 适应 1630 | 适当 1631 | 适用 1632 | 逐步 1633 | 逐渐 1634 | 通常 1635 | 通过 1636 | 造成 1637 | 逢 1638 | 遇到 1639 | 遭到 1640 | 遵循 1641 | 遵照 1642 | 避免 1643 | 那 1644 | 那个 1645 | 那么 1646 | 那么些 1647 | 那么样 1648 | 那些 1649 | 那会儿 1650 | 那儿 1651 | 那时 1652 | 那末 1653 | 那样 1654 | 那般 1655 | 那边 1656 | 那里 1657 | 那麽 1658 | 部分 1659 | 都 1660 | 鄙人 1661 | 采取 1662 | 里面 1663 | 重大 1664 | 重新 1665 | 重要 1666 | 鉴于 1667 | 针对 1668 | 长期以来 1669 | 长此下去 1670 | 长线 1671 | 长话短说 1672 | 问题 1673 | 间或 1674 | 防止 1675 | 阿 1676 | 附近 1677 | 陈年 1678 | 限制 1679 | 陡然 1680 | 除 1681 | 除了 1682 | 除却 1683 | 除去 1684 | 除外 1685 | 除开 1686 | 除此 1687 | 除此之外 1688 | 除此以外 1689 | 除此而外 1690 | 除非 1691 | 随 1692 | 随后 1693 | 随时 1694 | 随着 1695 | 随著 1696 | 隔夜 1697 | 隔日 1698 | 难得 1699 | 难怪 1700 | 难说 1701 | 难道 1702 | 难道说 1703 | 集中 1704 | 零 1705 | 需要 1706 | 非但 1707 | 非常 1708 | 非徒 1709 | 非得 1710 | 非特 1711 | 非独 1712 | 靠 1713 | 顶多 1714 | 顷 1715 | 顷刻 1716 | 顷刻之间 1717 | 顷刻间 1718 | 顺 1719 | 顺着 1720 | 顿时 1721 | 颇 1722 | 风雨无阻 1723 | 饱 1724 | 首先 1725 | 马上 1726 | 高低 1727 | 高兴 1728 | 默然 1729 | 默默地 1730 | 齐 1731 | ︿ 1732 | ! 1733 | # 1734 | $ 1735 | % 1736 | & 1737 | ' 1738 | ( 1739 | ) 1740 | )÷(1- 1741 | )、 1742 | * 1743 | + 1744 | +ξ 1745 | ++ 1746 | , 1747 | ,也 1748 | - 1749 | -β 1750 | -- 1751 | -[*]- 1752 | . 1753 | / 1754 | 0 1755 | 0:2 1756 | 1 1757 | 1. 1758 | 12% 1759 | 2 1760 | 2.3% 1761 | 3 1762 | 4 1763 | 5 1764 | 5:0 1765 | 6 1766 | 7 1767 | 8 1768 | 9 1769 | : 1770 | ; 1771 | < 1772 | <± 1773 | <Δ 1774 | <λ 1775 | <φ 1776 | << 1777 | = 1778 | =″ 1779 | =☆ 1780 | =( 1781 | =- 1782 | =[ 1783 | ={ 1784 | > 1785 | >λ 1786 | ? 1787 | @ 1788 | A 1789 | LI 1790 | R.L. 1791 | ZXFITL 1792 | [ 1793 | [①①] 1794 | [①②] 1795 | [①③] 1796 | [①④] 1797 | [①⑤] 1798 | [①⑥] 1799 | [①⑦] 1800 | [①⑧] 1801 | [①⑨] 1802 | [①A] 1803 | [①B] 1804 | [①C] 1805 | [①D] 1806 | [①E] 1807 | [①] 1808 | [①a] 1809 | [①c] 1810 | [①d] 1811 | [①e] 1812 | [①f] 1813 | [①g] 1814 | [①h] 1815 | [①i] 1816 | [①o] 1817 | [② 1818 | [②①] 1819 | [②②] 1820 | [②③] 1821 | [②④ 1822 | [②⑤] 1823 | [②⑥] 1824 | [②⑦] 1825 | [②⑧] 1826 | [②⑩] 1827 | [②B] 1828 | [②G] 1829 | [②] 1830 | [②a] 1831 | [②b] 1832 | [②c] 1833 | [②d] 1834 | [②e] 1835 | [②f] 1836 | [②g] 1837 | [②h] 1838 | [②i] 1839 | [②j] 1840 | [③①] 1841 | [③⑩] 1842 | [③F] 1843 | [③] 1844 | [③a] 1845 | [③b] 1846 | [③c] 1847 | [③d] 1848 | [③e] 1849 | [③g] 1850 | [③h] 1851 | [④] 1852 | [④a] 1853 | [④b] 1854 | [④c] 1855 | [④d] 1856 | [④e] 1857 | [⑤] 1858 | [⑤]] 1859 | [⑤a] 1860 | [⑤b] 1861 | [⑤d] 1862 | [⑤e] 1863 | [⑤f] 1864 | [⑥] 1865 | [⑦] 1866 | [⑧] 1867 | [⑨] 1868 | [⑩] 1869 | [*] 1870 | [- 1871 | [] 1872 | ] 1873 | ]∧′=[ 1874 | ][ 1875 | _ 1876 | a] 1877 | b] 1878 | c] 1879 | e] 1880 | f] 1881 | ng昉 1882 | { 1883 | {- 1884 | | 1885 | } 1886 | }> 1887 | ~ 1888 | ~± 1889 | ~+ 1890 | ¥ 1891 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Project-1 2 | # 0 整体目标 3 | ## 0.1 初级目标:新闻人物言论自动提取 即 得到说话的人和说话的内容 4 | > ### 思路: 5 | >> * 1) 加载语料库,语料库来源于2部分: 6 | >>>> * wiki百科,使用wiki_extractor进行抽取,中文繁体转换为中文简体,[具体操作](https://github.com/CuiShaohua/AI-homework/blob/master/%E7%AC%AC%E5%9B%9B%E6%AC%A1%E4%BD%9C%E4%B8%9A.ipynb) 7 | >>>> * 新闻语料库,使用18年新华社新闻库,存放在MySQL数据库中。 8 | >> * 2) 加载模型(ltp分词、词性标注、依存句法分析)(这些在哈工大的ltp语言模型中都有的,只要安装好就可以用) 9 | >>>> * cws.model对应分词模型 10 | >>>> * parser.model对应依存句法分析模型 11 | >>>> * pos.model对应词性标注模型 12 | >>>> * pisrl.model对应语义角色分析模型 13 | >> * 3) 根据上述模型和语料库(按行处理)得到依存句法关系parserlist。 14 | >>>> * 这部分处理主要是为了找出所有的SBV主谓结构的句子,为后来的验证模型做准备。 15 | >> * 4) 使用gensim工具加载预训练好的词向量模型word2vec.model 16 | >>> * gensim.Word2Vec 17 | >> * 5) 通过word2vec.most_similar('说', topn=10) 得到一个以跟‘说’意思相近的词和相近的概率组成的元组,10个元组组成的列表。 18 | >>>> * 本文采用10次迭代gensim相似词结果计算,并且每次迭代的计算结果先进行词性分析,如果为verb再加入到下次迭代计算中,这样获得与“说”类似的词更为精准。 19 | >> * 6) 仅仅是上面10个与‘说’意义相近的词是不够的,写个函数来获取更多相近的词。首先把第五步的‘词’取出来,把其后面的概率舍弃。取出来之后,按那10个词组成的列表利用word2vec模型分别找出与这10个词相近的词,这样广度优先搜索,那么他的深度就是10。这样就得到了一组以‘说’这个意思的词语组成的一个列表,绝对是大于10个的,比如说这些近义词可以是这些['眼中', '称', '说', '指出', '坦言', '明说', '写道', '看来', '地说', '所说', '透露',‘普遍认为', '告诉', '眼里', '直言', '强调', '文说', '说道', '武说', '表示', '提到', '正说', '介绍', '相信', '认为', '问', '报道']等。 20 | >>>> * 增加激活词,可以参考哈工大同义词词林的方法进行增加。 21 | >> * 7) 接下来可以手动加入一些新闻中可能出现的和‘说’意思相近的一些词,但是上面我们并没有找到的,比如‘报道’。 22 | >>>> * 手动添加激活词虽然略显笨拙,但是像“强调”、“说明”诸类词会被停用词剔除,但这些词在新闻中确实是经常容易出现的,因此,手动添加激活词有时候也是必要的。 23 | >> * 8) 获取与‘说’意思相近的词之后,相当于已有谓语动词,接下来要找谓语前面的主语和后面的宾语了。由前面我们获取的句法依存关系,找出依存关系是主谓关系(SBV)的,并且SBV的谓语动词应该是前面获取的‘说’的近义词。那么接着应该找出动词的位置,主语和宾语的位置自然就找出来,就能表示了。那么怎么找位置?SBV词所在的索引就是主语。 24 | >>>> * 但是找主语要注意必须指代消解,消除代词,找到实际的名词,[指代消解常用的方法参考](http://xueshu.baidu.com/usercenter/paper/show?paperid=6c3d6787eaf4f177a9b026dcc607e716&site=xueshu_se) 25 | >> * 9) 获得主语和谓语‘说’的序号之后,我们就要取得‘说的内容’也就是SBV的宾语。那么怎么寻找说的内容呢?首先我们看‘说’后面是否有双引号内容,如果有,取到它,是根据双引号的位置来取得。如果没有或者双引号的内容并不在第一个句子,那么‘说’这个词后面的句子就是‘说的内容’。然后检查第二个句子是否也是‘说的内容’,通过句子的相似性来判断,如果相似度大于某个阈值,我们就认为相似,也就认为这第二句话也是‘说的内容’。至此我们得到了宾语的内容。 26 | >>>> * 在这一步中,主要考虑应当是同一说话人的句子之间有无联系,当输入说话人的段落时,首先进行分句,然后ltp处理之后,每个单句之间的相似度采用Tfidf进行判别。 27 | 28 | ## 0.2 中级目标:由新闻人物言论的自动提取,找到相似文章,并根据文章内容进行新闻推送 29 | > ### 思路: 30 | >> * 1) 使用Tfidf进行文档的相似度判断,具体采用工具scikit learning 31 | >> * 2) 思考设置合理的权重,向输入文本的用户推荐8W+ 新华社新闻稿中相似度最接近用户输入的Top5文章 32 | ## 0.3 高级目标:对多个说话人针对同一件事情的不同观点进行整理,输出人物的正负面评价分析 33 | > ### 思路: 34 | >> * 1) 合理使用正负面评价和情感分析的语料库,针对同一事件不同人的看法进行聚类分析 35 | # 1 实现方法 36 | ## 1.1 准备环境 37 | > * OS环境:华为云主机CentOS7.6 38 | > * 软件环境: 39 | >> * 1) Python3.5.1 40 | >> * 2) jieba、pyltp3.4.0、gensim、 41 | >> * 3) flask、Bootstrap、html 42 | > * 语料库:wiki中文版和8W新闻稿-已经合成merge_corpus 43 | ## 1.2 运行方法 44 | > * 1 flask文件夹下,指定app: 45 | ```Shell 46 | export FLASK_APP=myproject.py 47 | ``` 48 | > * 2 flask文件夹下,运行: 49 | ```Shell 50 | nohup firefox & 51 | ``` 52 | > * 3 flask文件夹下,运行: 53 | ```Shell 54 | flask run 55 | ``` 56 | > * 4 firefox浏览器运行<127.0.0.1:5000> 57 | 58 | ## 1.3 目录结构 59 | . 60 | ├── app 61 | │   ├── forms.py 62 | │   ├── forms.py.bak 63 | │   ├── __init__.py 64 | │   ├── review_content.py 65 | │   ├── routes.py 66 | │   ├── static 67 | │   │   └── images 68 | │   │   ├── \345\257\271\350\257\235\346\203\205\347\273\252\350\257\206\345\210\253.PNG 69 | │   │   ├── \346\203\205\346\204\237\345\200\276\345\220\221\345\210\206\346\236\220.PNG 70 | │   │   ├── \346\226\207\347\253\240\345\210\206\347\261\273.PNG 71 | │   │   ├── \346\226\207\347\253\240\346\240\207\347\255\276\347\256\241\347\220\206.PNG 72 | │   │   ├── \346\226\260\351\227\273\346\221\230\350\246\201.PNG 73 | │   │   ├── \350\207\252\344\270\273\347\272\240\351\224\231.PNG 74 | │   │   └── \350\257\204\350\256\272\350\247\202\347\202\271\346\217\220\345\217\226.PNG 75 | │   └── templates 76 | │   ├── base.html 77 | │   ├── form.html 78 | │   ├── index.html 79 | │   └── review_extraction.html 80 | ├── config.py 81 | ├── cws.model 82 | ├── md5.txt 83 | ├── merge_corpus 84 | ├── merge_corpus.model 85 | ├── merge_corpus.model.trainables.syn1neg.npy 86 | ├── merge_corpus.model.wv.vectors.npy 87 | ├── myproject.py 88 | ├── ner.model 89 | ├── parser.model 90 | ├── pisrl.model 91 | ├── pos.model 92 | ├── review_content.py 93 | └── stopwords.txt 94 | 95 | # 2 效果展示 96 | **Home Page** 97 | ![HomePage](https://github.com/CuiShaohua/project1/blob/master/Home.PNG) 98 | **review content extraction** 99 | ![review content extraction](https://github.com/CuiShaohua/project1/blob/master/review_content.PNG) 100 | # 3 代码详解 101 | 102 | ## 3.1 新闻人物说话内容提取-代码详解 103 | * Flask部分 104 | ```Python 105 | #从app模块中即从__init__.py中导入创建的app应用 106 | from app import app 107 | from flask_bootstrap import Bootstrap 108 | from flask import render_template, redirect 109 | from app.forms import NameForm 110 | #from app.numpy import 111 | #建立路由,通过路由可以执行其覆盖的方法,可以多个路由指向同一个方法。 112 | import pandas 113 | from app import review_content 114 | from app import news_extract 115 | @app.route('/') # 指向/ 116 | @app.route('/index') # 指向/index.html 117 | def index(): 118 | return render_template("index.html") 119 | 120 | @app.route('/Review_Extraction',methods=['GET','POST']) 121 | def Review_Extraction (): 122 | name = None 123 | form = NameForm() 124 | if form.validate_on_submit(): # 当提交的内容不为空时 125 | name = form.name.data 126 | old_width = pandas.get_option('display.max_colwidth') 127 | pandas.set_option('display.max_colwidth', -1) 128 | 129 | df = review_content.review_fc(name) 130 | df = news_extract.main(name) 131 | form.name.data = '' 132 | columns = ['Person','SBV','speech_content','sentence'] 133 | return render_template('review_extraction.html', title='Zh_Cola',form=form,tables=[df.to_html(classes='data',escape=True,index=True,sparsify=False,border=1,index_names=False,header=True,columns=columns)], titles=df.columns.values) 134 | 135 | pandas.set_option('display.max_colwidth', old_width) 136 | else: 137 | return render_template('review_extraction.html', title='Zh_Cola',form=form) 138 | 139 | 140 | @app.route('/News_push') 141 | def News_push(): 142 | return "更新中~~~" 143 | 144 | bootstrap = Bootstrap(app) 145 | ``` 146 | * review_content()函数部分 147 | ```Python 148 | #!/usr/bin/ python 149 | # -*- coding: utf-8 -*- 150 | import sys, os 151 | from zhon.hanzi import punctuation 152 | from zhon.hanzi import non_stops 153 | from zhon.hanzi import stops 154 | import logging 155 | 156 | zhon_char = punctuation + non_stops + stops 157 | import pyltp 158 | 159 | import gc 160 | import re 161 | # 从single_sents读句子也可以 162 | def sentence_read(): 163 | 164 | # 0 165 | #Input = open("./single_sents", "r", encoding="utf-8") 166 | # 1 利用sentencesplitter再分一遍句子 167 | with open("./article_corpus", 'r', encoding="utf-8") as fo: 168 | pass 169 | 170 | # 中文文本分句,返回值为字符串组成的列表 171 | def cut_sent(para): 172 | para = re.sub('([。!?\?])([^”’])', r"\1\n\2", para) # 单字符断句符 173 | para = re.sub('(\.{6})([^”’])', r"\1\n\2", para) # 英文省略号 174 | para = re.sub('(\…{2})([^”’])', r"\1\n\2", para) # 中文省略号 175 | para = re.sub('([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para) 176 | # 如果双引号前有终止符,那么双引号才是句子的终点,把分句符\n放到双引号后,注意前面的几句都小心保留了双引号 177 | para = para.rstrip() # 段尾如果有多余的\n就去掉它 178 | # 很多规则中会考虑分号;,但是这里我把它忽略不计,破折号、英文双引号等同样忽略,需要的再做些简单调整即可。 179 | return para.split("\n") 180 | 181 | 182 | # ltp_process,只分析SBV类型的句子。输出SBV主语、谓语“说”和说话内容 183 | def ltp_process(sentence): 184 | stop_words = get_stops_words() # 提取停用词,为SBV词【如“是”等停用词】在SBV词中删除。 185 | 186 | # 分词 187 | segmentor = pyltp.Segmentor() 188 | segmentor.load("./cws.model") 189 | words = segmentor.segment(sentence) 190 | print("\t".join(words)) 191 | segmentor.release() 192 | 193 | # 词性 194 | postagger = pyltp.Postagger() 195 | postagger.load("./pos.model") 196 | postags = postagger.postag(words) 197 | # list-of-string parameter is support in 0.1.5 198 | # postags = postagger.postag(["中国","进出口","银行","与","中国银行","加强","合作"]) 199 | print("\t".join(postags)) 200 | postagger.release() 201 | 202 | # 依存句法分析 203 | parser = pyltp.Parser() 204 | parser.load("./parser.model") 205 | arcs = parser.parse(words, postags) 206 | parser.release() 207 | 208 | # 角色分析,暂时没用上 209 | # 拿到前面来是有用意的,在进行判断了当前的SBV的子节点与"说"有关后,需要抽取这个词,简而言之,是SBV,又对应A0,则这个词一定是主语。 210 | labeller = pyltp.SementicRoleLabeller() 211 | labeller.load("./pisrl.model") 212 | roles = labeller.label(words, postags, arcs) 213 | 214 | print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) 215 | 216 | SBV_set = list() 217 | Subject_label_set = list() 218 | Word_of_speech_content = list() 219 | 220 | Index_of_Subjet = 0 221 | 222 | for arc in arcs: 223 | #SBV_index = get_repeat(arc.head, "SBV") 224 | k = Index_of_Subjet 225 | if arc.relation == "SBV" and words[arc.head - 1] not in stop_words: # 这个地方难道真的不够严谨,不能只判断是不是SBV,因为一旦判断有SBV了,那么必然这个词就是A0 226 | 227 | SBV_set.append(words[arc.head - 1]) # arc.head是从1开始计数,存储SBV指向的谓语动词 228 | Subject_label_set.append(words[Index_of_Subjet]) # 如果有SBV,那么这个词对应的位置肯定是主语 229 | Word_of_speech_content.append(words[arc.head:]) # 拿出来的相当于SBV主语词以后的部分。 230 | 231 | Index_of_Subjet += 1 232 | 233 | else: 234 | Index_of_Subjet += 1 235 | continue # 如果为空列表,该句子没有分析的必要性 236 | 237 | 238 | return SBV_set, Subject_label_set, Word_of_speech_content # 返回的是一个列表,第一个值是SBV的子节点词(HED),第二个是当前SBV的主语。一定要注意,是不是都是[] 239 | 240 | 241 | import pandas as pd 242 | from collections import defaultdict 243 | 244 | def pd_DataFram(): 245 | 246 | ''' 247 | DataFram 结构是这样的 248 | 249 | 列索引 250 | 0 251 | 分句结果 SVB 说话人 说话内容 252 | 行索引 0 句子0 句子0的SVB结果[SVB词的索引列表] [per1, per2, per3,...] [speech1, speech2, speech3] 253 | 1 句子1 句子1的SVB结果[SVB次的索引列表] [per1, per2, per3,...] [speech1, speech2, speech3] 254 | 2 . ... 255 | 3 . 256 | ''' 257 | 258 | #句子成分分析结果 259 | 260 | result_of_data = defaultdict(list) 261 | 262 | return result_of_data 263 | 264 | 265 | import gensim as gm 266 | 267 | # verb_speak是一个包含SBV的列表,非一个词 268 | def is_there_speak(Verb_and_Subject_result_of_ltp_process): 269 | 270 | # 1 投入SBV的词进行检测,看下是不是位于词的列表中。 271 | # 1.1 手动写的这些 272 | manl_add_speak = ['讨论', '交流', '讲话', '说话', '吵架', '争吵', '勉励', '告诫', '戏言', '嗫嚅', '沟通', '切磋', '争论', '研究', '辩解', '坦言', '喧哗', '嚷嚷', '吵吵', '喊叫', '呼唤', '讥讽', '咒骂', '漫骂', '七嘴八舌', '滔滔不绝', '口若悬河', '侃侃而谈', '念念有词', '喋喋不休', '说话', '谈话', '讲话', '叙述', '陈述', '复述', '申述', '说明', '声明', '讲明', '谈论', '辩论', '议论', '讨论', '商谈', '哈谈', '商量', '畅谈', '商讨', '话语', '呓语', '梦话', '怪话', '黑话', '谣言', '谰言', '恶言', '狂言', '流言', '巧言', '忠言', '疾言', '傻话', '胡话', '俗话', '废话', '发言', '婉言', '危言', '谎言', '直言', '预言', '诺言', '诤言'] 273 | # 1.2 迭代10次加入的这些 274 | gensim_speak_list =['说', '却说', '答道', '回答', '问起', '说出', '追问', '干什么', '质问', '不在乎', '没错', '请问', '问及', '问到', '感叹', '告诫', '说谎', '说完', '开玩笑', '讲出', '直言', '想想', '想到', '问说', '责骂', '讥笑', '问过', '转述', '闭嘴', '撒谎', '谈到', '有没有', '骂', '责怪', '取笑', '吹嘘', '听过', '不该', '询问', '坚称', '怒斥', '答', '该死', '忘掉', '说起', '反问', '问道', '忍不住', '苦笑', '没事', '道谢', '问', '对不起', '戏弄', '埋怨', '发脾气', '说道', '原谅', '责备', '大笑', '听罢', '放过', '不解', '没想', '训斥', '认错', '想来', '自嘲', '还好', '打趣', '嘲笑', '后悔', '讥讽', '发怒', '心疼', '发牢骚', '数落', '点头', '认得', '醒悟', '装作', '要死', '流泪', '哭诉', '走开', '动怒', '不屑', '悔恨', '咒骂', '捉弄'] 275 | speak_list = manl_add_speak + gensim_speak_list 276 | 277 | final_speak = list() 278 | final_label = list() 279 | final_speech_content = list() 280 | #tmp_SBV_label_set = Verb_and_Subject_result_of_ltp_process 281 | 282 | for speak, label, speech_content in Verb_and_Subject_result_of_ltp_process: 283 | if speak in speak_list: 284 | 285 | final_speak.append(speak) 286 | final_label.append(label) 287 | final_speech_content.append(speech_content) 288 | 289 | else: 290 | # # 2 如果不在列表中,采用gensim.most_similar()进行判断,相似性大于0.4,认为就是说的同义词 291 | logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s", level=logging.INFO) 292 | mode = gm.models.Word2Vec.load("./merge_corpus.model") 293 | if mode.wv.similarity('说', speak) > 0.4: 294 | print(speak, mode.wv.similarity('说', speak)) 295 | 296 | final_speak.append(speak) 297 | final_label.append(label) 298 | final_speech_content.append(speech_content) 299 | 300 | else: 301 | 302 | continue 303 | print(final_speak, final_label, final_speech_content) 304 | return final_speak, final_label, final_speech_content 305 | 306 | # 把停用词再删除 307 | def get_stops_words(): 308 | with open("./stopwords.txt", "r") as fo: 309 | 310 | stop_words = fo.read().split('\n') 311 | 312 | return stop_words 313 | 314 | def refine_speech_content(): 315 | 316 | # 01 如果只有引号能把所有内容包括,则把引号里的内容拿出来 317 | # 02 如果没有引号,则按逗号进行拆分,并判断是不是一句话。 318 | pass 319 | 320 | 321 | # 主函数 322 | def review_fc(para): 323 | 324 | #0 输入一个句子或者一个段落 325 | paragraph = "党的十八大以来,习近平总书记一直牵挂着广大人民群众的身体健康和用药安全,他强调:要始终把人民群众的身体健康放在首位。他指出,“要密切监测药品短缺情况,采取有效措施,解决好低价药、‘救命药’、‘孤儿药’以及儿童用药的供应问题。" 326 | paragraph = para 327 | result_of_data = pd_DataFram() # 空defaultdict 328 | #0.1 判断句子是否可以分句 329 | cut_result = cut_sent(paragraph) 330 | result_of_data["sentence"] = cut_result 331 | 332 | print(result_of_data["sentence"]) 333 | if cut_result: 334 | for sent in cut_result: # 一个句子一个句子分析 335 | #0.2 判断这个句子是不是含有SBV的成分 336 | ltp_result = ltp_process(sent) # 返回的已经是words[“SVB”]和SBV对应的主语。 337 | verb_of_ltp_result, label_of_ltp_result, Word_of_speech_content = ltp_result 338 | if verb_of_ltp_result: #只要verb_of_ltp_result不为空,就进行判断说,否则该句子就没有说 339 | (sp_list, label_list, speech_list) = is_there_speak(zip(verb_of_ltp_result, label_of_ltp_result, Word_of_speech_content)) 340 | 341 | if sp_list != None: 342 | 343 | result_of_data["SBV"].append(sp_list) 344 | result_of_data["Person"].append(label_list) 345 | result_of_data["speech_content"].append([''.join(k) for k in speech_list if speech_list[0] != ',:']) 346 | 347 | else: 348 | 349 | result_of_data["sentence"].pop() 350 | 351 | print("句子不含有动词说") 352 | 353 | else: 354 | result_of_data["sentence"].pop() 355 | print("该句子不是SBV类型") # 不是SBV类型可以再加一部分判断,按照袁禾那种从动词verb出发,判断是不是说 356 | #可以调袁禾的接口去做 357 | 358 | result_all = pd.DataFrame(result_of_data) 359 | 360 | return result_all 361 | 362 | def main(): 363 | main_fuc() 364 | 365 | if __name__ == "__main__": 366 | 367 | print(main) 368 | ``` 369 | * 两个html部分 370 | > * index.html 371 | ```html 372 | {% extends "bootstrap/base.html" %} 373 | {% block title %}Zh_Cola Lab{% endblock %} 374 | {% block navbar %} 375 | 396 | {% endblock %} 397 | {% block content %} 398 | 406 |
    407 |

    Welcome to our Lab!

    408 |

    Members

    409 |

    袁 禾 王路宁 范倩文 崔少华

    410 | 411 |

    Fuctions

    412 | Review Extraction
    413 | News Push 414 | 415 |

    what can N-L-P do ?

    416 | test 417 | test 418 | test 419 | test 420 | test 421 | test 422 | 423 |
    424 | {% endblock %} 425 | ``` 426 | > * review_extraction.html 427 | ```html 428 | {% extends "bootstrap/base.html" %} 429 | {% block title %}Zh_Cola_Lab{% endblock %} 430 | {% block navbar %} 431 | 452 |
    453 |
    454 | 455 | 456 | {{ form.hidden_tag() }} 457 |

    458 | {{ form.name.label }}
    459 | {{ form.name(size=100) }} 460 |

    461 | 462 |

    {{ form.submit() }}

    463 | 464 |
    465 |
    466 | 467 |
    468 | 469 |

    The result of review_Extraction is

    470 | 471 | {% for table in tables %} 472 |
    473 | 474 | {{titles[loop.index]}} 475 | {{ table|safe }} 476 | 477 | ` 478 | 479 | ``` 480 | ______ 481 | * 更新:添加指代消歧 482 | ![举例](https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/master/pro1.png) 483 | ![指代消歧效果](https://raw.githubusercontent.com/CuiShaohua/News-Review-Pickup/master/pro1_1.png) 484 | 指代消歧本身是一项复杂的过程,当前深度学习算法中也有Coref任务在持续进行,研究学者也开发了不少模型进行计算,比较有代表性的是阿里云的模型,大家可从网上找下相关论文看下。数据集也是公开的,本文暂使用的是基于规则来写,具体参考的算法是[指代消歧的研究方法](https://github.com/CuiShaohua/News-Review-Pickup/blob/master/%E6%B1%89%E8%AF%AD%E8%AF%AD%E7%AF%87%E4%B8%AD%E4%BA%BA%E7%A7%B0%E6%8C%87%E4%BB%A3%E6%B6%88%E6%AD%A7%E7%A0%94%E7%A9%B6.pdf)一文,项目中的关键代码展示在下方: 485 | ```Python 486 | # focus_point_set 487 | class Si: 488 | 489 | def __init__(self, words, postags, old_SI = {}): 490 | 491 | self.words = words # 名词及索引 492 | 493 | self.postags = postags # 主语、宾语、辅助名词及索引 494 | self.params = {} # {'word':'score'} 495 | self.old_SI = old_SI 496 | 497 | def score(self): 498 | # 根据名词和索引及主宾辅的索引情况进行归类并且赋值初始分数 499 | weight_adment = [] 500 | for i,j in self.postags.items(): 501 | # i代表["SBV",'VOB'],j代表索引 502 | # 加入一个权重的修正,将名词词组的得分提高,如score(习近平) = score(总书记) 503 | 504 | if i=='SBV': 505 | for k in j: 506 | if k[0] in self.words.keys() and self.words[k[0]] == k[1]: 507 | self.params[k[0]] = 5 508 | weight_adment.append(k[1]) 509 | else: 510 | pass 511 | elif i=='VOB': 512 | for m in j: 513 | if m[0] in self.words.keys() and self.words[m[0]] == m[1]: 514 | self.params[m[0]] = 2 515 | else: 516 | pass 517 | else: 518 | self.params[i] = 1# "SBV":(词,初始分数) 519 | 520 | for word, index in self.words.items(): 521 | if word not in self.params.keys(): 522 | self.params[word] = 1 523 | # 修正 524 | #print(weight_adment) 525 | for f, k in self.words.items(): 526 | if k in (np.array(weight_adment) + 1).tolist() or k in (np.array(weight_adment) - 1).tolist(): 527 | self.params[f] = 5 528 | 529 | return self.params 530 | 531 | 532 | def update(self): 533 | # 先调用一次score,获得当前的params 534 | params = self.score() 535 | # 比较当前postags和之前的postags 536 | if self.old_SI: 537 | for i, j in self.old_SI.params.items(): 538 | if i not in list(params.keys()) and j>=1: 539 | j -= 1 # 进行简化,衰减程度都变成1 540 | self.old_SI.params[i] = j 541 | 542 | if j <= 0: 543 | self.old_SI.params[i] = 0 544 | #print('update', self.old_SI.params) 545 | return self.old_SI.params 546 | ``` 547 | 548 | 549 | ## 3.2 推荐TOP5新闻-待更新 550 | 551 | 552 | ## 3.3 正负面分析评价-待更新 553 | # 4 update 554 | (1)指代消解的算法还需要再写入初级目标; 555 | (2)Tfidf在判断文档相似性上还需要细心考虑一些权重。 556 | (3)正负面评价分析目前需要参考硕博论文再定思路。 557 | ## 558 | --------------------------------------------------------------------------------