Commit fc16ae28 by 20200203048

first commit

parents
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"对此project的想法:\n",
"\n",
"观察了此porject布置的时间点,是在“实体识别”、“句法分析”之后。应该适当温习算法原理的知识点。\n",
"\n",
"1、实体识别、依存句法等工具自己动手开发实现复杂度较高,挑选“句法结构分析”工具让学员开发,不是特别复杂,又温习了句法分析中的知识点,此处选择CYK算法让学员实现,同时又考察了动态规划的编写。(具体算法因为不知道课程内容,可以根据内容再做调整)\n",
"\n",
"2、经过挑选,选择“企业投资关系图谱”作为学员的任务,原因1:企业投资关系易于理解,模版比较好总结,适合没有训练样本的情景;原因2:企业的称谓较多而复杂,适合考察实体统一和消歧的知识点。\n",
"\n",
"3、对于实体识别和句法分析,我考虑使用stanfordnlp,但是python接口好像可配置性不强,主要就是让学员会调用,会利用调用结果。\n",
"对于实体消歧,我考虑使用上下文相似度进行衡量。\n",
"对于实体统一,我考虑考察一下学员在“企业多名称”派生上面的发散性思维。\n",
"由于不知道此project前几节课中涉及的相关知识点,所以先拍脑袋决定,老师如果对知识点有相关准备和资料可以给我看一下,或者听听老师的规划。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Project 1: 利用信息抽取技术搭建知识库"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"本项目的目的是结合命名实体识别、依存语法分析、实体消歧、实体统一对网站开放语料抓取的数据建立小型知识图谱。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part1:开发句法结构分析工具"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.1 开发工具\n",
"使用CYK算法,根据所提供的:非终结符集合、终结符集合、规则集,对10句句子计算句法结构。\n",
"\n",
"非终结符集合:N={S, NP, VP, PP, DT, VI, VT, NN, IN}\n",
"\n",
"终结符集合:{sleeps, saw, boy, girl, dog, telescope, the, with, in}\n",
"\n",
"规则集: R={\n",
"- (1) S-->NP VP 1.0\n",
"- (2) VP-->VI 0.3\n",
"- ......\n",
"\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# code"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2 计算算法复杂度\n",
"计算上一节开发的算法所对应的时间复杂度和空间复杂度。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# code"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part2:在百度百科辅助下,建立“投资关系”知识图谱"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 实体识别\n",
"data目录中“baike.txt”文件记录了15个实体对应百度百科的url。\n",
"\n",
"借助开源实体识别工具并根据百度百科建立的已知实体对进行识别,对句中实体进行识别。"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"# 首先尝试利用开源工具分出实体\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"# 在此基础上,将百度百科作为已知实体加入词典,对实体进行识别"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 实体消歧\n",
"将句中识别的实体与知识库中实体进行匹配,解决实体歧义问题。\n",
"可利用上下文本相似度进行识别。"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"# 将识别出的实体与知识库中实体进行匹配,解决识别出一个实体对应知识库中多个实体的问题。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 实体统一\n",
"对同一实体具有多个名称的情况进行统一,将多种称谓统一到一个实体上,并体现在实体的属性中(可以给实体建立“别称”属性)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# code"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 关系抽取\n",
"借助句法分析工具,和实体识别的结果,以及正则表达式,设定模版抽取关系。从data目录中news.txt文件中的url对应的新闻提取关系并存储进图数据库。\n",
"\n",
"本次要求抽取投资关系,关系为有向边,由投资方指向被投资方。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"\n",
"# 最后提交文件为识别出的整个投资图谱,以及图谱中结点列表与属性。"
]
}
],
"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
}
{
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Project : 利用信息抽取技术搭建知识库"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"本项目的目的是结合命名实体识别、依存语法分析、实体消歧、实体统一对网站开放语料抓取的数据建立小型知识图谱。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part1:开发句法结构分析工具"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.1 开发工具(15分)\n",
"使用CYK算法,根据所提供的:非终结符集合、终结符集合、规则集,对以下句子计算句法结构。\n",
"\n",
"“the boy saw the dog with a telescope\"\n",
"\n",
"\n",
"\n",
"非终结符集合:N={S, NP, VP, PP, DT, Vi, Vt, NN, IN}\n",
"\n",
"终结符集合:{sleeps, saw, boy, girl, dog, telescope, the, with, in}\n",
"\n",
"规则集: R={\n",
"- (1) S-->NP VP 1.0\n",
"- (2) VP-->VI 0.3\n",
"- (3) VP-->Vt NP 0.4\n",
"- (4) VP-->VP PP 0.3\n",
"- (5) NP-->DT NN 0.8\n",
"- (6) NP-->NP PP 0.2\n",
"- (7) PP-->IN NP 1.0\n",
"- (8) Vi-->sleeps 1.0\n",
"- (9) Vt-->saw 1.0\n",
"- (10) NN-->boy 0.1\n",
"- (11) NN-->girl 0.1\n",
"- (12) NN-->telescope 0.3\n",
"- (13) NN-->dog 0.5\n",
"- (14) DT-->the 0.5\n",
"- (15) DT-->a 0.5\n",
"- (16) IN-->with 0.6\n",
"- (17) IN-->in 0.4\n",
"\n",
"\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# 分数(15)\n",
"class my_CYK(object):\n",
" # TODO: 初始化函数\n",
" def __init__(self, non_ternimal, terminal, rules_prob, start_prob):\n",
" \n",
"\n",
" # TODO: 返回句子的句法结构,并以树状结构打印出来\n",
" def parse_sentence(self, sentence):\n",
"\n",
"\n",
"\n",
"def main(sentence):\n",
" \"\"\"\n",
" 主函数,句法结构分析需要的材料如下\n",
" \"\"\"\n",
" non_terminal = {'S', 'NP', 'VP', 'PP', 'DT', 'Vi', 'Vt', 'NN', 'IN'}\n",
" start_symbol = 'S'\n",
" terminal = {'sleeps', 'saw', 'boy', 'girl', 'dog', 'telescope', 'the', 'with', 'in'}\n",
" rules_prob = {'S': {('NP', 'VP'): 1.0},\n",
" 'VP': {('Vt', 'NP'): 0.8, ('VP', 'PP'): 0.2},\n",
" 'NP': {('DT', 'NN'): 0.8, ('NP', 'PP'): 0.2},\n",
" 'PP': {('IN', 'NP'): 1.0},\n",
" 'Vi': {('sleeps',): 1.0},\n",
" 'Vt': {('saw',): 1.0},\n",
" 'NN': {('boy',): 0.1, ('girl',): 0.1,('telescope',): 0.3,('dog',): 0.5},\n",
" 'DT': {('the',): 1.0},\n",
" 'IN': {('with',): 0.6, ('in',): 0.4},\n",
" }\n",
" cyk = my_CYK(non_terminal, terminal, rules_prob, start_symbol)\n",
" cyk.parse_sentence(sentence)\n",
"\n",
"\n",
"# TODO: 对该测试用例进行测试\n",
"if __name__ == \"__main__\":\n",
" sentence = \"the boy saw the dog with the telescope\"\n",
" main(sentence)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2 计算算法复杂度(3分)\n",
"计算上一节开发的算法所对应的时间复杂度和空间复杂度。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 分数(3)\n",
"# 上面所写的算法的时间复杂度和空间复杂度分别是多少?\n",
"# TODO\n",
"时间复杂度=O(), 空间复杂度=O()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part2 : 抽取企业股权交易关系,并建立知识库"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 练习实体消歧(15分)\n",
"将句中识别的实体与知识库中实体进行匹配,解决实体歧义问题。\n",
"可利用上下文本相似度进行识别。\n",
"\n",
"在data/entity_disambiguation目录中,entity_list.csv是50个实体,valid_data.csv是需要消歧的语句。\n",
"\n",
"答案提交在submit目录中,命名为entity_disambiguation_submit.csv。格式为:第一列是需要消歧的语句序号,第二列为多个“实体起始位坐标-实体结束位坐标:实体序号”以“|”分隔的字符串。\n",
"\n",
"*成绩以实体识别准确率以及召回率综合的F1-score\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"import jieba\n",
"import pandas as pd\n",
"\n",
"# TODO:将entity_list.csv中已知实体的名称导入分词词典\n",
"entity_data = pd.read_csv('../data/entity_disambiguation/entity_list.csv', encoding = 'utf-8')\n",
"\n",
"\n",
"# TODO:对每句句子识别并匹配实体 \n",
"valid_data = pd.read_csv('../data/entity_disambiguation/valid_data.csv', encoding = 'gb18030')\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# TODO:将计算结果存入文件\n",
"\"\"\"\n",
"格式为第一列是需要消歧的语句序号,第二列为多个“实体起始位坐标-实体结束位坐标:实体序号”以“|”分隔的字符串。\n",
"样例如下:\n",
"[\n",
" [0, '3-6:1008|109-112:1008|187-190:1008'],\n",
" ...\n",
"]\n",
"\"\"\"\n",
"pd.DataFrame(result_data).to_csv('../submit/entity_disambiguation_submit.csv', index=False)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 实体识别(10分)\n",
"\n",
"借助开源工具,对实体进行识别。\n",
"\n",
"将每句句子中实体识别出,存入实体词典,并用特殊符号替换语句。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"# 首先尝试利用开源工具分出实体\n",
"\n",
"import fool # foolnltk是基于深度学习的开源分词工具,参考https://github.com/rockyzhengwu/FoolNLTK,也可以使用LTP等开源工具\n",
"import pandas as pd\n",
"from copy import copy\n",
"\n",
"\n",
"sample_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'utf-8', header=0)\n",
"y = sample_data.loc[:,['tag']]\n",
"train_num = len(sample_data)\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'utf-8', header=0)\n",
"sample_data = pd.concat([sample_data.loc[:, ['id', 'sentence']], test_data])\n",
"sample_data['ner'] = None\n",
"# TODO: 将提取的实体以合适的方式在‘ner’列中,便于后续使用\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 实体统一(15分)\n",
"对同一实体具有多个名称的情况进行统一,将多种称谓统一到一个实体上,并体现在实体的属性中(可以给实体建立“别称”属性)\n",
"\n",
"比如:“河北银行股份有限公司”和“河北银行”可以统一成一个实体。\n",
"\n",
"公司名称有其特点,例如后缀可以省略、上市公司的地名可以省略等等。在data/dict目录中提供了几个词典,可供实体统一使用。\n",
"- company_suffix.txt是公司的通用后缀词典\n",
"- company_business_scope.txt是公司经营范围常用词典\n",
"- co_Province_Dim.txt是省份词典\n",
"- co_City_Dim.txt是城市词典\n",
"- stopwords.txt是可供参考的停用词"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"import jieba\n",
"import jieba.posseg as pseg\n",
"import re\n",
"import datetime\n",
"\n",
"\n",
"\n",
"#提示:可以分析公司全称的组成方式,将“地名”、“公司主体部分”、“公司后缀”区分开,并制定一些启发式的规则\n",
"# TODO:建立main_extract,当输入公司名,返回会被统一的简称\n",
"def main_extract(company_name,stop_word,d_4_delete,d_city_province):\n",
" \"\"\"\n",
" company_name  输入的公司名\n",
" stop_word 停用词\n",
" d_city_province 地区\n",
" \"\"\"\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"河北银行\n"
]
}
],
"source": [
"# 简单测试实体统一代码\n",
"stop_word,d_city_province = my_initial()\n",
"company_name = \"河北银行股份有限公司\"\n",
"# 对公司名提取主体部分,将包含相同主体部分的公司统一为一个实体\n",
"company_name = main_extract(company_name,stop_word,d_city_province)\n",
"print(company_name)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# TODO:在实体识别中运用统一实体的功能\n",
"\n",
"import fool\n",
"import pandas as pd\n",
"from copy import copy\n",
"\n",
"\n",
"sample_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'utf-8', header=0)\n",
"y = sample_data.loc[:,['tag']]\n",
"train_num = len(sample_data)\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'utf-8', header=0)\n",
"sample_data = pd.concat([sample_data.loc[:, ['id', 'sentence']], test_data])\n",
"sample_data['ner'] = None\n",
"# TODO: 将提取的实体以合适的方式在‘ner’列中并统一编号,便于后续使用\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 关系抽取(37分)\n",
"目标:借助句法分析工具,和实体识别的结果,以及文本特征,基于训练数据抽取关系。\n",
"\n",
"本次要求抽取股权交易关系,关系为有向边,由投资方指向被投资方。\n",
"\n",
"模板建立可以使用“正则表达式”、“实体间距离”、“实体上下文”、“依存句法”等。\n",
"\n",
"答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"- info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(多个实体名用“|”分隔)\n",
"- info_extract_submit.csv格式为:第一列是一方实体编号,第二列为另一方实体编号。\n",
"\n",
"*成绩以抽取的关系准确率以及召回率综合的F1-score"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# 提取文本tf-idf特征\n",
"# 去除停用词,并转换成tfidf向量。\n",
"# 可以使用LTP分词工具,参考:https://ltp.readthedocs.io/zh_CN/latest/\n",
"from sklearn.feature_extraction.text import TfidfTransformer \n",
"from sklearn.feature_extraction.text import CountVectorizer \n",
"from pyltp import Segmentor\n",
"\n",
"def get_tfidf_feature():\n",
" segmentor = Segmentor() # 初始化实例\n",
" segmentor.load_with_lexicon('/ltp_data_v3.4.0/cws.model', '../data/user_dict.txt') # 加载模型\n",
"\n",
" \n",
" return tfidf_feature\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 提取句法特征\n",
"\n",
"参考特征:\n",
"\n",
"1、企业实体间距离\n",
"\n",
"2、企业实体间句法距离\n",
"\n",
"3、企业实体分别和关键触发词的距离\n",
"\n",
"4、实体的依存关系类别"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"# -*- coding: utf-8 -*-\n",
"from pyltp import Parser\n",
"from pyltp import Segmentor\n",
"from pyltp import Postagger\n",
"import networkx as nx\n",
"import pylab\n",
"import re\n",
"\n",
"# 投资关系关键词\n",
"# 提示:可以结合投资关系的触发词建立有效特征\n",
"key_words = [\"收购\",\"竞拍\",\"转让\",\"扩张\",\"并购\",\"注资\",\"整合\",\"并入\",\"竞购\",\"竞买\",\"支付\",\"收购价\",\"收购价格\",\"承购\",\"购得\",\"购进\",\n",
" \"购入\",\"买进\",\"买入\",\"赎买\",\"购销\",\"议购\",\"函购\",\"函售\",\"抛售\",\"售卖\",\"销售\",\"转售\"]\n",
"\n",
"postagger = Postagger() # 初始化实例\n",
"postagger.load_with_lexicon('/ltp_data_v3.4.0/pos.model', '../data/user_dict.txt') # 加载模型\n",
"segmentor = Segmentor() # 初始化实例\n",
"segmentor.load_with_lexicon('/ltp_data_v3.4.0/cws.model', '../data/user_dict.txt') # 加载模型\n",
"parser = Parser() # 初始化实例\n",
"parser.load('/ltp_data_v3.4.0/parser.model') # 加载模型\n",
"\n",
"\n",
"def get_parse_feature(s):\n",
" \"\"\"\n",
" 对语句进行句法分析,并返回句法结果\n",
" parse_result:依存句法解析结果\n",
" source:企业实体的词序号\n",
" target:另一个企业实体的词序号\n",
" keyword_pos:关键词词序号列表\n",
" source_dep:企业实体依存句法类型\n",
" target_dep:另一个企业实体依存句法类型\n",
" ...\n",
" (可自己建立新特征,提高分类准确率)\n",
" \"\"\"\n",
"\n",
"\n",
" return features\n",
"\n",
"\n",
"\n",
"# LTP中的依存句法类型如下:['SBV', 'VOB', 'IOB', 'FOB', 'DBL', 'ATT', 'ADV', 'CMP', 'COO', 'POB', 'LAD', 'RAD', 'IS', 'HED']"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"# 汇总词频特征和句法特征\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"\n",
"whole_feature = pd.concat([tfidf_feature, parse_feature])\n",
"# TODO: 将字符型变量转换为onehot形式\n",
"\n",
"train_x = whole_feature.iloc[:, :train_num]\n",
"test_x = whole_feature.iloc[:, train_num:]\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 建立分类器进行分类,使用sklearn中的分类器,不限于LR、SVM、决策树等\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn import preprocessing\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"\n",
"class RF:\n",
" def __init__(self):\n",
" \n",
" def train(self, train_x, train_y):\n",
" \n",
" return model\n",
" \n",
" def predict(self, model, test_x)\n",
"\n",
" return predict, predict_prob\n",
" \n",
" \n",
"rf = RF()\n",
"model = rf.train(train_x, y)\n",
"predict, predict_prob = rf.predict(model, test_x)\n",
"\n",
"\n",
"# TODO: 存储提取的投资关系实体对,本次关系抽取不要求确定投资方和被投资方,仅确定实体对具有投资关系即可\n",
"\"\"\"\n",
"以如下形式存储,转为dataframe后写入csv文件:\n",
"[\n",
" [九州通,江中药业股份有限公司],\n",
" ...\n",
"]\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.5 存储进图数据库(5分)\n",
"\n",
"本次作业我们使用neo4j作为图数据库,neo4j需要java环境,请先配置好环境。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"from py2neo import Node, Relationship, Graph\n",
"\n",
"graph = Graph(\n",
" \"http://localhost:7474\", \n",
" username=\"neo4j\", \n",
" password=\"person\"\n",
")\n",
"\n",
"for v in relation_list:\n",
" a = Node('Company', name=v[0])\n",
" b = Node('Company', name=v[1])\n",
" \n",
" # 本次不区分投资方和被投资方\n",
" r = Relationship(a, 'INVEST', b)\n",
" s = a | b | r\n",
" graph.create(s)\n",
" r = Relationship(b, 'INVEST', a)\n",
" s = a | b | r\n",
" graph.create(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# TODO:查询某节点的3层投资关系"
]
}
],
"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
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Project 1: 利用信息抽取技术搭建知识库"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"本项目的目的是结合命名实体识别、依存语法分析、实体消歧、实体统一对网站开放语料抓取的数据建立小型知识图谱。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part1:开发句法结构分析工具"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.1 开发工具\n",
"使用CYK算法,根据所提供的:非终结符集合、终结符集合、规则集,对以下句子计算句法结构。\n",
"\n",
"“the boy saw the dog with a telescope\"\n",
"\n",
"\n",
"\n",
"非终结符集合:N={S, NP, VP, PP, DT, Vi, Vt, NN, IN}\n",
"\n",
"终结符集合:{sleeps, saw, boy, girl, dog, telescope, the, with, in}\n",
"\n",
"规则集: R={\n",
"- (1) S-->NP VP 1.0\n",
"- (2) VP-->VI 0.3\n",
"- (3) VP-->Vt NP 0.4\n",
"- (4) VP-->VP PP 0.3\n",
"- (5) NP-->DT NN 0.8\n",
"- (6) NP-->NP PP 0.2\n",
"- (7) PP-->IN NP 1.0\n",
"- (8) Vi-->sleeps 1.0\n",
"- (9) Vt-->saw 1.0\n",
"- (10) NN-->boy 0.1\n",
"- (11) NN-->girl 0.1\n",
"- (12) NN-->telescope 0.3\n",
"- (13) NN-->dog 0.5\n",
"- (14) DT-->the 0.5\n",
"- (15) DT-->a 0.5\n",
"- (16) IN-->with 0.6\n",
"- (17) IN-->in 0.4\n",
"\n",
"\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# 分数(15)\n",
"class my_CYK(object):\n",
" def __init__(self, non_ternimal, terminal, rules_prob, start_prob):\n",
" self.non_terminal = non_ternimal\n",
" self.terminal = terminal\n",
" self.rules_prob = rules_prob\n",
" self.start_symbol = start_prob\n",
"\n",
"\n",
" def parse_sentence(self, sentence):\n",
" sents = sentence.split()\n",
" best_path = [[{} for _ in range(len(sents))] for _ in range(len(sents))]\n",
"\n",
" # initialization\n",
" for i in range(len(sents)):\n",
" for x in self.non_terminal:\n",
" best_path[i][i][x] = {}\n",
" if (sents[i],) in self.rules_prob[x].keys():\n",
" best_path[i][i][x]['prob'] = self.rules_prob[x][(sents[i],)]\n",
" best_path[i][i][x]['path'] = {'split':None, 'rule': sents[i]}\n",
" else:\n",
" best_path[i][i][x]['prob'] = 0\n",
" best_path[i][i][x]['path'] = {'split':None, 'rule': None}\n",
"\n",
" # CKY recursive\n",
" for l in range(1, len(sents)):\n",
" for i in range(len(sents)-l):\n",
" j = i + l\n",
" for x in self.non_terminal:\n",
" tmp_best_x = {'prob':0, 'path':None}\n",
" for key, value in self.rules_prob[x].items():\n",
" if key[0] not in self.non_terminal: \n",
" break\n",
" for s in range(i, j):\n",
" tmp_prob = value * best_path[i][s][key[0]]['prob'] * best_path[s+1][j][key[1]]['prob']\n",
" if tmp_prob > tmp_best_x['prob']:\n",
" tmp_best_x['prob'] = tmp_prob\n",
" tmp_best_x['path'] = {'split': s, 'rule': key}\n",
" best_path[i][j][x] = tmp_best_x\n",
" self.best_path = best_path\n",
"\n",
" # parse result\n",
" self._parse_result(0, len(sents)-1, self.start_symbol)\n",
" print(\"prob = \", self.best_path[0][len(sents)-1][self.start_symbol]['prob'])\n",
"\n",
"\n",
" def _parse_result(self, left_idx, right_idx, root, ind=0):\n",
" node = self.best_path[left_idx][right_idx][root]\n",
" if node['path']['split'] is not None:\n",
" print('\\t'*ind, (root, self.rules_prob[root].get(node['path']['rule'])))\n",
" self._parse_result(left_idx, node['path']['split'], node['path']['rule'][0], ind+1)\n",
" self._parse_result(node['path']['split']+1, right_idx, node['path']['rule'][1], ind+1)\n",
" else:\n",
" print('\\t'*ind, (root, self.rules_prob[root].get((node['path']['rule'],))) )\n",
" print('--->', node['path']['rule'])\n",
"\n",
"\n",
"\n",
"def main(sentence):\n",
" non_terminal = {'S', 'NP', 'VP', 'PP', 'DT', 'Vi', 'Vt', 'NN', 'IN'}\n",
" start_symbol = 'S'\n",
" terminal = {'sleeps', 'saw', 'boy', 'girl', 'dog', 'telescope', 'the', 'with', 'in'}\n",
" rules_prob = {'S': {('NP', 'VP'): 1.0},\n",
" 'VP': {('Vt', 'NP'): 0.8, ('VP', 'PP'): 0.2},\n",
" 'NP': {('DT', 'NN'): 0.8, ('NP', 'PP'): 0.2},\n",
" 'PP': {('IN', 'NP'): 1.0},\n",
" 'Vi': {('sleeps',): 1.0},\n",
" 'Vt': {('saw',): 1.0},\n",
" 'NN': {('boy',): 0.1, ('girl',): 0.1,('telescope',): 0.3,('dog',): 0.5},\n",
" 'DT': {('the',): 1.0},\n",
" 'IN': {('with',): 0.6, ('in',): 0.4},\n",
" }\n",
" cyk = my_CYK(non_terminal, terminal, rules_prob, start_symbol)\n",
" cyk.parse_sentence(sentence)\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ('S', 1.0)\n",
"\t ('NP', 0.8)\n",
"\t\t ('DT', 1.0)\n",
"---> the\n",
"\t\t ('NN', 0.1)\n",
"---> boy\n",
"\t ('VP', 0.2)\n",
"\t\t ('VP', 0.8)\n",
"\t\t\t ('Vt', 1.0)\n",
"---> saw\n",
"\t\t\t ('NP', 0.8)\n",
"\t\t\t\t ('DT', 1.0)\n",
"---> the\n",
"\t\t\t\t ('NN', 0.5)\n",
"---> dog\n",
"\t\t ('PP', 1.0)\n",
"\t\t\t ('IN', 0.6)\n",
"---> with\n",
"\t\t\t ('NP', 0.8)\n",
"\t\t\t\t ('DT', 1.0)\n",
"---> the\n",
"\t\t\t\t ('NN', 0.3)\n",
"---> telescope\n",
"prob = 0.0007372800000000003\n"
]
}
],
"source": [
"# TODO: 对该测试用例进行测试\n",
"# \"the boy saw the dog with the telescope\"\n",
"\n",
"if __name__ == \"__main__\":\n",
" sentence = \"the boy saw the dog with the telescope\"\n",
" main(sentence)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2 计算算法复杂度\n",
"计算上一节开发的算法所对应的时间复杂度和空间复杂度。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 分数(3)\n",
"# 上面所写的算法的时间复杂度和空间复杂度分别是多少?\n",
"# TODO\n",
"时间复杂度=O(), 空间复杂度=O()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part2 基于Bootstrapping,抽取企业股权交易关系,并建立知识库"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 练习实体消歧\n",
"将句中识别的实体与知识库中实体进行匹配,解决实体歧义问题。\n",
"可利用上下文本相似度进行识别。\n",
"\n",
"在data/entity_disambiguation目录中,entity_list.csv是50个实体,valid_data.csv是需要消歧的语句(待添加)。\n",
"\n",
"答案提交在submit目录中,命名为entity_disambiguation_submit.csv。格式为:第一列是需要消歧的语句序号,第二列为多个“实体起始位坐标-实体结束位坐标:实体序号”以“|”分隔的字符串。\n",
"\n",
"*成绩以实体识别准确率以及召回率综合的F值评分\n"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"# 将识别出的实体与知识库中实体进行匹配,解决识别出一个实体对应知识库中多个实体的问题。\n",
"\n",
"# 将entity_list.csv中已知实体的名称导入分词词典\n",
"\n",
"import jieba\n",
"import pandas as pd\n",
"\n",
"entity_data = pd.read_csv('../data/entity_disambiguation/entity_list.csv', encoding = 'gb18030')\n",
"entity_dict = {}\n",
"\n",
"for i in range(len(entity_data)):\n",
" line = entity_data.iloc[i, :]\n",
" for word in line.entity_name.split('|'):\n",
" jieba.add_word(word)\n",
" if word in entity_dict:\n",
" entity_dict[word].append(line.entity_id)\n",
" else:\n",
" entity_dict[word] = [line.entity_id]\n",
"\n",
"# 对每句句子识别并匹配实体 \n",
"\n",
"valid_data = pd.read_csv('../data/entity_disambiguation/valid_data.csv', encoding = 'gb18030')\n",
"\n",
"result_data = []\n",
"for i in range(len(valid_data)):\n",
" line = valid_data.iloc[i, :]\n",
" ret =[] # 存储实体的坐标和序号\n",
" loc = 0\n",
" window = 10 # 观察上下文的窗口大小\n",
" sentence = jieba.lcut(line.sentence)\n",
" ret = []\n",
" for idx, word in enumerate(sentence):\n",
" if word in entity_dict:\n",
" max_similar = 0\n",
" max_entity_id = 0\n",
" context = sentence[max(0, idx-window):min(len(sentence)-1, idx+window)]\n",
" for ids in entity_dict[word]:\n",
" similar = len(set(context)&set(jieba.lcut(entity_data[entity_data.entity_id.isin([ids])].reset_index().desc[0])))\n",
" if max_similar>similar:\n",
" max_similar = similar\n",
" max_entity_id = ids\n",
" ret.append(str(loc)+'-'+str(loc+len(word))+':'+str(ids))\n",
" loc+=len(word)\n",
" result_data.append([i, '|'.join(ret)])\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[[0, '3-6:1008|109-112:1008|187-190:1008'],\n",
" [1, '18-21:1008'],\n",
" [2, '23-26:1008|40-43:1008'],\n",
" [3, '7-10:1008'],\n",
" [4, '2-5:1008|14-17:1008'],\n",
" [5, '28-30:1003|34-36:1003|41-43:1003'],\n",
" [6, '4-8:1001|25-27:1003|34-36:1003|100-102:1003'],\n",
" [7, '0-2:1003|6-10:1001|19-21:1003|34-36:1003|45-47:1003'],\n",
" [8, '8-10:1003|22-24:1003|34-36:1003|37-39:1003|46-48:1003'],\n",
" [9, '14-16:1003'],\n",
" [10, '0-2:1005|39-44:1005'],\n",
" [11, '7-11:1005|20-22:1005'],\n",
" [12, '4-6:1005|29-31:1005|62-64:1005'],\n",
" [13, '26-28:1005'],\n",
" [14, '0-2:1005|24-26:1005'],\n",
" [15, '10-12:1005|28-30:1005'],\n",
" [16, '6-8:1005|20-22:1005'],\n",
" [17, '8-12:1011|26-30:1011'],\n",
" [18, '9-13:1011|28-30:1013'],\n",
" [19, '0-2:1013|18-20:1013'],\n",
" [20, '6-8:1013'],\n",
" [21, '0-2:1013|26-28:1013|41-43:1013'],\n",
" [22, '0-2:1013|20-22:1013'],\n",
" [23, '0-2:1013'],\n",
" [24, '0-2:1013|32-34:1013'],\n",
" [25, '0-3:1016'],\n",
" [26, '2-5:1016|11-14:1016|18-21:1016'],\n",
" [27, '20-23:1016'],\n",
" [28, '11-14:1016']]"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame(result_data).to_csv('../submit/entity_disambiguation_submit.csv', index=False)\n",
"result_data\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 实体识别\n",
"\n",
"借助开源工具,对实体进行识别。\n",
"\n",
"将每句句子中实体识别出,存入实体词典,并用特殊符号替换语句。"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[(28, 33, 'company', '国泰君安'), (0, 13, 'company', '深圳能源集团股份有限公司')]]\n",
"[[(36, 49, 'company', '远大产业控股股份有限公司'), (0, 13, 'company', '远大产业控股股份有限公司')]]\n",
"[[(104, 109, 'company', '河北银行'), (88, 99, 'company', '河北银行股份有限公司'), (61, 74, 'company', '南京栖霞建设集团有限公司'), (34, 47, 'company', '南京栖霞建设股份有限公司')]]\n",
"[[(189, 196, 'time', '2015年度'), (185, 190, 'company', '歌礼制药'), (160, 165, 'company', '康桥资本'), (136, 150, 'company', '天士力(香港)药业有限公司'), (88, 114, 'company', 'CBCInvestmentSevenLimited'), (81, 86, 'company', '康桥资本'), (44, 58, 'company', '天士力(香港)药业有限公司'), (19, 33, 'company', '天士力医药集团股份有限公司'), (2, 16, 'company', '天士力制药集团股份有限公司')]]\n",
"[[(44, 59, 'company', '江苏康缘美域生物医药有限公司'), (21, 37, 'company', '连云港康缘美域保健食品有限公司'), (6, 19, 'company', '江苏康缘药业股份有限公司'), (0, 6, 'time', '2016年')]]\n",
"[[(74, 85, 'company', '康缘国际实业有限公司'), (60, 73, 'company', '江苏康缘药业股份有限公司'), (39, 52, 'company', '江苏康缘集团有限责任公司'), (21, 32, 'company', '康缘国际实业有限公司'), (6, 19, 'company', '江苏康缘药业股份有限公司'), (0, 6, 'time', '2015年')]]\n",
"[[(27, 33, 'company', '天津大西洋'), (10, 24, 'company', '天津大西洋焊接材料有限公司'), (3, 9, 'location', '上海大西洋'), (0, 4, 'time', '本年度')]]\n"
]
}
],
"source": [
"# code\n",
"# 首先尝试利用开源工具分出实体\n",
"\n",
"import fool\n",
"import pandas as pd\n",
"from copy import copy\n",
"\n",
"\n",
"sample_data = pd.read_csv('../data/info_extract/samples_test.csv', encoding = 'utf-8', header=0)\n",
"sample_data['ner'] = None\n",
"ner_id = 1001\n",
"ner_dict = {} # 存储所有实体\n",
"ner_dict_reverse = {} # 存储所有实体\n",
"for i in range(len(sample_data)):\n",
" sentence = copy(sample_data.iloc[i, 1])\n",
" words, ners = fool.analysis(sentence)\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" print(ners)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_name not in ner_dict:\n",
" ner_dict[ner_name] = ner_id\n",
" ner_dict_reverse[ner_id] = ner_name\n",
" ner_id+=1\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict[ner_name]) + '_ ' + sentence[end-1:]\n",
" sample_data.iloc[i, 2] = sentence\n"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" <th>ner</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>深圳能源集团股份有限公司拟按现有2.03%的持股比例参与国泰君安本次可转换公司债的配售,参与...</td>\n",
" <td>ner_1002_ 拟按现有2.03%的持股比例参与 ner_1001_ 本次可转换公司债...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>远大产业控股股份有限公司于报告期实施的发行股份购买资产的交易对方中金波为远大产业控股股份有限...</td>\n",
" <td>ner_1003_ 于报告期实施的发行股份购买资产的交易对方中金波为 ner_1003_ ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>一、根据公司第六届董事会第七次会议审议并通过的公司重大资产重组方案,南京栖霞建设股份有限公司...</td>\n",
" <td>一、根据公司第六届董事会第七次会议审议并通过的公司重大资产重组方案, ner_1007_ 拟...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>一、天士力制药集团股份有限公司(简称“天士力医药集团股份有限公司”、“公司”)拟向子公司天士...</td>\n",
" <td>一、 ner_1014_ (简称“ ner_1013_ ”、“公司”)拟向子公司 ner_1...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>2016年,江苏康缘药业股份有限公司将持有连云港康缘美域保健食品有限公司的股权全部转让给江苏...</td>\n",
" <td>ner_1018_ , ner_1017_ 将持有 ner_1016_ 的股权全部转让给 ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>6</td>\n",
" <td>2015年,江苏康缘药业股份有限公司将持有康缘国际实业有限公司的股权全部转让给江苏康缘集团有...</td>\n",
" <td>ner_1021_ , ner_1017_ 将持有 ner_1019_ 的股权全部转让给 ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>7</td>\n",
" <td>本年度上海大西洋收购天津大西洋焊接材料有限公司将其所持天津大西洋销售44%股权,支付对价8,...</td>\n",
" <td>ner_1025_ ner_1024_ 收购 ner_1023_ 将其所持 ner_10...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence \\\n",
"0 1 深圳能源集团股份有限公司拟按现有2.03%的持股比例参与国泰君安本次可转换公司债的配售,参与... \n",
"1 2 远大产业控股股份有限公司于报告期实施的发行股份购买资产的交易对方中金波为远大产业控股股份有限... \n",
"2 3 一、根据公司第六届董事会第七次会议审议并通过的公司重大资产重组方案,南京栖霞建设股份有限公司... \n",
"3 4 一、天士力制药集团股份有限公司(简称“天士力医药集团股份有限公司”、“公司”)拟向子公司天士... \n",
"4 5 2016年,江苏康缘药业股份有限公司将持有连云港康缘美域保健食品有限公司的股权全部转让给江苏... \n",
"5 6 2015年,江苏康缘药业股份有限公司将持有康缘国际实业有限公司的股权全部转让给江苏康缘集团有... \n",
"6 7 本年度上海大西洋收购天津大西洋焊接材料有限公司将其所持天津大西洋销售44%股权,支付对价8,... \n",
"\n",
" ner \n",
"0 ner_1002_ 拟按现有2.03%的持股比例参与 ner_1001_ 本次可转换公司债... \n",
"1 ner_1003_ 于报告期实施的发行股份购买资产的交易对方中金波为 ner_1003_ ... \n",
"2 一、根据公司第六届董事会第七次会议审议并通过的公司重大资产重组方案, ner_1007_ 拟... \n",
"3 一、 ner_1014_ (简称“ ner_1013_ ”、“公司”)拟向子公司 ner_1... \n",
"4 ner_1018_ , ner_1017_ 将持有 ner_1016_ 的股权全部转让给 ... \n",
"5 ner_1021_ , ner_1017_ 将持有 ner_1019_ 的股权全部转让给 ... \n",
"6 ner_1025_ ner_1024_ 收购 ner_1023_ 将其所持 ner_10... "
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sample_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 实体统一\n",
"对同一实体具有多个名称的情况进行统一,将多种称谓统一到一个实体上,并体现在实体的属性中(可以给实体建立“别称”属性)\n",
"\n",
"公司名称有其特点,例如后缀可以省略、上市公司的地名可以省略等等。在data/dict目录中提供了几个词典,可供实体统一使用。\n",
"- company_suffix.txt是公司的通用后缀词典\n",
"- company_business_scope.txt是公司经营范围常用词典\n",
"- co_Province_Dim.txt是省份词典\n",
"- co_City_Dim.txt是城市词典\n",
"- stopwords.txt是可供参考的停用词"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"\n",
"import jieba\n",
"import jieba.posseg as pseg\n",
"import re\n",
"import datetime\n",
"\n",
"\n",
"\n",
"#功能:从输入的“公司名”中提取主体(列表形式)\n",
"def main_extract(input_str,stop_word,d_4_delete,d_city_province):\n",
" input_str = replace(input_str,d_city_province)\n",
" #开始分词\n",
" seg = pseg.cut(input_str)\n",
" seg_lst = []\n",
" for w in seg:\n",
" elmt = w.word\n",
" if elmt not in d_4_delete:\n",
" seg_lst.append(elmt)\n",
" seg_lst = remove_word(seg_lst,stop_word)\n",
" seg_lst = city_prov_ahead(seg_lst,d_city_province)\n",
" return seg_lst\n",
"\n",
" \n",
"\n",
"#功能:将list中地名提前\n",
"def city_prov_ahead(seg_lst,d_city_province):\n",
" city_prov_lst = []\n",
" for seg in seg_lst:\n",
" if seg in d_city_province:\n",
" city_prov_lst.append(seg)\n",
" seg_lst.remove(seg)\n",
" city_prov_lst.sort()\n",
" return city_prov_lst+seg_lst\n",
" \n",
" \n",
"\n",
" \n",
"#功能:去除停用词\n",
"def remove_word(seg,sw):\n",
" ret = []\n",
" for i in range(len(seg)):\n",
" if seg[i] not in sw:\n",
" ret.append(seg[i])\n",
" return ret\n",
"\n",
"\n",
"#功能:替换com,dep的内容\n",
"def replace(com,d_city_province):\n",
" #————————公司、部门\n",
" #替换\n",
" #'*'\n",
" com = re.sub(r'(\\*)*(\\#)*(\\-)*(\\—)*(\\~)*(\\.)*(\\/)*(\\?)*(\\!)*(\\?)*(\\\")*','',com)\n",
" #'、'\n",
" com = re.sub(r'(\\、)*','',com)\n",
" #'+'\n",
" com = re.sub(r'(\\+)*','',com)\n",
" #','\n",
" com = re.sub(r'(\\,)+',' ',com)\n",
" #','\n",
" com = re.sub(r'(\\,)+',' ',com)\n",
" #':'\n",
" com = re.sub(r'(\\:)*','',com)\n",
" #[]【】都删除\n",
" com = re.sub(r'\\【.*?\\】','',com)\n",
" com = re.sub(r'\\[.*?\\]','',com)\n",
" #数字在结尾替换为‘’\n",
" com = re.sub(r'\\d*$',\"\",com)\n",
" #'&nbsp;'或‘&lt;’替换为‘’\n",
" com = re.sub(r'(&gt;)*(&nbsp;)*(&lt;)*',\"\",com)\n",
" #地名\n",
" com = re.sub(r'\\(',\"(\",com)\n",
" com = re.sub(r'\\)',\")\",com)\n",
" pat = re.search(r'\\(.+?\\)',com)\n",
" while pat:\n",
" v = pat.group()[3:-3]\n",
" start = pat.span()[0]\n",
" end = pat.span()[1]\n",
" if v not in d_city_province:\n",
" com = com[:start]+com[end:]\n",
" else:\n",
" com = com[:start]+com[start+3:end-3]+com[end:]\n",
" pat = re.search(r'\\(.+?\\)',com)\n",
" #()()\n",
" com = re.sub(r'(\\()*(\\))*(\\()*(\\))*','',com)\n",
" #全数字\n",
" com = re.sub(r'^(\\d)+$',\"\",com)\n",
" return com\n",
"\n",
"\n",
"\n",
"#初始加载步骤\n",
"#输出“用来删除的字典”和“stop word”\n",
"def my_initial():\n",
" fr1 = open(r\"../data/dict/co_City_Dim.txt\", encoding='utf-8')\n",
" fr2 = open(r\"../data/dict/co_Province_Dim.txt\", encoding='utf-8')\n",
" fr3 = open(r\"../data/dict/company_business_scope.txt\", encoding='utf-8')\n",
" fr4 = open(r\"../data/dict/company_suffix.txt\", encoding='utf-8')\n",
" #城市名\n",
" lines1 = fr1.readlines()\n",
" d_4_delete = []\n",
" d_city_province = [re.sub(r'(\\r|\\n)*','',line) for line in lines1]\n",
" #省份名\n",
" lines2 = fr2.readlines()\n",
" l2_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines2]\n",
" d_city_province.extend(l2_tmp)\n",
" #公司后缀\n",
" lines3 = fr3.readlines()\n",
" l3_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines3]\n",
" lines4 = fr4.readlines()\n",
" l4_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines4]\n",
" d_4_delete.extend(l4_tmp)\n",
" #get stop_word\n",
" fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
" stop_word = fr.readlines()\n",
" stop_word_after = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
" stop_word_after[-1] = stop_word[-1]\n",
" stop_word = stop_word_after\n",
" return d_4_delete,stop_word,d_city_province\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"河北银行\n"
]
}
],
"source": [
"d_4_delete,stop_word,d_city_province = my_initial()\n",
"company_name = \"河北银行股份有限公司\"\n",
"lst = main_extract(company_name,stop_word,d_4_delete,d_city_province)\n",
"company_name = ''.join(lst) # 对公司名提取主体部分,将包含相同主体部分的公司统一为一个实体\n",
"print(company_name)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 在语句中统一实体\n",
"\n",
"import fool\n",
"import pandas as pd\n",
"from copy import copy\n",
"\n",
"\n",
"sample_data = pd.read_csv('../data/info_extract/samples_test.csv', encoding = 'utf-8', header=0)\n",
"sample_data['ner'] = None\n",
"ner_id = 1001\n",
"ner_dict_new = {} # 存储所有实体\n",
"ner_dict_reverse_new = {} # 存储所有实体\n",
"for i in range(len(sample_data)):\n",
" sentence = copy(sample_data.iloc[i, 1])\n",
" words, ners = fool.analysis(sentence)\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" print(ners)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" company_main_name = ''.join(main_extract(ner_name,stop_word,d_4_delete,d_city_province)) # 提取公司主体名称\n",
" if company_main_name not in ner_dict:\n",
" ner_dict[company_main_name] = ner_id\n",
" ner_id+=1\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict[company_main_name]) + '_ ' + sentence[end-1:]\n",
" sample_data.iloc[i, 2] = sentence\n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 关系抽取\n",
"借助句法分析工具,和实体识别的结果,以及正则表达式,设定模版抽取关系,并存储进图数据库。\n",
"\n",
"本次要求抽取股权交易关系,关系为有向边,由投资方指向被投资方。\n",
"\n",
"模板建立可以使用“正则表达式”、“实体间距离”、“实体上下文”、“依存句法”等。\n",
"\n",
"答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"- info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(多个实体名用“|”分隔)\n",
"- info_extract_submit.csv格式为:第一列是关系发起方实体编号,第二列为关系接收方实体编号。\n",
"\n",
"*成绩以抽取的关系准确率以及召回率综合的F值评分"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 建立种子模板"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"\n",
"# 最后提交文件为识别出的整个投资图谱,以及图谱中结点列表与属性。\n",
"\n",
"# 建立模板\n",
"import re\n",
"\n",
"rep1 = re.compile(r'(ner_\\d\\d\\d\\d)_\\s+收购\\s+(ner_\\d\\d\\d\\d)_') # 例子模板\n",
"\n",
"relation_list = [] # 存储已经提取的关系\n",
"for i in range(len(sample_data)):\n",
" sentence = copy(sample_data.iloc[i, 2])\n",
" for v in rep1.findall(sentence+sentence):\n",
" relation_list.append(v)"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('ner_1024', 'ner_1023'), ('ner_1024', 'ner_1023')]"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"relation_list"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 利用bootstrapping搜索"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# code\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.5 存储进图数据库\n",
"\n",
"本次作业我们使用neo4j作为图数据库,neo4j需要java环境,请先配置好环境。"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [],
"source": [
"\n",
"from py2neo import Node, Relationship, Graph\n",
"\n",
"graph = Graph(\n",
" \"http://localhost:7474\", \n",
" username=\"neo4j\", \n",
" password=\"person\"\n",
")\n",
"\n",
"for v in relation_list:\n",
" a = Node('Company', name=v[0])\n",
" b = Node('Company', name=v[1])\n",
" r = Relationship(a, 'INVEST', b)\n",
" s = a | b | r\n",
" graph.create(s)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(ner_1024)-[:INVEST {}]->(ner_1023)"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r"
]
}
],
"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
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 利用信息抽取技术搭建知识库\n",
"\n",
"在这个notebook文件中,有些模板代码已经提供给你,但你还需要实现更多的功能来完成这个项目。除非有明确要求,你无须修改任何已给出的代码。以**'【练习】'**开始的标题表示接下来的代码部分中有你需要实现的功能。这些部分都配有详细的指导,需要实现的部分也会在注释中以'TODO'标出。请仔细阅读所有的提示。\n",
"\n",
">**提示:**Code 和 Markdown 区域可通过 **Shift + Enter** 快捷键运行。此外,Markdown可以通过双击进入编辑模式。\n",
"\n",
"---\n",
"\n",
"### 让我们开始吧\n",
"\n",
"本项目的目的是结合命名实体识别、依存语法分析、实体消歧、实体统一对网站开放语料抓取的数据建立小型知识图谱。\n",
"\n",
"在现实世界中,你需要拼凑一系列的模型来完成不同的任务;举个例子,用来预测狗种类的算法会与预测人类的算法不同。在做项目的过程中,你可能会遇到不少失败的预测,因为并不存在完美的算法和模型。你最终提交的不完美的解决方案也一定会给你带来一个有趣的学习经验!\n",
"\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='step0'></a>\n",
"## 步骤 0:开发句法结构分析工具\n",
"\n",
"### 1.1 开发句法分析工具\n",
"\n",
"在课堂中,我们提到了在计算机科学领域,CYK算法(也称为Cocke–Younger–Kasami算法)是一种用来对上下文无关文法(CFG,Context Free Grammar)进行语法分析(parsing)的算法。\n",
"\n",
"### 【练习1】\n",
"使用CYK算法,根据所提供的:非终结符集合、终结符集合、规则集,对以下句子计算句法结构。并输出最优句法结构的概率。\n",
"\n",
"“the boy saw the dog with the telescope\"\n",
"\n",
"\n",
"\n",
"非终结符集合:N={S, NP, VP, PP, DT, Vi, Vt, NN, IN}\n",
"\n",
"终结符集合:{sleeps, saw, boy, girl, dog, telescope, the, with, in}\n",
"\n",
"规则集: R={\n",
"- (1) S-->NP VP 1.0\n",
"- (2) VP-->Vt NP 0.8\n",
"- (3) VP-->VP PP 0.2\n",
"- (4) NP-->DT NN 0.8\n",
"- (5) NP-->NP PP 0.2\n",
"- (6) PP-->IN NP 1.0\n",
"- (7) Vi-->sleeps 1.0\n",
"- (8) Vt-->saw 1.0\n",
"- (9) NN-->boy 0.1\n",
"- (10) NN-->girl 0.1\n",
"- (11) NN-->telescope 0.3\n",
"- (12) NN-->dog 0.5\n",
"- (13) DT-->the 1.0\n",
"- (14) IN-->with 0.6\n",
"- (15) IN-->in 0.4\n",
"\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# 分数(15)\n",
"class my_CYK(object):\n",
" def __init__(self, non_ternimal, terminal, rules_prob, start_prob):\n",
" self.non_terminal = non_ternimal\n",
" self.terminal = terminal\n",
" self.rules_prob = rules_prob\n",
" self.start_symbol = start_prob\n",
"\n",
"\n",
" def parse_sentence(self, sentence):\n",
" # TODO:parse the sentence with CYK algoritm\n",
" \n",
" sents = sentence.split()\n",
" best_path = [[{} for _ in range(len(sents))] for _ in range(len(sents))]\n",
"\n",
" # initialization\n",
" for i in range(len(sents)):\n",
" for x in self.non_terminal:\n",
" best_path[i][i][x] = {}\n",
" if (sents[i],) in self.rules_prob[x].keys():\n",
" best_path[i][i][x]['prob'] = self.rules_prob[x][(sents[i],)]\n",
" best_path[i][i][x]['path'] = {'split':None, 'rule': sents[i]}\n",
" else:\n",
" best_path[i][i][x]['prob'] = 0\n",
" best_path[i][i][x]['path'] = {'split':None, 'rule': None}\n",
"\n",
" # CKY recursive\n",
" for l in range(1, len(sents)):\n",
" for i in range(len(sents)-l):\n",
" j = i + l\n",
" for x in self.non_terminal:\n",
" tmp_best_x = {'prob':0, 'path':None}\n",
" for key, value in self.rules_prob[x].items():\n",
" if key[0] not in self.non_terminal: \n",
" break\n",
" for s in range(i, j):\n",
" tmp_prob = value * best_path[i][s][key[0]]['prob'] * best_path[s+1][j][key[1]]['prob']\n",
" if tmp_prob > tmp_best_x['prob']:\n",
" tmp_best_x['prob'] = tmp_prob\n",
" tmp_best_x['path'] = {'split': s, 'rule': key}\n",
" best_path[i][j][x] = tmp_best_x\n",
" self.best_path = best_path\n",
"\n",
" # TODO:print the result with tree structure\n",
" self._parse_result(0, len(sents)-1, self.start_symbol)\n",
" \n",
" # TODO:print the probability for most probable parsing\n",
" print(\"prob = \", self.best_path[0][len(sents)-1][self.start_symbol]['prob'])\n",
"\n",
"\n",
" def _parse_result(self, left_idx, right_idx, root, ind=0):\n",
" \"\"\"\n",
" print the result with tree- structure\n",
" \"\"\"\n",
" node = self.best_path[left_idx][right_idx][root]\n",
" if node['path']['split'] is not None:\n",
" print('\\t'*ind, (root, self.rules_prob[root].get(node['path']['rule'])))\n",
" self._parse_result(left_idx, node['path']['split'], node['path']['rule'][0], ind+1)\n",
" self._parse_result(node['path']['split']+1, right_idx, node['path']['rule'][1], ind+1)\n",
" else:\n",
" print('\\t'*ind, (root, self.rules_prob[root].get((node['path']['rule'],))) )\n",
" print('--->', node['path']['rule'])\n",
"\n",
"\n",
"\n",
"def main(sentence):\n",
" non_terminal = {'S', 'NP', 'VP', 'PP', 'DT', 'Vi', 'Vt', 'NN', 'IN'}\n",
" start_symbol = 'S'\n",
" terminal = {'sleeps', 'saw', 'boy', 'girl', 'dog', 'telescope', 'the', 'with', 'in'}\n",
" rules_prob = {'S': {('NP', 'VP'): 1.0},\n",
" 'VP': {('Vt', 'NP'): 0.8, ('VP', 'PP'): 0.2},\n",
" 'NP': {('DT', 'NN'): 0.8, ('NP', 'PP'): 0.2},\n",
" 'PP': {('IN', 'NP'): 1.0},\n",
" 'Vi': {('sleeps',): 1.0},\n",
" 'Vt': {('saw',): 1.0},\n",
" 'NN': {('boy',): 0.1, ('girl',): 0.1,('telescope',): 0.3,('dog',): 0.5},\n",
" 'DT': {('the',): 1.0},\n",
" 'IN': {('with',): 0.6, ('in',): 0.4},\n",
" }\n",
" cyk = my_CYK(non_terminal, terminal, rules_prob, start_symbol)\n",
" cyk.parse_sentence(sentence)\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ('S', 1.0)\n",
"\t ('NP', 0.8)\n",
"\t\t ('DT', 1.0)\n",
"---> the\n",
"\t\t ('NN', 0.1)\n",
"---> boy\n",
"\t ('VP', 0.2)\n",
"\t\t ('VP', 0.8)\n",
"\t\t\t ('Vt', 1.0)\n",
"---> saw\n",
"\t\t\t ('NP', 0.8)\n",
"\t\t\t\t ('DT', 1.0)\n",
"---> the\n",
"\t\t\t\t ('NN', 0.5)\n",
"---> dog\n",
"\t\t ('PP', 1.0)\n",
"\t\t\t ('IN', 0.6)\n",
"---> with\n",
"\t\t\t ('NP', 0.8)\n",
"\t\t\t\t ('DT', 1.0)\n",
"---> the\n",
"\t\t\t\t ('NN', 0.3)\n",
"---> telescope\n",
"prob = 0.0007372800000000003\n"
]
}
],
"source": [
"# TODO: 对该测试用例进行测试\n",
"if __name__ == \"__main__\":\n",
" sentence = \"the boy saw the dog with the telescope\"\n",
" main(sentence)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 问题1:计算算法复杂度\n",
"计算上一节开发的算法所对应的时间复杂度和空间复杂度。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# TODO: 上面所写的算法的时间复杂度和空间复杂度分别是多少?\n",
"时间复杂度=O(), 空间复杂度=O()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 2:实体统一"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"实体统一做的是对同一实体具有多个名称的情况进行统一,将多种称谓统一到一个实体上,并体现在实体的属性中(可以给实体建立“别称”属性)\n",
"\n",
"例如:对“河北银行股份有限公司”、“河北银行公司”和“河北银行”我们都可以认为是一个实体,我们就可以将通过提取前两个称谓的主要内容,得到“河北银行”这个实体关键信息。\n",
"\n",
"公司名称有其特点,例如后缀可以省略、上市公司的地名可以省略等等。在data/dict目录中提供了几个词典,可供实体统一使用。\n",
"- company_suffix.txt是公司的通用后缀词典\n",
"- company_business_scope.txt是公司经营范围常用词典\n",
"- co_Province_Dim.txt是省份词典\n",
"- co_City_Dim.txt是城市词典\n",
"- stopwords.txt是可供参考的停用词\n",
"\n",
"### 练习2:\n",
"编写main_extract函数,实现对实体的名称提取“主体名称”的功能。"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"import jieba\n",
"import jieba.posseg as pseg\n",
"import re\n",
"import datetime\n",
"\n",
"\n",
"# TODO: 从输入的“公司名”中提取主体\n",
"def main_extract(input_str,stop_word,d_4_delete,d_city_province):\n",
" input_str = replace(input_str,d_city_province)\n",
" #开始分词\n",
" seg = pseg.cut(input_str)\n",
" seg_lst = []\n",
" for w in seg:\n",
" elmt = w.word\n",
" if elmt not in d_4_delete:\n",
" seg_lst.append(elmt)\n",
" seg_lst = remove_word(seg_lst,stop_word)\n",
" seg_lst = city_prov_ahead(seg_lst,d_city_province)\n",
" return seg_lst\n",
"\n",
" \n",
"#TODO:实现公司名称中地名提前\n",
"def city_prov_ahead(seg_lst,d_city_province):\n",
" city_prov_lst = []\n",
" for seg in seg_lst:\n",
" if seg in d_city_province:\n",
" city_prov_lst.append(seg)\n",
" seg_lst.remove(seg)\n",
" city_prov_lst.sort()\n",
" return city_prov_lst+seg_lst\n",
"\n",
"\n",
"#TODO:替换特殊符号\n",
"def replace(com,d_city_province):\n",
" #————————公司\n",
" #地名\n",
" com = re.sub(r'\\(',\"(\",com)\n",
" com = re.sub(r'\\)',\")\",com)\n",
" pat = re.search(r'\\(.+?\\)',com)\n",
" while pat:\n",
" v = pat.group()[3:-3]\n",
" start = pat.span()[0]\n",
" end = pat.span()[1]\n",
" if v not in d_city_province:\n",
" com = com[:start]+com[end:]\n",
" else:\n",
" com = com[:start]+com[start+3:end-3]+com[end:]\n",
" pat = re.search(r'\\(.+?\\)',com)\n",
" #()()\n",
" com = re.sub(r'(\\()*(\\))*(\\()*(\\))*','',com)\n",
" #全数字\n",
" com = re.sub(r'^(\\d)+$',\"\",com)\n",
" return com\n",
"\n",
"\n",
"#TODO:初始化,加载词典\n",
"#输出“用来删除的字典”和“stop word”\n",
"def my_initial():\n",
" fr1 = open(r\"../data/dict/co_City_Dim.txt\", encoding='utf-8')\n",
" fr2 = open(r\"../data/dict/co_Province_Dim.txt\", encoding='utf-8')\n",
" fr3 = open(r\"../data/dict/company_business_scope.txt\", encoding='utf-8')\n",
" fr4 = open(r\"../data/dict/company_suffix.txt\", encoding='utf-8')\n",
" #城市名\n",
" lines1 = fr1.readlines()\n",
" d_4_delete = []\n",
" d_city_province = [re.sub(r'(\\r|\\n)*','',line) for line in lines1]\n",
" #省份名\n",
" lines2 = fr2.readlines()\n",
" l2_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines2]\n",
" d_city_province.extend(l2_tmp)\n",
" #公司后缀\n",
" lines3 = fr3.readlines()\n",
" l3_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines3]\n",
" lines4 = fr4.readlines()\n",
" l4_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines4]\n",
" d_4_delete.extend(l4_tmp)\n",
" #get stop_word\n",
" fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
" stop_word = fr.readlines()\n",
" stop_word_after = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
" stop_word_after[-1] = stop_word[-1]\n",
" stop_word = stop_word_after\n",
" return d_4_delete,stop_word,d_city_province\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Building prefix dict from the default dictionary ...\n",
"Loading model from cache C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\jieba.cache\n",
"Loading model cost 0.732 seconds.\n",
"Prefix dict has been built succesfully.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"河北银行\n"
]
}
],
"source": [
"# TODO:测试实体统一用例\n",
"d_4_delete,stop_word,d_city_province = my_initial()\n",
"company_name = \"河北银行股份有限公司\"\n",
"lst = main_extract(company_name,stop_word,d_4_delete,d_city_province)\n",
"company_name = ''.join(lst) # 对公司名提取主体部分,将包含相同主体部分的公司统一为一个实体\n",
"print(company_name)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 3:实体识别\n",
"有很多开源工具可以帮助我们对实体进行识别。常见的有LTP、StanfordNLP、FoolNLTK等等。\n",
"\n",
"本次采用FoolNLTK实现实体识别,fool是一个基于bi-lstm+CRF算法开发的深度学习开源NLP工具,包括了分词、实体识别等功能,大家可以通过fool很好地体会深度学习在该任务上的优缺点。\n",
"\n",
"在‘data/train_data.csv’和‘data/test_data.csv’中是从网络上爬虫得到的上市公司公告,数据样例如下:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" <th>tag</th>\n",
" <th>member1</th>\n",
" <th>member2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6461</td>\n",
" <td>与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2111</td>\n",
" <td>三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>9603</td>\n",
" <td>2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515...</td>\n",
" <td>1</td>\n",
" <td>协鑫集成科技股份有限公司</td>\n",
" <td>瑞峰(张家港)光伏科技有限公司</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3456</td>\n",
" <td>证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>8844</td>\n",
" <td>本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数...</td>\n",
" <td>1</td>\n",
" <td>广发证券股份有限公司</td>\n",
" <td>辽宁成大股份有限公司</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence tag member1 \\\n",
"0 6461 与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市... 0 0 \n",
"1 2111 三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无... 0 0 \n",
"2 9603 2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515... 1 协鑫集成科技股份有限公司 \n",
"3 3456 证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限... 0 0 \n",
"4 8844 本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数... 1 广发证券股份有限公司 \n",
"\n",
" member2 \n",
"0 0 \n",
"1 0 \n",
"2 瑞峰(张家港)光伏科技有限公司 \n",
"3 0 \n",
"4 辽宁成大股份有限公司 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'gb2312', header=0)\n",
"train_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9259</td>\n",
" <td>2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9136</td>\n",
" <td>2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>220</td>\n",
" <td>2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>9041</td>\n",
" <td>2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>10041</td>\n",
" <td>一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence\n",
"0 9259 2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》\n",
"1 9136 2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先\n",
"2 220 2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》\n",
"3 9041 2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司...\n",
"4 10041 一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收..."
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"test_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们选取一部分样本进行标注,即train_data,该数据由5列组成。id列表示原始样本序号;sentence列为我们截取的一段关键信息;如果关键信息中存在两个实体之间有股权交易关系则tag列为1,否则为0;如果tag为1,则在member1和member2列会记录两个实体出现在sentence中的名称。\n",
"\n",
"剩下的样本没有标注,即test_data,该数据只有id和sentence两列,希望你能训练模型对test_data中的实体进行识别,并判断实体对之间有没有股权交易关系。\n",
"\n",
"### 练习3:\n",
"将每句句子中实体识别出,存入实体词典,并用特殊符号替换语句。\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"# 处理test数据,利用开源工具进行实体识别和并使用实体统一函数存储实体\n",
"\n",
"import fool\n",
"import pandas as pd\n",
"from copy import copy\n",
"\n",
"\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"test_data['ner'] = None\n",
"ner_id = 1001\n",
"ner_dict_new = {} # 存储所有实体\n",
"ner_dict_reverse_new = {} # 存储所有实体\n",
"\n",
"for i in range(len(test_data)):\n",
" sentence = copy(test_data.iloc[i, 1])\n",
" words, ners = fool.analysis(sentence)\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='company' or ner_type=='person':\n",
" company_main_name = ''.join(main_extract(ner_name,stop_word,d_4_delete,d_city_province)) # 提取公司主体名称\n",
" if company_main_name not in ner_dict_new:\n",
" ner_dict_new[company_main_name] = ner_id\n",
" ner_id+=1\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[company_main_name]) + '_ ' + sentence[end-1:]\n",
" test_data.iloc[i, -1] = sentence\n",
"\n",
"X_test = test_data[['ner']]\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"# 处理train数据,利用开源工具进行实体识别和并使用实体统一函数存储实体\n",
"train_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'gb2312', header=0)\n",
"train_data['ner'] = None\n",
"\n",
"for i in range(len(train_data)):\n",
" if train_data.iloc[i,:]['member1']=='0' and train_data.iloc[i,:]['member2']=='0':\n",
" sentence = copy(train_data.iloc[i, 1])\n",
" words, ners = fool.analysis(sentence)\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='company' or ner_type=='person':\n",
" company_main_name = ''.join(main_extract(ner_name,stop_word,d_4_delete,d_city_province)) # 提取公司主体名称\n",
" if company_main_name not in ner_dict_new:\n",
" ner_dict_new[company_main_name] = ner_id\n",
" ner_id+=1\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[company_main_name]) + '_ ' + sentence[end-1:]\n",
" train_data.iloc[i, -1] = sentence\n",
" else:\n",
" train_data.iloc[i, -1] = re.sub(r'%s|%s'%(train_data.iloc[i,:]['member1'],train_data.iloc[i,:]['member2']), ' ner_1 ', train_data.iloc[i,:]['sentence'])\n",
"\n",
"y = train_data.loc[:,['tag']]\n",
"train_num = len(train_data)\n",
"X_train = train_data[['ner']]\n",
"\n",
"# 将train和test放在一起提取特征\n",
"X = pd.concat([X_train, X_test])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 4:关系抽取\n",
"\n",
"\n",
"目标:借助句法分析工具,和实体识别的结果,以及文本特征,基于训练数据抽取关系,并存储进图数据库。\n",
"\n",
"本次要求抽取股权交易关系,关系为有向边,由投资方指向被投资方。\n",
"\n",
"模板建立可以使用“正则表达式”、“实体间距离”、“实体上下文”、“依存句法”等。\n",
"\n",
"答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"- info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(实体统一的多个实体名用“|”分隔)\n",
"- info_extract_submit.csv格式为:第一列是关系中实体1的编号,第二列为关系中实体2的编号。\n",
"\n",
"示例:\n",
"- info_extract_entity.csv\n",
"\n",
"| 实体编号 | 实体名 |\n",
"| ------ | ------ |\n",
"| 1001 | 小王 |\n",
"| 1002 | A化工厂 |\n",
"\n",
"- info_extract_submit.csv\n",
"\n",
"| 实体1 | 实体2 |\n",
"| ------ | ------ |\n",
"| 1001 | 1003 |\n",
"| 1002 | 1001 |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习4:提取文本tf-idf特征\n",
"\n",
"去除停用词,并转换成tfidf向量。"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# code\n",
"from sklearn.feature_extraction.text import TfidfTransformer \n",
"from sklearn.feature_extraction.text import CountVectorizer \n",
"from pyltp import Segmentor\n",
"\n",
"# 初始化实例\n",
"segmentor = Segmentor() \n",
"# 加载模型,加载自定义词典\n",
"segmentor.load_with_lexicon('/Users/Badrain/Downloads/ltp_data_v3.4.0/cws.model', '../data/user_dict.txt') \n",
"\n",
"# 加载停用词\n",
"fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
"stop_word = fr.readlines()\n",
"stop_word = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
"\n",
"\n",
"f = lambda x: ' '.join([for word in segmentor.segment(x) if word not in stop_word])\n",
"corpus=sample_data['sentence'].map(f).tolist()\n",
"\n",
"\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"tfidf = TfidfVectorizer()\n",
"re = tfidf.fit_transform(corpus)\n",
"\n",
"tfidf_feature = pd.DataFrame(tfidf_feature.toarray())\n",
"# print(re)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习5:提取句法特征\n",
"除了词语层面的句向量特征,我们还可以从句法入手,提取一些句法分析的特征。\n",
"\n",
"参考特征:\n",
"\n",
"1、企业实体间距离\n",
"\n",
"2、企业实体间句法距离\n",
"\n",
"3、企业实体分别和关键触发词的距离\n",
"\n",
"4、实体的依存关系类别"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"# -*- coding: utf-8 -*-\n",
"from pyltp import Parser\n",
"from pyltp import Segmentor\n",
"from pyltp import Postagger\n",
"import networkx as nx\n",
"import pylab\n",
"import re\n",
"\n",
"postagger = Postagger() # 初始化实例\n",
"postagger.load_with_lexicon('/Users/Badrain/Downloads/ltp_data_v3.4.0/pos.model', '../data/user_dict.txt') # 加载模型\n",
"segmentor = Segmentor() # 初始化实例\n",
"segmentor.load_with_lexicon('/Users/Badrain/Downloads/ltp_data_v3.4.0/cws.model', '../data/user_dict.txt') # 加载模型\n",
"\n",
"\n",
"# 实体符号加入分词词典\n",
"with open('../data/user_dict.txt', 'w') as fw:\n",
" for v in ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']:\n",
" fw.write( v + '号企业 ni\\n')\n",
"\n",
"\n",
"def parse(s):\n",
" \"\"\"\n",
" 对语句进行句法分析,并返回句法结果\n",
" parse_result:依存句法解析结果\n",
" source:企业实体的词序号\n",
" target:另一个企业实体的词序号\n",
" keyword_pos:关键词词序号列表\n",
" source_dep:企业实体依存句法类型\n",
" target_dep:另一个企业实体依存句法类型\n",
" \"\"\"\n",
" tmp_ner_dict = {}\n",
" num_lst = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']\n",
"\n",
" # 将公司代码替换为特殊称谓,保证分词词性正确\n",
" for i, ner in enumerate(list(set(re.findall(r'(ner\\_\\d\\d\\d\\d\\_)', s)))):\n",
" try:\n",
" tmp_ner_dict[num_lst[i]+'号企业'] = ner\n",
" except IndexError:\n",
" return None, None, None, None, None, None\n",
" s = s.replace(ner, num_lst[i]+'号企业')\n",
" words = segmentor.segment(s)\n",
" tags = postagger.postag(words)\n",
" parser = Parser() # 初始化实例\n",
" parser.load('/Users/Badrain/Downloads/ltp_data_v3.4.0/parser.model') # 加载模型\n",
" arcs = parser.parse(words, tags) # 句法分析\n",
" arcs_lst = list(map(list, zip(*[[arc.head, arc.relation] for arc in arcs])))\n",
" \n",
" # 句法分析结果输出\n",
" parse_result = pd.DataFrame([[a,b,c,d] for a,b,c,d in zip(list(words),list(tags), arcs_lst[0], arcs_lst[1])], index = range(1,len(words)+1))\n",
" parser.release() # 释放模型\n",
" \n",
" # 能找到两个企业以上才返回结果,目前简化,只考虑前两家企业的关系\n",
" try:\n",
" source = list(words).index('一号企业')+1\n",
" target = list(words).index('二号企业')+1\n",
" source_dep = arcs_lst[1][source-1]\n",
" target_dep = arcs_lst[1][target-1]\n",
" except:\n",
" return None, None, None, None, None, None\n",
" \n",
" # 投资关系关键词\n",
" key_words = [\"收购\",\"竞拍\",\"转让\",\"扩张\",\"并购\",\"注资\",\"整合\",\"并入\",\"竞购\",\"竞买\",\"支付\",\"收购价\",\"收购价格\",\"承购\",\"购得\",\"购进\",\n",
" \"购入\",\"买进\",\"买入\",\"赎买\",\"购销\",\"议购\",\"函购\",\"函售\",\"抛售\",\"售卖\",\"销售\",\"转售\"]\n",
" keyword_pos = [list(words).index(w)+1 if w in list(words) else -1 for w in key_words]\n",
" \n",
" return parse_result, source, target, keyword_pos, source_dep, target_dep\n",
"\n",
"\n",
"def shortest_path(arcs_ret, source, target):\n",
" \"\"\"\n",
" 求出两个词最短依存句法路径,不存在路径返回-1\n",
" \"\"\"\n",
" G=nx.DiGraph()\n",
" # 为这个网络添加节点...\n",
" for i in list(arcs_ret.index):\n",
" G.add_node(i)\n",
" # 在网络中添加带权中的边...\n",
" for i in list(arcs_ret.index):\n",
" G.add_edges_from([( arcs_ret.iloc[i-1, 2], i )])\n",
" G.add_edges_from([( i, arcs_ret.iloc[i-1, 2] )])\n",
"\n",
" try:\n",
" distance=nx.shortest_path_length(G,source,target)\n",
" # print('源节点为0,终点为7,最短距离:', distance)\n",
" return distance\n",
" except:\n",
" return -1\n",
"\n",
"\n",
"def get_parse_feature(s):\n",
" \"\"\"\n",
" 综合上述函数汇总句法分析特征\n",
" \"\"\"\n",
" parse_result, source, target, keyword_pos, source_dep, target_dep = parse(s)\n",
" if parse_result is None:\n",
" return [-1]*59\n",
" features = []\n",
" features.append(shortest_path(parse_result, source, target))\n",
" keyword_feature = []\n",
" for p in keyword_pos:\n",
" if p==-1:\n",
" keyword_feature.append(-1)\n",
" keyword_feature.append(-1)\n",
" else:\n",
" keyword_feature.append(shortest_path(parse_result, source, p))\n",
" keyword_feature.append(shortest_path(parse_result, target, p))\n",
" features.extend(keyword_feature)\n",
" features.extend([source_dep, target_dep])\n",
" return features\n"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"# 对所有样本统一派生特征\n",
"\n",
"f = lambda x: get_parse_feature(x)\n",
"parse_feature = X.map(f)\n",
"\n",
"whole_feature = []\n",
"for i in range(len(parse_feature)):\n",
" whole_feature.append(list(tfidf_feature.iloc[i,:]) + parse_feature[i])\n",
"\n",
"whole_feature = pd.DataFrame(whole_feature)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习6:建立分类器\n",
"\n",
"利用已经提取好的tfidf特征以及parse特征,建立分类器进行分类任务。"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
"# 建立分类器进行分类\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn import preprocessing\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"# TODO:定义需要遍历的参数\n",
"parameters = { 'C':np.logspace(-3,3,7)}\n",
"\n",
"# TODO:选择模型\n",
"lr = LogisticRegression()\n",
"\n",
"# TODO:利用GridSearchCV搜索最佳参数\n",
"clf = GridSearchCV(lr, parameters, cv=5)\n",
"clf.fit(train_x, y)\n",
"\n",
"# TODO:对Test_data进行分类\n",
"predict = clf.predict(test_x)\n",
"predict_prob = clf.predict_proba(test_x)\n",
"\n",
"\n",
"# TODO:保存结果\n",
"# 答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"# info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(实体统一的多个实体名用“|”分隔)\n",
"# info_extract_submit.csv格式为:第一列是关系中实体1的编号,第二列为关系中实体2的编号。\n",
"\n",
" "
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习7:操作图数据库\n",
"对关系最好的描述就是用图,那这里就需要使用图数据库,目前最常用的图数据库是noe4j,通过cypher语句就可以操作图数据库的增删改查。可以参考“https://cuiqingcai.com/4778.html”。\n",
"\n",
"本次作业我们使用neo4j作为图数据库,neo4j需要java环境,请先配置好环境。\n",
"\n",
"将我们提出的实体关系插入图数据库,并查询某节点的3层投资关系。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"from py2neo import Node, Relationship, Graph\n",
"\n",
"graph = Graph(\n",
" \"http://localhost:7474\", \n",
" username=\"neo4j\", \n",
" password=\"person\"\n",
")\n",
"\n",
"for v in relation_list:\n",
" a = Node('Company', name=v[0])\n",
" b = Node('Company', name=v[1])\n",
" \n",
" # 本次不区分投资方和被投资方,无向图\n",
" r = Relationship(a, 'INVEST', b)\n",
" s = a | b | r\n",
" graph.create(s)\n",
" r = Relationship(b, 'INVEST', a)\n",
" s = a | b | r\n",
" graph.create(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# TODO:查询某节点的3层投资关系\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤5:实体消歧\n",
"解决了实体识别和关系的提取,我们已经完成了一大截,但是我们提取的实体究竟对应知识库中哪个实体呢?下图中,光是“苹果”就对应了13个同名实体。\n",
"<img src=\"../image/baike2.png\", width=340, heigth=480>\n",
"\n",
"在这个问题上,实体消歧旨在解决文本中广泛存在的名称歧义问题,将句中识别的实体与知识库中实体进行匹配,解决实体歧义问题。\n",
"\n",
"\n",
"### 练习8:\n",
"匹配test_data.csv中前25条样本中的人物实体对应的百度百科URL(此部分样本中所有人名均可在百度百科中链接到)。\n",
"\n",
"利用scrapy、beautifulsoup、request等python包对百度百科进行爬虫,判断是否具有一词多义的情况,如果有的话,选择最佳实体进行匹配。\n",
"\n",
"使用URL为‘https://baike.baidu.com/item/’+人名 可以访问百度百科该人名的词条,此处需要根据爬取到的网页识别该词条是否对应多个实体,如下图:\n",
"<img src=\"../image/baike1.png\", width=440, heigth=480>\n",
"如果该词条有对应多个实体,请返回正确匹配的实体URL,例如该示例网页中的‘https://baike.baidu.com/item/陆永/20793929’。\n",
"\n",
"- 提交文件:entity_disambiguation_submit.csv\n",
"- 提交格式:第一列为实体id(与info_extract_submit.csv中id保持一致),第二列为对应URL。\n",
"- 示例:\n",
"\n",
"| 实体编号 | URL |\n",
"| ------ | ------ |\n",
"| 1001 | https://baike.baidu.com/item/陆永/20793929 |\n",
"| 1002 | https://baike.baidu.com/item/王芳/567232 |\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import jieba\n",
"import pandas as pd\n",
"\n",
"# 找出test_data.csv中前25条样本所有的人物名称,以及人物所在文档的上下文内容\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"\n",
"# 存储人物以及上下文信息(key为人物ID,value为人物名称、人物上下文内容)\n",
"person_name = {}\n",
"\n",
"# 观察上下文的窗口大小\n",
"window = 10 \n",
"\n",
"# 遍历前25条样本\n",
"for i in range(25):\n",
" sentence = copy(test_data.iloc[i, 1])\n",
" words, ners = fool.analysis(sentence)\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='person':\n",
" # TODO:提取上下文\n",
" person_name[ner_name] = person_name.get(ner_name)+sentence[max(0, idx-window):min(len(sentence)-1, idx+window)]\n",
"\n",
"\n",
"\n",
"# 利用爬虫得到每个人物名称对应的URL\n",
"# TODO:找到每个人物实体的词条内容。\n",
"\n",
"# TODO:将样本中人物上下文与爬取词条结果进行对比,选择最接近的词条。\n",
"\n",
"\n",
"\n",
"# 输出结果\n",
"pd.DataFrame(result_data).to_csv('../submit/entity_disambiguation_submit.csv', index=False)\n"
]
}
],
"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.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 利用信息抽取技术搭建知识库\n",
"\n",
"在这个notebook文件中,有些模板代码已经提供给你,但你还需要实现更多的功能来完成这个项目。除非有明确要求,你无须修改任何已给出的代码。以**'【练习】'**开始的标题表示接下来的代码部分中有你需要实现的功能。这些部分都配有详细的指导,需要实现的部分也会在注释中以'TODO'标出。请仔细阅读所有的提示。\n",
"\n",
">**提示:**Code 和 Markdown 区域可通过 **Shift + Enter** 快捷键运行。此外,Markdown可以通过双击进入编辑模式。\n",
"\n",
"---\n",
"\n",
"### 让我们开始吧\n",
"\n",
"本项目的目的是结合命名实体识别、依存语法分析、实体消歧、实体统一对网站开放语料抓取的数据建立小型知识图谱。\n",
"\n",
"在现实世界中,你需要拼凑一系列的模型来完成不同的任务;举个例子,用来预测狗种类的算法会与预测人类的算法不同。在做项目的过程中,你可能会遇到不少失败的预测,因为并不存在完美的算法和模型。你最终提交的不完美的解决方案也一定会给你带来一个有趣的学习经验!\n",
"\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 1:实体统一"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"实体统一做的是对同一实体具有多个名称的情况进行统一,将多种称谓统一到一个实体上,并体现在实体的属性中(可以给实体建立“别称”属性)\n",
"\n",
"例如:对“河北银行股份有限公司”、“河北银行公司”和“河北银行”我们都可以认为是一个实体,我们就可以将通过提取前两个称谓的主要内容,得到“河北银行”这个实体关键信息。\n",
"\n",
"公司名称有其特点,例如后缀可以省略、上市公司的地名可以省略等等。在data/dict目录中提供了几个词典,可供实体统一使用。\n",
"- company_suffix.txt是公司的通用后缀词典\n",
"- company_business_scope.txt是公司经营范围常用词典\n",
"- co_Province_Dim.txt是省份词典\n",
"- co_City_Dim.txt是城市词典\n",
"- stopwords.txt是可供参考的停用词\n",
"\n",
"### 练习1:\n",
"编写main_extract函数,实现对实体的名称提取“主体名称”的功能。"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import jieba\n",
"import jieba.posseg as pseg\n",
"import re\n",
"import datetime\n",
"\n",
"\n",
"# 从输入的“公司名”中提取主体\n",
"def main_extract(input_str,stop_word,d_4_delete,d_city_province):\n",
" # 开始分词并处理\n",
" seg = pseg.cut(input_str)\n",
" seg_lst = remove_word(seg,stop_word,d_4_delete)\n",
" seg_lst = city_prov_ahead(seg,d_city_province)\n",
" return seg_lst\n",
"\n",
" \n",
"#TODO:实现公司名称中地名提前\n",
"def city_prov_ahead(seg,d_city_province):\n",
" city_prov_lst = []\n",
" # TODO ...\n",
" \n",
" return city_prov_lst+seg_lst\n",
"\n",
"\n",
"\n",
"\n",
"#TODO:替换特殊符号\n",
"def remove_word(seg,stop_word,d_4_delete):\n",
" # TODO ...\n",
" \n",
" return seg_lst\n",
"\n",
"\n",
"# 初始化,加载词典\n",
"def my_initial():\n",
" fr1 = open(r\"../data/dict/co_City_Dim.txt\", encoding='utf-8')\n",
" fr2 = open(r\"../data/dict/co_Province_Dim.txt\", encoding='utf-8')\n",
" fr3 = open(r\"../data/dict/company_business_scope.txt\", encoding='utf-8')\n",
" fr4 = open(r\"../data/dict/company_suffix.txt\", encoding='utf-8')\n",
" #城市名\n",
" lines1 = fr1.readlines()\n",
" d_4_delete = []\n",
" d_city_province = [re.sub(r'(\\r|\\n)*','',line) for line in lines1]\n",
" #省份名\n",
" lines2 = fr2.readlines()\n",
" l2_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines2]\n",
" d_city_province.extend(l2_tmp)\n",
" #公司后缀\n",
" lines3 = fr3.readlines()\n",
" l3_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines3]\n",
" lines4 = fr4.readlines()\n",
" l4_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines4]\n",
" d_4_delete.extend(l4_tmp)\n",
" #get stop_word\n",
" fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
" stop_word = fr.readlines()\n",
" stop_word_after = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
" stop_word_after[-1] = stop_word[-1]\n",
" stop_word = stop_word_after\n",
" return d_4_delete,stop_word,d_city_province\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Building prefix dict from the default dictionary ...\n",
"Loading model from cache C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\jieba.cache\n",
"Loading model cost 0.732 seconds.\n",
"Prefix dict has been built succesfully.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"河北银行\n"
]
}
],
"source": [
"# TODO:测试实体统一用例\n",
"d_4_delete,stop_word,d_city_province = my_initial()\n",
"company_name = \"河北银行股份有限公司\"\n",
"lst = main_extract(company_name,stop_word,d_4_delete,d_city_province)\n",
"company_name = ''.join(lst) # 对公司名提取主体部分,将包含相同主体部分的公司统一为一个实体\n",
"print(company_name)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 2:实体识别\n",
"有很多开源工具可以帮助我们对实体进行识别。常见的有LTP、StanfordNLP、FoolNLTK等等。\n",
"\n",
"本次采用FoolNLTK实现实体识别,fool是一个基于bi-lstm+CRF算法开发的深度学习开源NLP工具,包括了分词、实体识别等功能,大家可以通过fool很好地体会深度学习在该任务上的优缺点。\n",
"\n",
"在‘data/train_data.csv’和‘data/test_data.csv’中是从网络上爬虫得到的上市公司公告,数据样例如下:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" <th>tag</th>\n",
" <th>member1</th>\n",
" <th>member2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6461</td>\n",
" <td>与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2111</td>\n",
" <td>三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>9603</td>\n",
" <td>2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515...</td>\n",
" <td>1</td>\n",
" <td>协鑫集成科技股份有限公司</td>\n",
" <td>瑞峰(张家港)光伏科技有限公司</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3456</td>\n",
" <td>证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>8844</td>\n",
" <td>本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数...</td>\n",
" <td>1</td>\n",
" <td>广发证券股份有限公司</td>\n",
" <td>辽宁成大股份有限公司</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence tag member1 \\\n",
"0 6461 与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市... 0 0 \n",
"1 2111 三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无... 0 0 \n",
"2 9603 2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515... 1 协鑫集成科技股份有限公司 \n",
"3 3456 证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限... 0 0 \n",
"4 8844 本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数... 1 广发证券股份有限公司 \n",
"\n",
" member2 \n",
"0 0 \n",
"1 0 \n",
"2 瑞峰(张家港)光伏科技有限公司 \n",
"3 0 \n",
"4 辽宁成大股份有限公司 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'gb2312', header=0)\n",
"train_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9259</td>\n",
" <td>2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9136</td>\n",
" <td>2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>220</td>\n",
" <td>2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>9041</td>\n",
" <td>2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>10041</td>\n",
" <td>一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence\n",
"0 9259 2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》\n",
"1 9136 2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先\n",
"2 220 2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》\n",
"3 9041 2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司...\n",
"4 10041 一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收..."
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"test_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们选取一部分样本进行标注,即train_data,该数据由5列组成。id列表示原始样本序号;sentence列为我们截取的一段关键信息;如果关键信息中存在两个实体之间有股权交易关系则tag列为1,否则为0;如果tag为1,则在member1和member2列会记录两个实体出现在sentence中的名称。\n",
"\n",
"剩下的样本没有标注,即test_data,该数据只有id和sentence两列,希望你能训练模型对test_data中的实体进行识别,并判断实体对之间有没有股权交易关系。\n",
"\n",
"### 练习2:\n",
"将每句句子中实体识别出,存入实体词典,并用特殊符号替换语句。\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 处理test数据,利用开源工具进行实体识别和并使用实体统一函数存储实体\n",
"\n",
"import fool\n",
"import pandas as pd\n",
"from copy import copy\n",
"\n",
"\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"test_data['ner'] = None\n",
"ner_id = 1001\n",
"ner_dict_new = {} # 存储所有实体\n",
"ner_dict_reverse_new = {} # 存储所有实体\n",
"\n",
"for i in range(len(test_data)):\n",
" sentence = copy(test_data.iloc[i, 1])\n",
" # TODO:调用fool进行实体识别,得到words和ners结果\n",
" # TODO ...\n",
" \n",
" \n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='company' or ner_type=='person':\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
" \n",
" \n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[company_main_name]) + '_ ' + sentence[end-1:]\n",
" test_data.iloc[i, -1] = sentence\n",
"\n",
"X_test = test_data[['ner']]\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 处理train数据,利用开源工具进行实体识别和并使用实体统一函数存储实体\n",
"train_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'gb2312', header=0)\n",
"train_data['ner'] = None\n",
"\n",
"for i in range(len(train_data)):\n",
" # 判断正负样本\n",
" if train_data.iloc[i,:]['member1']=='0' and train_data.iloc[i,:]['member2']=='0':\n",
" sentence = copy(train_data.iloc[i, 1])\n",
" # TODO:调用fool进行实体识别,得到words和ners结果\n",
" # TODO ...\n",
" \n",
" \n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='company' or ner_type=='person':\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
"\n",
"\n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[company_main_name]) + '_ ' + sentence[end-1:]\n",
" train_data.iloc[i, -1] = sentence\n",
" else:\n",
" # 将训练集中正样本已经标注的实体也使用编码替换\n",
" sentence = copy(train_data.iloc[i,:]['sentence'])\n",
" for company_main_name in [train_data.iloc[i,:]['member1'],train_data.iloc[i,:]['member2']]:\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
"\n",
"\n",
" # 在句子中用编号替换实体名\n",
" sentence = re.sub(company_main_name, ' ner_%s_ '%(str(ner_dict_new[company_main_name])), sentence)\n",
" train_data.iloc[i, -1] = sentence\n",
" \n",
"y = train_data.loc[:,['tag']]\n",
"train_num = len(train_data)\n",
"X_train = train_data[['ner']]\n",
"\n",
"# 将train和test放在一起提取特征\n",
"X = pd.concat([X_train, X_test])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 3:关系抽取\n",
"\n",
"\n",
"目标:借助句法分析工具,和实体识别的结果,以及文本特征,基于训练数据抽取关系,并存储进图数据库。\n",
"\n",
"本次要求抽取股权交易关系,关系为无向边,不要求判断投资方和被投资方,只要求得到双方是否存在交易关系。\n",
"\n",
"模板建立可以使用“正则表达式”、“实体间距离”、“实体上下文”、“依存句法”等。\n",
"\n",
"答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"- info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(实体统一的多个实体名用“|”分隔)\n",
"- info_extract_submit.csv格式为:第一列是关系中实体1的编号,第二列为关系中实体2的编号。\n",
"\n",
"示例:\n",
"- info_extract_entity.csv\n",
"\n",
"| 实体编号 | 实体名 |\n",
"| ------ | ------ |\n",
"| 1001 | 小王 |\n",
"| 1002 | A化工厂 |\n",
"\n",
"- info_extract_submit.csv\n",
"\n",
"| 实体1 | 实体2 |\n",
"| ------ | ------ |\n",
"| 1001 | 1003 |\n",
"| 1002 | 1001 |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习3:提取文本tf-idf特征\n",
"\n",
"去除停用词,并转换成tfidf向量。"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": true,
"scrolled": true
},
"outputs": [],
"source": [
"# code\n",
"from sklearn.feature_extraction.text import TfidfTransformer \n",
"from sklearn.feature_extraction.text import CountVectorizer \n",
"from pyltp import Segmentor\n",
"\n",
"\n",
"# 实体符号加入分词词典\n",
"with open('../data/user_dict.txt', 'w') as fw:\n",
" for v in ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']:\n",
" fw.write( v + '号企业 ni\\n')\n",
"\n",
"# 初始化实例\n",
"segmentor = Segmentor() \n",
"# 加载模型,加载自定义词典\n",
"segmentor.load_with_lexicon('/Users/Badrain/Downloads/ltp_data_v3.4.0/cws.model', '../data/user_dict.txt') \n",
"\n",
"# 加载停用词\n",
"fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
"stop_word = fr.readlines()\n",
"stop_word = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
"\n",
"# 分词\n",
"f = lambda x: ' '.join([for word in segmentor.segment(x) if word not in stop_word and not re.findall(r'ner\\_\\d\\d\\d\\d\\_', word)])\n",
"corpus=X['ner'].map(f).tolist()\n",
"\n",
"\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"# TODO:提取tfidf特征\n",
"# TODO ...\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习4:提取句法特征\n",
"除了词语层面的句向量特征,我们还可以从句法入手,提取一些句法分析的特征。\n",
"\n",
"参考特征:\n",
"\n",
"1、企业实体间距离\n",
"\n",
"2、企业实体间句法距离\n",
"\n",
"3、企业实体分别和关键触发词的距离\n",
"\n",
"4、实体的依存关系类别"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# -*- coding: utf-8 -*-\n",
"from pyltp import Parser\n",
"from pyltp import Segmentor\n",
"from pyltp import Postagger\n",
"import networkx as nx\n",
"import pylab\n",
"import re\n",
"\n",
"postagger = Postagger() # 初始化实例\n",
"postagger.load_with_lexicon('/Users/Badrain/Downloads/ltp_data_v3.4.0/pos.model', '../data/user_dict.txt') # 加载模型\n",
"segmentor = Segmentor() # 初始化实例\n",
"segmentor.load_with_lexicon('/Users/Badrain/Downloads/ltp_data_v3.4.0/cws.model', '../data/user_dict.txt') # 加载模型\n",
"\n",
"\n",
"\n",
"def parse(s):\n",
" \"\"\"\n",
" 对语句进行句法分析,并返回句法结果\n",
" \"\"\"\n",
" tmp_ner_dict = {}\n",
" num_lst = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']\n",
"\n",
" # 将公司代码替换为特殊称谓,保证分词词性正确\n",
" for i, ner in enumerate(list(set(re.findall(r'(ner\\_\\d\\d\\d\\d\\_)', s)))):\n",
" try:\n",
" tmp_ner_dict[num_lst[i]+'号企业'] = ner\n",
" except IndexError:\n",
" # TODO:定义错误情况的输出\n",
" # TODO ...\n",
" \n",
" \n",
" s = s.replace(ner, num_lst[i]+'号企业')\n",
" words = segmentor.segment(s)\n",
" tags = postagger.postag(words)\n",
" parser = Parser() # 初始化实例\n",
" parser.load('/Users/Badrain/Downloads/ltp_data_v3.4.0/parser.model') # 加载模型\n",
" arcs = parser.parse(words, tags) # 句法分析\n",
" arcs_lst = list(map(list, zip(*[[arc.head, arc.relation] for arc in arcs])))\n",
" \n",
" # 句法分析结果输出\n",
" parse_result = pd.DataFrame([[a,b,c,d] for a,b,c,d in zip(list(words),list(tags), arcs_lst[0], arcs_lst[1])], index = range(1,len(words)+1))\n",
" parser.release() # 释放模型\n",
" # TODO:提取企业实体依存句法类型\n",
" # TODO ...\n",
" \n",
" \n",
"\n",
" # 投资关系关键词\n",
" key_words = [\"收购\",\"竞拍\",\"转让\",\"扩张\",\"并购\",\"注资\",\"整合\",\"并入\",\"竞购\",\"竞买\",\"支付\",\"收购价\",\"收购价格\",\"承购\",\"购得\",\"购进\",\n",
" \"购入\",\"买进\",\"买入\",\"赎买\",\"购销\",\"议购\",\"函购\",\"函售\",\"抛售\",\"售卖\",\"销售\",\"转售\"]\n",
" # TODO:*根据关键词和对应句法关系提取特征(如没有思路可以不完成)\n",
" # TODO ...\n",
" \n",
" \n",
" parser.release() # 释放模型\n",
" return your_result\n",
"\n",
"\n",
"def shortest_path(arcs_ret, source, target):\n",
" \"\"\"\n",
" 求出两个词最短依存句法路径,不存在路径返回-1\n",
" arcs_ret:句法分析结果\n",
" source:实体1\n",
" target:实体2\n",
" \"\"\"\n",
" G=nx.DiGraph()\n",
" # 为这个网络添加节点...\n",
" for i in list(arcs_ret.index):\n",
" G.add_node(i)\n",
" # TODO:在网络中添加带权中的边...(注意,我们需要的是无向边)\n",
" # TODO ...\n",
" \n",
"\n",
" try:\n",
" # TODO:利用nx包中shortest_path_length方法实现最短距离提取\n",
" # TODO ...\n",
" \n",
" \n",
" return distance\n",
" except:\n",
" return -1\n",
"\n",
"\n",
"def get_feature(s):\n",
" \"\"\"\n",
" 汇总上述函数汇总句法分析特征与TFIDF特征\n",
" \"\"\"\n",
" # TODO:汇总上述函数汇总句法分析特征与TFIDF特征\n",
" # TODO ...\n",
" \n",
" \n",
" return features\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习5:建立分类器\n",
"\n",
"利用已经提取好的tfidf特征以及parse特征,建立分类器进行分类任务。"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 建立分类器进行分类\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn import preprocessing\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"# TODO:定义需要遍历的参数\n",
"\n",
"\n",
"# TODO:选择模型\n",
"\n",
"\n",
"# TODO:利用GridSearchCV搜索最佳参数\n",
"\n",
"\n",
"# TODO:对Test_data进行分类\n",
"\n",
"\n",
"\n",
"# TODO:保存Test_data分类结果\n",
"# 答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"# info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(实体统一的多个实体名用“|”分隔)\n",
"# info_extract_submit.csv格式为:第一列是关系中实体1的编号,第二列为关系中实体2的编号。\n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习6:操作图数据库\n",
"对关系最好的描述就是用图,那这里就需要使用图数据库,目前最常用的图数据库是noe4j,通过cypher语句就可以操作图数据库的增删改查。可以参考“https://cuiqingcai.com/4778.html”。\n",
"\n",
"本次作业我们使用neo4j作为图数据库,neo4j需要java环境,请先配置好环境。\n",
"\n",
"将我们提出的实体关系插入图数据库,并查询某节点的3层投资关系,即三个节点组成的路径(如果有的话)。如果无法找到3层投资关系,请查询出任意指定节点的投资路径。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"from py2neo import Node, Relationship, Graph\n",
"\n",
"graph = Graph(\n",
" \"http://localhost:7474\", \n",
" username=\"neo4j\", \n",
" password=\"person\"\n",
")\n",
"\n",
"for v in relation_list:\n",
" a = Node('Company', name=v[0])\n",
" b = Node('Company', name=v[1])\n",
" \n",
" # 本次不区分投资方和被投资方,无向图\n",
" r = Relationship(a, 'INVEST', b)\n",
" s = a | b | r\n",
" graph.create(s)\n",
" r = Relationship(b, 'INVEST', a)\n",
" s = a | b | r\n",
" graph.create(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# TODO:查询某节点的3层投资关系\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤4:实体消歧\n",
"解决了实体识别和关系的提取,我们已经完成了一大截,但是我们提取的实体究竟对应知识库中哪个实体呢?下图中,光是“苹果”就对应了13个同名实体。\n",
"<img src=\"../image/baike2.png\", width=340, heigth=480>\n",
"\n",
"在这个问题上,实体消歧旨在解决文本中广泛存在的名称歧义问题,将句中识别的实体与知识库中实体进行匹配,解决实体歧义问题。\n",
"\n",
"\n",
"### 练习7:\n",
"匹配test_data.csv中前25条样本中的人物实体对应的百度百科URL(此部分样本中所有人名均可在百度百科中链接到)。\n",
"\n",
"利用scrapy、beautifulsoup、request等python包对百度百科进行爬虫,判断是否具有一词多义的情况,如果有的话,选择最佳实体进行匹配。\n",
"\n",
"使用URL为‘https://baike.baidu.com/item/’+人名 可以访问百度百科该人名的词条,此处需要根据爬取到的网页识别该词条是否对应多个实体,如下图:\n",
"<img src=\"../image/baike1.png\", width=440, heigth=480>\n",
"如果该词条有对应多个实体,请返回正确匹配的实体URL,例如该示例网页中的‘https://baike.baidu.com/item/陆永/20793929’。\n",
"\n",
"- 提交文件:entity_disambiguation_submit.csv\n",
"- 提交格式:第一列为实体id(与info_extract_submit.csv中id保持一致),第二列为对应URL。\n",
"- 示例:\n",
"\n",
"| 实体编号 | URL |\n",
"| ------ | ------ |\n",
"| 1001 | https://baike.baidu.com/item/陆永/20793929 |\n",
"| 1002 | https://baike.baidu.com/item/王芳/567232 |\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import jieba\n",
"import pandas as pd\n",
"\n",
"# 找出test_data.csv中前25条样本所有的人物名称,以及人物所在文档的上下文内容\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"\n",
"# 存储人物以及上下文信息(key为人物ID,value为人物名称、人物上下文内容)\n",
"person_name = {}\n",
"\n",
"# 观察上下文的窗口大小\n",
"window = 10 \n",
"\n",
"# 遍历前25条样本\n",
"for i in range(25):\n",
" sentence = copy(test_data.iloc[i, 1])\n",
" words, ners = fool.analysis(sentence)\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='person':\n",
" # TODO:提取实体的上下文\n",
" \n",
"\n",
"\n",
"\n",
"# 利用爬虫得到每个人物名称对应的URL\n",
"# TODO:找到每个人物实体的词条内容。\n",
"\n",
"# TODO:将样本中人物上下文与爬取词条结果进行对比,选择最接近的词条。\n",
"\n",
"\n",
"\n",
"# 输出结果\n",
"pd.DataFrame(result_data).to_csv('../submit/entity_disambiguation_submit.csv', index=False)\n"
]
}
],
"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
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 利用信息抽取技术搭建知识库\n",
"\n",
"在这个notebook文件中,有些模板代码已经提供给你,但你还需要实现更多的功能来完成这个项目。除非有明确要求,你无须修改任何已给出的代码。以**'【练习】'**开始的标题表示接下来的代码部分中有你需要实现的功能。这些部分都配有详细的指导,需要实现的部分也会在注释中以'TODO'标出。请仔细阅读所有的提示。\n",
"\n",
">**提示:**Code 和 Markdown 区域可通过 **Shift + Enter** 快捷键运行。此外,Markdown可以通过双击进入编辑模式。\n",
"\n",
"---\n",
"\n",
"### 让我们开始吧\n",
"\n",
"本项目的目的是结合命名实体识别、依存语法分析、实体消歧、实体统一对网站开放语料抓取的数据建立小型知识图谱。\n",
"\n",
"在现实世界中,你需要拼凑一系列的模型来完成不同的任务;举个例子,用来预测狗种类的算法会与预测人类的算法不同。在做项目的过程中,你可能会遇到不少失败的预测,因为并不存在完美的算法和模型。你最终提交的不完美的解决方案也一定会给你带来一个有趣的学习经验!\n",
"\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 1:实体统一"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"实体统一做的是对同一实体具有多个名称的情况进行统一,将多种称谓统一到一个实体上,并体现在实体的属性中(可以给实体建立“别称”属性)\n",
"\n",
"例如:对“河北银行股份有限公司”、“河北银行公司”和“河北银行”我们都可以认为是一个实体,我们就可以将通过提取前两个称谓的主要内容,得到“河北银行”这个实体关键信息。\n",
"\n",
"公司名称有其特点,例如后缀可以省略、上市公司的地名可以省略等等。在data/dict目录中提供了几个词典,可供实体统一使用。\n",
"- company_suffix.txt是公司的通用后缀词典\n",
"- company_business_scope.txt是公司经营范围常用词典\n",
"- co_Province_Dim.txt是省份词典\n",
"- co_City_Dim.txt是城市词典\n",
"- stopwords.txt是可供参考的停用词\n",
"\n",
"### 练习1:\n",
"编写main_extract函数,实现对实体的名称提取“主体名称”的功能。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import jieba\n",
"import jieba.posseg as pseg\n",
"import re\n",
"import datetime\n",
"\n",
"\n",
"# 从输入的“公司名”中提取主体\n",
"def main_extract(input_str,stop_word,d_4_delete,d_city_province):\n",
" # 开始分词并处理\n",
" seg = pseg.cut(input_str)\n",
" seg_lst = remove_word(seg,stop_word,d_4_delete)\n",
" seg_lst = city_prov_ahead(seg_lst,d_city_province)\n",
" return [s.word for s in seg_lst]\n",
"\n",
" \n",
"#TODO:实现公司名称中地名提前\n",
"def city_prov_ahead(seg,d_city_province):\n",
" city_prov_lst = []\n",
" seg_lst = []\n",
" set_d_city_province = set(d_city_province)\n",
" # TODO ...\n",
" for s in seg:\n",
" if s.word in set_d_city_province:\n",
" city_prov_lst.append(s)\n",
" else:\n",
" seg_lst.append(s)\n",
" \n",
" return city_prov_lst+seg_lst\n",
"\n",
"\n",
"\n",
"\n",
"#TODO:替换特殊符号\n",
"def remove_word(seg,stop_word,d_4_delete):\n",
" # TODO ...\n",
" set_stop_word = set(stop_word)\n",
" set_d_4_delete = set(d_4_delete)\n",
" seg_lst = []\n",
" for s in seg:\n",
" if s.word in set_stop_word or s.word in set_d_4_delete:\n",
" continue\n",
" seg_lst.append(s)\n",
" return seg_lst\n",
"\n",
"\n",
"# 初始化,加载词典\n",
"def my_initial():\n",
" fr1 = open(r\"../data/dict/co_City_Dim.txt\", encoding='utf-8')\n",
" fr2 = open(r\"../data/dict/co_Province_Dim.txt\", encoding='utf-8')\n",
" fr3 = open(r\"../data/dict/company_business_scope.txt\", encoding='utf-8')\n",
" fr4 = open(r\"../data/dict/company_suffix.txt\", encoding='utf-8')\n",
" #城市名\n",
" lines1 = fr1.readlines()\n",
" d_4_delete = []\n",
" d_city_province = [re.sub(r'(\\r|\\n)*','',line) for line in lines1]\n",
" #省份名\n",
" lines2 = fr2.readlines()\n",
" l2_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines2]\n",
" d_city_province.extend(l2_tmp)\n",
" #公司后缀\n",
" lines3 = fr3.readlines()\n",
" l3_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines3]\n",
" lines4 = fr4.readlines()\n",
" l4_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines4]\n",
" d_4_delete.extend(l4_tmp)\n",
" #get stop_word\n",
" fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
" stop_word = fr.readlines()\n",
" stop_word_after = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
" stop_word_after[-1] = stop_word[-1]\n",
" stop_word = stop_word_after\n",
" return d_4_delete,stop_word,d_city_province\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Building prefix dict from the default dictionary ...\n",
"Loading model from cache /tmp/jieba.cache\n",
"Loading model cost 1.053 seconds.\n",
"Prefix dict has been built succesfully.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"河北银行\n"
]
}
],
"source": [
"# TODO:测试实体统一用例\n",
"d_4_delete,stop_word,d_city_province = my_initial()\n",
"company_name = \"河北银行股份有限公司\"\n",
"lst = main_extract(company_name,stop_word,d_4_delete,d_city_province)\n",
"company_name = ''.join(lst) # 对公司名提取主体部分,将包含相同主体部分的公司统一为一个实体\n",
"print(company_name)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 2:实体识别\n",
"有很多开源工具可以帮助我们对实体进行识别。常见的有LTP、StanfordNLP、FoolNLTK等等。\n",
"\n",
"本次采用FoolNLTK实现实体识别,fool是一个基于bi-lstm+CRF算法开发的深度学习开源NLP工具,包括了分词、实体识别等功能,大家可以通过fool很好地体会深度学习在该任务上的优缺点。\n",
"\n",
"在‘data/train_data.csv’和‘data/test_data.csv’中是从网络上爬虫得到的上市公司公告,数据样例如下:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" <th>tag</th>\n",
" <th>member1</th>\n",
" <th>member2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6461</td>\n",
" <td>与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2111</td>\n",
" <td>三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>9603</td>\n",
" <td>2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515...</td>\n",
" <td>1</td>\n",
" <td>协鑫集成科技股份有限公司</td>\n",
" <td>瑞峰(张家港)光伏科技有限公司</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3456</td>\n",
" <td>证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>8844</td>\n",
" <td>本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数...</td>\n",
" <td>1</td>\n",
" <td>广发证券股份有限公司</td>\n",
" <td>辽宁成大股份有限公司</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence tag member1 \\\n",
"0 6461 与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市... 0 0 \n",
"1 2111 三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无... 0 0 \n",
"2 9603 2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515... 1 协鑫集成科技股份有限公司 \n",
"3 3456 证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限... 0 0 \n",
"4 8844 本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数... 1 广发证券股份有限公司 \n",
"\n",
" member2 \n",
"0 0 \n",
"1 0 \n",
"2 瑞峰(张家港)光伏科技有限公司 \n",
"3 0 \n",
"4 辽宁成大股份有限公司 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"train_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'gb2312', header=0)\n",
"train_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9259</td>\n",
" <td>2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9136</td>\n",
" <td>2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>220</td>\n",
" <td>2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>9041</td>\n",
" <td>2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>10041</td>\n",
" <td>一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence\n",
"0 9259 2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》\n",
"1 9136 2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先\n",
"2 220 2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》\n",
"3 9041 2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司...\n",
"4 10041 一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收..."
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"test_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们选取一部分样本进行标注,即train_data,该数据由5列组成。id列表示原始样本序号;sentence列为我们截取的一段关键信息;如果关键信息中存在两个实体之间有股权交易关系则tag列为1,否则为0;如果tag为1,则在member1和member2列会记录两个实体出现在sentence中的名称。\n",
"\n",
"剩下的样本没有标注,即test_data,该数据只有id和sentence两列,希望你能训练模型对test_data中的实体进行识别,并判断实体对之间有没有股权交易关系。\n",
"\n",
"### 练习2:\n",
"将每句句子中实体识别出,存入实体词典,并用特殊符号替换语句。\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: Logging before flag parsing goes to stderr.\n",
"W0803 10:03:38.639293 140477413676800 deprecation_wrapper.py:119] From /home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/fool/predictor.py:32: The name tf.gfile.GFile is deprecated. Please use tf.io.gfile.GFile instead.\n",
"\n",
"W0803 10:03:38.641642 140477413676800 deprecation_wrapper.py:119] From /home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/fool/predictor.py:33: The name tf.GraphDef is deprecated. Please use tf.compat.v1.GraphDef instead.\n",
"\n",
"W0803 10:03:38.880297 140477413676800 deprecation_wrapper.py:119] From /home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/fool/predictor.py:53: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" ner\n",
"0 2015年1月26日, ner_1002_ 司与 ner_1001_ 峰先生签署了《附条件生...\n",
"1 2、2016年2月5日, ner_1004_ 司与 ner_1003_ 毅先\n",
"2 2015年10月26日, ner_1006_ 司与 ner_1005_ 华先生签署了附条件生...\n",
"3 2、2015年12月31日, ner_1008_ 司与 ner_1007_ 革签订了《印纪娱...\n",
"4 一、 ner_1010_ 技拟与 ner_1009_ 涛女士签订《股份转让协议》,协议约定:...\n",
"5 同日, ner_1012_ 司与 ner_1011_ 琳先生在上海签署了《股权转让协议》和《...\n",
"6 截至本公告日, ner_1014_ 林持有 ner_1013_ 司股份354,418,300...\n",
"7 本次交易完成后,上市公司将由传统的医药制造业转变成为“企业互联网服务业务为主导,制造业务为支...\n",
"8 2015年1月20日, ner_1018_ 司与 ner_1017_ 飞先生签署《万鸿集团股...\n",
"9 一、(一) ner_1020_ 司(以下简称“公司”)拟以非公开发行方式向 ner_1019...\n",
"10 2、 ner_1022_ 司于2014年12月12日与 ner_1021_ 睿先生签订了《成...\n",
"11 于2015年4月24日, ner_1024_ 司与鲜言先生签订了股权转让协议,鲜言先生按注册...\n",
"12 ner_1026_ 司于2015年11月26日与 ner_1025_ 华先\n",
"13 2015年6月17日, ner_1028_ 峰先生、 ner_1027_ 份高管资管计划分别...\n",
"14 一、 ner_1002_ 司拟向包括 ner_1001_ 峰先生在内的不超过10名特定对象非...\n",
"15 截止2016年12月31日, ner_1018_ 司已向 ner_1017_ 飞归还上述欠款\n",
"16 若公司A股股票在定价基准日至发行日期间发生派发股利、送红股、转增股本、增发新股或配股等除权、...\n",
"17 2015年6月28日, ner_1032_ 司在福建省厦门市与 ner_1031_ 斌先生签...\n",
"18 ner_1013_ 司控股股东、实际控制人 ner_1014_ 林与非关联方分别以自有资金...\n",
"19 2015年4月2日, ner_1034_ 司与 ner_1033_ 峰签署了附条件生效的《关...\n",
"20 一、(一) ner_1037_ 司(以下简称“公司”)拟与公司控股股东和实际控制人 ner_...\n",
"21 在本次非公开发行事项中, ner_1039_ 司总计向5名特定对象非公开发行股票,发行对象包...\n",
"22 一、本次交易方案概述本次交易中, ner_1042_ 份拟以发行股份及支付现金的方式购买 n...\n",
"23 2、 ner_1047_ 司(以下简称“公司”或“ ner_1044_ 技”)计划受让 ne...\n",
"24 ner_1048_ 司本次总计向五名特定对象非公开发行股票,发行对象为 ner_1049_...\n",
"25 2015年6月15日, ner_1055_ 流先生和 ner_1054_ 资分别与公司签署附...\n",
"26 ner_1026_ 司控股股东及实际控制人 ner_1025_ 华先生拟认购不低于本次非公...\n",
"27 一、(一)本次关联交易基本情况 ner_1057_ 良先生为 ner_1056_ 司控股股东...\n",
"28 一、1、 ner_1059_ 司控股股东及实际控制人 ner_1058_ 海以不低于人民币3...\n",
"29 一、(一)关联交易基本情况 ner_1061_ 司(以下简称“公司”)拟向 ner_1060...\n",
".. ...\n",
"389 股票代码:600400 股票简称: ner_1604_ 份 编号:临 2015-054 n...\n",
"390 经 ner_1606_ 司评估,并经 ner_1605_ 司备案,该煤灰池的账面价值为886...\n",
"391 10、2015 年 8 月 24 日,公司使用 10,000 万元人民币购买 ner_160...\n",
"392 3、<附生效条件的股份认购合同>的主要内容2015 年 11 月 18 日,公司与本次非公开...\n",
"393 1因 ner_1269_ 董事系北京缘竟尽⑸虾缘竟尽⒈本缘揽萍脊 ner_1537_ 司的法...\n",
"394 二、 ner_1611_ 厂项目2014年12月底, ner_1611_ 厂转为公用电厂项目...\n",
"395 公司独立董事发表了独立意见,认为: ner_1613_ 司与青海省电力设计院共同组建项目公司...\n",
"396 证券代码:600533 证券简称:栖霞建设 编号:临 2015-059 ner_1614_...\n",
"397 3、本公司与 ner_1534_ 化、 ner_1615_ 君于 2015 年 8 月 25...\n",
"398 重要内容提示●被担保人:控股子公司---- ner_1616_ 司●本次担保金额及已实际为其...\n",
"399 12 / 14 七、历史关联交易(日常关联交易除外)情况1、本次交易前 12 个月内,公司与...\n",
"400 ner_1618_ 司(“公司”)全资拥有的 ner_1617_ 司2号350兆瓦燃煤发电...\n",
"401 二、审议通过了<关于控股子公司 ner_1620_ 司与 ner_1619_ 司签订供热合作...\n",
"402 转让方: ner_1622_ 司 企业类型:有限责任公司(自然人投资或控股) 企业住所:郑州...\n",
"403 证券代码:600108 证券简称: ner_1624_ 团 公告编号:2015-068 n...\n",
"404 会议审议并通过了以下议案,形成如下决议:审议并通过了< ner_1385_ 司关于向 ner...\n",
"405 2014年,公司收购 ner_1626_ 司100%股权, ner_1247_ 司于2014...\n",
"406 申请材料显示,报告期内 ner_1165_ 流、 ner_1164_ 务董事、高级管理人员存...\n",
"407 公司使用暂时闲置募集资金 6,000 万元购买了 ner_1628_ 司 ner_1627_...\n",
"408 二、交易各方当事人情况介绍(一)北京工投基本情况公司名称: ner_1630_ 司住所:北京...\n",
"409 (依法需经批准的项目经相关部门批准后方可开展经营活动)经 ner_1632_ 所审计,201...\n",
"410 ner_1634_ 司吸收合并 ner_1633_ 司及发行股份购买资产并募集配套资金 暨...\n",
"411 回复:(一) 核查情况:1、请你公司结合行业情况、未来经营战略、盈利模式等补充披露客户集中 ...\n",
"412 三、 受让标的基本情况企业名称: ner_1637_ 司 企业类型:有限责任公司(法人独资)...\n",
"413 本次股权转让前,公司持有 ner_1638_ 险 18%的股权;本次股权转让完成后,公 司将...\n",
"414 近日,该子公司已完成工商注册登记手续,并领取了南京市工商行政管理局颁发的<企业法人营业执照>...\n",
"415 (二)本次交易构成关联交易正元投资拟认购金额不低于 13 亿元且不低于本次配套融资总额的 2...\n",
"416 证券代码:600225 证券简称: ner_1642_ 公告编号:临 2015-118 ...\n",
"417 2015年3月31日, ner_1644_ 司与 ner_1643_ 司签署了附条件生效的《...\n",
"418 三、本公司不会利用对 ner_1068_ 份控制关系损害 ner_1068_ 份及其他股东 ...\n",
"\n",
"[419 rows x 1 columns]\n"
]
}
],
"source": [
"# 处理test数据,利用开源工具进行实体识别和并使用实体统一函数存储实体\n",
"\n",
"import fool\n",
"import pandas as pd\n",
"from copy import copy\n",
"\n",
"\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"test_data['ner'] = None\n",
"ner_id = 1001\n",
"ner_dict_new = {} # 存储所有实体\n",
"ner_dict_reverse_new = {} # 存储所有实体\n",
"set_company = set()\n",
"\n",
"for i in range(len(test_data)):\n",
" sentence = copy(test_data.iloc[i, 1])\n",
" # TODO:调用fool进行实体识别,得到words和ners结果\n",
" # TODO ...\n",
" words, ners = fool.analysis([sentence])\n",
" \n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='company' :\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
" company_main_name = main_extract(ner_name,stop_word,d_4_delete,d_city_province)\n",
" company_main_name = ''.join(company_main_name)\n",
" if company_main_name not in ner_dict_new:\n",
" ner_dict_new[company_main_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[company_main_name]] = company_main_name\n",
" ner_id += 1\n",
" set_company.add(ner_id)\n",
" \n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[company_main_name]) + '_ ' + sentence[end-1:]\n",
" elif ner_type=='person':\n",
" if ner_name not in ner_dict_new:\n",
" ner_dict_new[ner_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[ner_name]] = ner_name\n",
" ner_id += 1\n",
" \n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[ner_name]) + '_ ' + sentence[end-1:]\n",
" test_data.iloc[i, -1] = sentence\n",
"\n",
"X_test = test_data[['ner']]\n",
"print(X_test)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" id sentence tag \\\n",
"0 6461 与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市... 0 \n",
"1 2111 三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无... 0 \n",
"2 9603 2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515... 1 \n",
"3 3456 证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限... 0 \n",
"4 8844 本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数... 1 \n",
"5 8722 二、被担保人基本情况被担保人:上海同济建设有限公司 住所:上海市杨浦区中山北二路 1121 ... 0 \n",
"6 9200 2014年12月12日,绵阳市国资委出具了<关于同意转让绵阳国虹通讯数码集团有限责任公司股权... 0 \n",
"7 3723 特变电工股份有限公司 2015 年第十二次临时董事会会议 证券代码:600089 证券简称:... 0 \n",
"8 3964 变更 完成后,本公司持有翔通动漫 100%的股权,翔通动漫已成为公司全资子公司。 0 \n",
"9 9547 根据上市公司与浦发银行达成的并购贷款意向函,浦发银行合肥分行愿意提供不高于50%交易金额的并... 0 \n",
"10 3177 特此公告广东四通集团股份有限公司董事会 2015 年 11 月 8 日备查文件<广东四通集团... 0 \n",
"11 7137 证券代码:600348 股票简称:阳泉煤业 编号:临 2015-056阳泉煤业(集团)股份有... 0 \n",
"12 5169 附件:上海申达股份有限公司董事会 2015 年 11 月 17 日1、 上海申达股份有限公司... 0 \n",
"13 4728 根据以上评估结果,经交易各方协商确定本次天安财险 26.96%股权交易价 格为 6,907,... 0 \n",
"14 1810 资产出售和资产购买方案简要介绍如 下:(一)资产出售公司拟向控股股东金诚实业出售双鹿实业 1... 0 \n",
"15 9598 根据京东方集团实际投资额,在2012年6月11日和2013年8月12日,内蒙古自治区人民政府... 0 \n",
"16 4788 五、本公司保证将依照西水股份章程参加股东大会,平等地行使相 应权利,承担相应义务,不利用控股... 0 \n",
"17 3104 2015 年 6 月 25 日,公司以人民币 8,000 万元闲置募集资金购买了广发银行 广... 0 \n",
"18 852 会议应参与表决董事9人,实际 表决9人,独立董事何红渠先生因公出差委托独立董事刘曙萍女士代为... 0 \n",
"19 9483 二、关联方介绍(一)关联方关系介绍根据<上海证券交易所股票上市规则>和<香港联合交易所有限公... 0 \n",
"20 9894 第五届董事会第十九次会议决议审议通过了《关于退出上海高特佳懿康投资合伙企业(有限合伙)暨关联... 1 \n",
"21 1784 公司将与浙江南浔 农村商业银行股份有限公司和孚支行及时分析和跟踪理财产品的进展情况,加强 风... 0 \n",
"22 4868 经评估,截至 2015 年 5 月 31 日,天安财险32经审计的归属母公司股东权益合计为 ... 0 \n",
"23 7 本年度上海大西洋收购天津大西洋焊接材料有限公司将其所持天津大西洋销售44%股权,支付对价8,... 1 \n",
"24 3205 变更后,中天科技持有中天宽 带 100%股权。 0 \n",
"25 8504 2、2014年11月7日公司与平安银行股份有限公司签订平安银行对公结构 性存款产品合约;资金... 0 \n",
"26 1885 13(本页无正文,为<延边石岘白麓纸业股份有限公司重大资产出售和重大资产 购买暨关联交易实施... 0 \n",
"27 8394 经合肥市工商行政管理局核准,公司全资子公司“安徽继远电网技术有限责 任公司”更名为“安徽南瑞... 0 \n",
"28 9336 四、对外投资合作合同的主要内容甲方:泉州盛翔投资管理中心(有限合伙)乙方:泉州泉晟投资有限公... 0 \n",
"29 3633 股票代码:601877 股票简称:正泰电器 编号:临 2015-068 债券代码:12208... 0 \n",
".. ... ... ... \n",
"820 8750 五、参与天堂硅谷增资扩股对公司影响天堂硅谷自成立以来,业务和资产规模快速发展,经济效益稳步提升。 0 \n",
"821 9593 五、包括贵州盘江精股份有限公司在内,被提名人兼任独立董事的境内上市公司数量未超过五家,被提名... 0 \n",
"822 6460 (二)预计增加关联交易的基本情况 类别 关联人 原预计金额 (万元) 增加预计额 (万元) ... 0 \n",
"823 1238 新疆天业股份有限公司(以下简称“公司”)收到中国证券监督管理委员会(以下 简称“中国证监会”... 0 \n",
"824 296 二、交易对方情况介绍11、公司名称:甘肃亚盛薯业有限责任公司 2、企业性质:有限责任公司 3... 0 \n",
"825 2572 公司于 2014 年 1 月 7 日与交通银行股份有限公司江苏省分行签订协议,使用 暂时闲置... 0 \n",
"826 6280 证券代码:601028 证券简称:玉龙股份 公告编号:2015-055 江苏玉龙钢管股份有限... 0 \n",
"827 236 郴州市政府旗下的郴州城投公司,是 国家开发银行湖南分行的信贷客户,在银行存在着良好的信用,符... 0 \n",
"828 3122 证券代码:603222 证券简称:济民制药 公告编号:2015-051 浙江济民制药股份有限... 0 \n",
"829 4343 ? 本次担保是否有反担保:无 ? 对外担保逾期的累计数量:零一、担保情况概述公司全资子公司保... 0 \n",
"830 8969 浙江苏泊尔股份有限公司向苏泊尔集团有限公司购买位于浙江省玉环县大麦屿街道南尤工业区部分地块,... 1 \n",
"831 2935 重要内容提示:委托理财受托方:上海浦东发展银行股份有限公司 委托理财金额: 2,000万元人... 0 \n",
"832 679 重要提示?关联交易标的名称: 钢铁产品? 关联交易金额: 2015 年销售金额预计人民币 5... 0 \n",
"833 6982 证券代码:600237 证券简称:铜峰电子 编号:临 2015-054 安徽铜峰电子股份有限... 0 \n",
"834 2808 重庆渝电工程监理咨询有限公司,成立于1998年6月,法定代表人赵 久云,工商注册号为5009... 0 \n",
"835 7122 17、公司购买理财产品名称:农业银行“汇利丰”对公定制人民币理财产品; 购买金额:人民币2亿... 0 \n",
"836 6508 (21)刘雯婧刘雯婧,女,国籍中国,身份证号 42010619880315****,住所为武... 0 \n",
"837 3221 三、关联交易标的基本情况(一)交易标的:与关联方北京缘竟尽⑸虾缘竟尽⒈本缘揽萍脊 司和缘咀什... 0 \n",
"838 95 2015年11月9日,江中药业股份有限公司将所持有的江西九州通51%股权在江西省产权交易所公... 1 \n",
"839 9340 采用成本法(资产基础法)对深圳金桔莱(母公司)全部股东权益价值进行评估,评估价值为125,1... 0 \n",
"840 942 2、平安大华基金管理有限公司(1)基本情况企业类型:有限责任公司(中外合资) 住所:深圳市福... 0 \n",
"841 866 华景公司另一股东嘉兴华泰不进行 增资,并同意我公司增资,其他权利义务不变。 0 \n",
"842 4908 如果天安财险 未能适应业务变化并及时调整风险管理政策及程序,则可能会对天安财险的业 务、经营... 0 \n",
"843 3210 变更后,中天科技持有中天合金 100%股权。 0 \n",
"844 3552 评估机构:广东中广信资产评估会计师事务所 评估基准日:2015 年 8 月 31 日 评估方... 0 \n",
"845 1225 请 你公司结合天伟化工的经营变化状况、上述增资价格与本次交易作价的差异,进一步补 充披露天伟... 0 \n",
"846 2970 公司使用暂时闲置募集资金6,483万元购买了中国农业银行股 份有限公司沈阳南湖支行“本利丰・... 0 \n",
"847 7961 (二) 本次重组尚需履行的决策程序18 本次交易尚需履行的决策和审批程序包括但不限于:1、本... 0 \n",
"848 1033 2015 年 5 月 6 日,公司以人民币 3,000 万元闲置募集资金购买了广发银行 广州... 0 \n",
"849 9282 一、:1、关联交易的基本情况广州毅昌科技股份有限公司(以下简称“公司”)拟以4617030元... 1 \n",
"\n",
" member1 member2 \\\n",
"0 0 0 \n",
"1 0 0 \n",
"2 协鑫集成科技股份有限公司 瑞峰(张家港)光伏科技有限公司 \n",
"3 0 0 \n",
"4 广发证券股份有限公司 辽宁成大股份有限公司 \n",
"5 0 0 \n",
"6 0 0 \n",
"7 0 0 \n",
"8 0 0 \n",
"9 0 0 \n",
"10 0 0 \n",
"11 0 0 \n",
"12 0 0 \n",
"13 0 0 \n",
"14 0 0 \n",
"15 0 0 \n",
"16 0 0 \n",
"17 0 0 \n",
"18 0 0 \n",
"19 0 0 \n",
"20 上海高特佳懿康投资合伙企业(有限合伙) 博雅生物制药集团股份有限公司 \n",
"21 0 0 \n",
"22 0 0 \n",
"23 大西洋 天津大西洋焊接材料有限公司 \n",
"24 0 0 \n",
"25 0 0 \n",
"26 0 0 \n",
"27 0 0 \n",
"28 0 0 \n",
"29 0 0 \n",
".. ... ... \n",
"820 0 0 \n",
"821 0 0 \n",
"822 0 0 \n",
"823 0 0 \n",
"824 0 0 \n",
"825 0 0 \n",
"826 0 0 \n",
"827 0 0 \n",
"828 0 0 \n",
"829 0 0 \n",
"830 浙江苏泊尔股份有限公司 苏泊尔集团有限公司 \n",
"831 0 0 \n",
"832 0 0 \n",
"833 0 0 \n",
"834 0 0 \n",
"835 0 0 \n",
"836 0 0 \n",
"837 0 0 \n",
"838 九州通 江中药业股份有限公司 \n",
"839 0 0 \n",
"840 0 0 \n",
"841 0 0 \n",
"842 0 0 \n",
"843 0 0 \n",
"844 0 0 \n",
"845 0 0 \n",
"846 0 0 \n",
"847 0 0 \n",
"848 0 0 \n",
"849 广州华南新材料创新园有限公司 广州毅昌科技股份有限公司 \n",
"\n",
" ner \n",
"0 与本公司关系:受同一公司控制 2, ner_1646_ 司企业类型: 有限公司注册地址: 富... \n",
"1 三、关联交易标的基本情况 1、交易标的基本情况 公司名称: ner_1648_ 司地址:无锡... \n",
"2 2016年 ner_1649_ 向 ner_1650_ 支付设备款人民币4,515,770.00元 \n",
"3 证券代码:600777 证券简称: ner_1201_ 公告编号:2015-091 ne... \n",
"4 本集团及 ner_1651_ 持有 ner_1652_ 股票的本期变动系买卖一揽子沪深300... \n",
"5 二、被担保人基本情况被担保人: ner_1654_ 司 住所:上海市杨浦区中山北二路 112... \n",
"6 2014年12月12日,绵阳市国资委出具了<关于同意转让 ner_1656_ 司股权有关事项... \n",
"7 ner_1657_ 司 2015 年第十二次临时董事会会议 证券代码:600089 证券简... \n",
"8 变更 完成后,本公司持有 ner_1659_ 100%的股权, ner_1658_ 漫已成... \n",
"9 根据上市公司与 ner_1661_ 行达成的并购贷款意向函, ner_1660_ 行愿意提供... \n",
"10 特此公告 ner_1128_ 司董事会 2015 年 11 月 8 日备查文件< ner_1... \n",
"11 证券代码:600348 股票简称: ner_1313_ 业 编号:临 2015-056 ne... \n",
"12 附件: ner_1485_ 司董事会 2015 年 11 月 17 日1、 ner_1662... \n",
"13 根据以上评估结果,经交易各方协商确定本次 ner_1166_ 险 26.96%股权交易价 格... \n",
"14 资产出售和资产购买方案简要介绍如 下:(一)资产出售公司拟向控股股东 ner_1663_ 业... \n",
"15 根据 ner_1665_ 团实际投资额,在2012年6月11日和2013年8月12日,内蒙古... \n",
"16 五、本公司保证将依照 ner_1068_ 份章程参加股东大会,平等地行使相 应权利,承担相应... \n",
"17 2015 年 6 月 25 日,公司以人民币 8,000 万元闲置募集资金购买了 ner_1... \n",
"18 会议应参与表决董事9人,实际 表决9人,独立董事 ner_1667_ 渠先生因公出差委托独立... \n",
"19 二、关联方介绍(一)关联方关系介绍根据<上海证券交易所股票上市规则>和 ner_1669_ ... \n",
"20 第五届董事会第十九次会议决议审议通过了《关于退出 ner_1670_ 暨关联交易的议案》, ... \n",
"21 公司将与 ner_1672_ 司和 ner_1100_ 行及时分析和跟踪理财产品的进展情况,... \n",
"22 经评估,截至 2015 年 5 月 31 日, ner_1166_ 险32经审计的归属母公司... \n",
"23 本年度上海 ner_1673_ 收购天津 ner_1673_ 焊接材料有限公司将其所持天津 ... \n",
"24 变更后, ner_1554_ 技持有 ner_1675_ 带 100%股权。 \n",
"25 2、2014年11月7日公司与 ner_1099_ 司签订 ner_1099_ 行对公结构 ... \n",
"26 13(本页无正文,为<延边 ner_1677_ 司重大资产出售和重大资产 购买暨关联交易实施... \n",
"27 经合肥市工商行政管理局核准,公司全资子公司“ ner_1679_ 司”更名为“ ner_16... \n",
"28 四、对外投资合作合同的主要内容甲方: ner_1681_ 心(有限合伙)乙方: ner_16... \n",
"29 股票代码:601877 股票简称: ner_1683_ 器 编号:临 2015-068 债券... \n",
".. ... \n",
"820 五、参与 ner_1223_ 谷增资扩股对公司影响 ner_1223_ 谷自成立以来,业务和... \n",
"821 五、包括 ner_2553_ 司在内,被提名人兼任独立董事的境内上市公司数量未超过五家,被提... \n",
"822 (二)预计增加关联交易的基本情况 类别 关联人 原预计金额 (万元) 增加预计额 (万元) ... \n",
"823 ner_1826_ 司(以下简称“公司”)收到中国证券监督管理委员会(以下 简称“中国证监... \n",
"824 二、交易对方情况介绍11、公司名称: ner_2557_ 司 2、企业性质:有限责任公司 3... \n",
"825 公司于 2014 年 1 月 7 日与 ner_1577_ 司 ner_2177_ 行签订协... \n",
"826 证券代码:601028 证券简称: ner_2559_ 份 公告编号:2015-055 n... \n",
"827 郴州市政府旗下的 ner_1816_ 司,是 ner_2560_ 行的信贷客户,在银行存在着... \n",
"828 证券代码:603222 证券简称: ner_2561_ 公告编号:2015-051 ne... \n",
"829 ? 本次担保是否有反担保:无 ? 对外担保逾期的累计数量:零一、担保情况概述公司全资子公司 ... \n",
"830 ner_2563_ 向 ner_2564_ 购买位于浙江省玉环县大麦屿街道南尤工业区部分地... \n",
"831 重要内容提示:委托理财受托方: ner_2086_ 司 委托理财金额: 2,000万元人民币... \n",
"832 重要提示?关联交易标的名称: 钢铁产品? 关联交易金额: 2015 年销售金额预计人民币 5... \n",
"833 证券代码:600237 证券简称: ner_2567_ 子 编号:临 2015-054 n... \n",
"834 ner_1954_ 司,成立于1998年6月,法定代表人 ner_2568_ 云,工商注册... \n",
"835 17、公司购买理财产品名称: ner_1422_ 行“ ner_1421_ 丰”对公定制人民... \n",
"836 (21) ner_2569_ 婧 ner_2569_ 婧,女,国籍中国,身份证号 42010... \n",
"837 三、关联交易标的基本情况(一)交易标的:与关联方北京缘竟尽⑸虾缘竟尽⒈本缘揽 ner_178... \n",
"838 2015年11月9日, ner_2572_ 将所持有的江西 ner_2571_ 51%股权在... \n",
"839 采用成本法(资产基础法)对 ner_2574_ 司)全部股东权益价值进行评估,评估价值为12... \n",
"840 2、 ner_2576_ 司(1)基本情况企业类型:有限责任公司(中外合资) 住所:深圳市福... \n",
"841 ner_2578_ 司另一股东 ner_2577_ 泰不进行 增资,并同意我公司增资,其他... \n",
"842 如果 ner_1166_ 险 未能适应业务变化并及时调整风险管理政策及程序,则可能会对 ne... \n",
"843 变更后, ner_1554_ 技持有 ner_2579_ 100%股权。 \n",
"844 评估机构: ner_2580_ 所 评估基准日:2015 年 8 月 31 日 评估方法:资... \n",
"845 请 你公司结合 ner_1322_ 工的经营变化状况、上述增资价格与本次交易作价的差异,进一... \n",
"846 公司使用暂时闲置募集资金6,483万元购买了 ner_2582_ 司 ner_2581_ 行... \n",
"847 (二) 本次重组尚需履行的决策程序18 本次交易尚需履行的决策和审批程序包括但不限于:1、本... \n",
"848 2015 年 5 月 6 日,公司以人民币 3,000 万元闲置募集资金购买了 ner_10... \n",
"849 一、:1、关联交易的基本情况 ner_2584_ (以下简称“公司”)拟以4617030元人... \n",
"\n",
"[850 rows x 6 columns]\n"
]
}
],
"source": [
"# 处理train数据,利用开源工具进行实体识别和并使用实体统一函数存储实体\n",
"train_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'gb2312', header=0)\n",
"train_data['ner'] = None\n",
"\n",
"for i in range(len(train_data)):\n",
" # 判断正负样本\n",
" if train_data.iloc[i,:]['member1']=='0' and train_data.iloc[i,:]['member2']=='0':\n",
" sentence = copy(train_data.iloc[i, 1])\n",
" # TODO:调用fool进行实体识别,得到words和ners结果\n",
" # TODO ...\n",
" \n",
" words, ners = fool.analysis([sentence])\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='company' :\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
" company_main_name = main_extract(ner_name,stop_word,d_4_delete,d_city_province)\n",
" company_main_name = ''.join(company_main_name)\n",
" if company_main_name not in ner_dict_new:\n",
" ner_dict_new[company_main_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[company_main_name]] = company_main_name\n",
" ner_id += 1\n",
" set_company.add(ner_id)\n",
"\n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[company_main_name]) + '_ ' + sentence[end-1:]\n",
"\n",
" elif ner_type=='person':\n",
" if ner_name not in ner_dict_new:\n",
" ner_dict_new[ner_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[ner_name]] = ner_name\n",
" ner_id += 1\n",
"\n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[ner_name]) + '_ ' + sentence[end-1:]\n",
" train_data.iloc[i, -1] = sentence\n",
" else:\n",
" # 将训练集中正样本已经标注的实体也使用编码替换\n",
" sentence = copy(train_data.iloc[i,:]['sentence'])\n",
" for company_main_name in [train_data.iloc[i,:]['member1'],train_data.iloc[i,:]['member2']]:\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
" company_main_name = ''.join(company_main_name)\n",
" if company_main_name not in ner_dict_new:\n",
" ner_dict_new[company_main_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[company_main_name]] = company_main_name\n",
" ner_id += 1\n",
" set_company.add(ner_id)\n",
"\n",
"\n",
" # 在句子中用编号替换实体名\n",
" sentence = re.sub(company_main_name, ' ner_%s_ '%(str(ner_dict_new[company_main_name])), sentence)\n",
" train_data.iloc[i, -1] = sentence\n",
"print(train_data) \n",
"y = train_data.loc[:,['tag']]\n",
"train_num = len(train_data)\n",
"X_train = train_data[['ner']]\n",
"\n",
"# 将train和test放在一起提取特征\n",
"X = pd.concat([X_train, X_test])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 3:关系抽取\n",
"\n",
"\n",
"目标:借助句法分析工具,和实体识别的结果,以及文本特征,基于训练数据抽取关系,并存储进图数据库。\n",
"\n",
"本次要求抽取股权交易关系,关系为无向边,不要求判断投资方和被投资方,只要求得到双方是否存在交易关系。\n",
"\n",
"模板建立可以使用“正则表达式”、“实体间距离”、“实体上下文”、“依存句法”等。\n",
"\n",
"答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"- info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(实体统一的多个实体名用“|”分隔)\n",
"- info_extract_submit.csv格式为:第一列是关系中实体1的编号,第二列为关系中实体2的编号。\n",
"\n",
"示例:\n",
"- info_extract_entity.csv\n",
"\n",
"| 实体编号 | 实体名 |\n",
"| ------ | ------ |\n",
"| 1001 | 小王 |\n",
"| 1002 | A化工厂 |\n",
"\n",
"- info_extract_submit.csv\n",
"\n",
"| 实体1 | 实体2 |\n",
"| ------ | ------ |\n",
"| 1001 | 1003 |\n",
"| 1002 | 1001 |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习3:提取文本tf-idf特征\n",
"\n",
"去除停用词,并转换成tfidf向量。"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['公司 受 同一 公司 控制 2 司 企业 类型 有限公司 注册 地址 富阳市 东洲 街道 东洲 工业 功能 区九号路 1 号 法定 代表人 明 注册 资本 16 000万 元 经营 许可 经营 制造 高效 节能 感应 电机 ; 普通 货运', '三 关联 交易 标的 1 交易 标的 公司 名称 司 地址 无锡市 锡山区 东港镇 锡港东路 2 号 企业 类型 责任 公司 法定 代表人 燕 注册 资本 50000万 元 整 财务 公司 公司 参股 公司 成立 2008年 11月 经营 成员 单位 财务 融资 顾问 信用 鉴证 咨询 代理 业务 ; 成员 单位 交易 款项 收付 ; 批准 保险 代理 业务 ; 成员 单位 担保 ; 成员 单位 委托 贷款 委托 投资 ; 成员 单位 票据 承兑 贴现 ; 成员 单位 转账 结算 结算 清算 方案 设计 ; 吸收 成员 单位 存款 ; 成员 单位 贷款 融资 租赁 ; 同业 拆借 ; 承销 成员 单位 企业 债券 ; 金融 机构 股权 投资 ; 有价证券 投资 股票 二级 市场 投资 除外 ; 成员 单位 产品 买方 信贷', '2016年 支付 设备 款 人民币 4 515 770.00 元', '证券 代码 600777 证券 简称 公告 编号 2015-091 司 第八 届 监事会 第十一 次 会议 决议 公告 公司 监事会 全体 监事 公告 不 虚假 记载 误导性 陈述 遗漏 真实性 准确性 完整性 承担 个别 连带 责任', '集团 持有 股票 本期 变动 系 买卖 一揽子 沪 深 300 指数 成份股 致']\n",
" (0, 4103)\t0.2114565894485973\n",
" (0, 3022)\t0.1567445046668198\n",
" (0, 3469)\t0.20447702741373694\n",
" (0, 2712)\t0.22045480991774755\n",
" (0, 3894)\t0.2114565894485973\n",
" (0, 4498)\t0.22045480991774755\n",
" (0, 1855)\t0.16809558961226798\n",
" (0, 4023)\t0.15290970636043075\n",
" (0, 3754)\t0.19454004856814155\n",
" (0, 5)\t0.11077546570621795\n",
" (0, 235)\t0.16111602757740762\n",
" (0, 4136)\t0.10354667247447477\n",
" (0, 1542)\t0.11205231032692424\n",
" (0, 3241)\t0.11407096876121413\n",
" (0, 1920)\t0.22045480991774755\n",
" (0, 1880)\t0.22045480991774755\n",
" (0, 2525)\t0.17459020627859542\n",
" (0, 3953)\t0.18609203055056847\n",
" (0, 1382)\t0.4409096198354951\n",
" (0, 2470)\t0.22045480991774755\n",
" (0, 2246)\t0.1294748204889748\n",
" (0, 3248)\t0.20562135469497786\n",
" (0, 3052)\t0.13645438252383515\n",
" (0, 3705)\t0.11585878961850787\n",
" (0, 1557)\t0.11407096876121413\n",
" :\t:\n",
" (3, 1773)\t0.1524667506120705\n",
" (3, 1576)\t0.1316661833337407\n",
" (3, 3657)\t0.24603105663498262\n",
" (3, 3498)\t0.45619536537824595\n",
" (3, 3653)\t0.20244151361851392\n",
" (3, 111)\t0.2957368225980327\n",
" (3, 333)\t0.11526242758557653\n",
" (3, 3784)\t0.12716965106831488\n",
" (3, 1713)\t0.3432944013645088\n",
" (3, 3688)\t0.1074725684540511\n",
" (3, 861)\t0.26823488296435966\n",
" (3, 1540)\t0.12745407459398825\n",
" (3, 4032)\t0.2427573010643158\n",
" (3, 4091)\t0.11282000048679083\n",
" (3, 1711)\t0.059273701771436815\n",
" (4, 2718)\t0.3806528037580807\n",
" (4, 2846)\t0.3349928861087956\n",
" (4, 481)\t0.34914329741412814\n",
" (4, 1307)\t0.3806528037580807\n",
" (4, 1449)\t0.35782284493343813\n",
" (4, 2060)\t0.2959648137169803\n",
" (4, 3076)\t0.3349928861087956\n",
" (4, 2836)\t0.20790422248622678\n",
" (4, 4396)\t0.27313485489233774\n",
" (4, 3843)\t0.17437374334046382\n",
"<PandasArray>\n",
"['与本公司关系:受同一公司控制 2, ner_1646_ 司企业类型: 有限公司注册地址: 富阳市东洲街道东洲工业功能区九号路 1 号 法定代表人: ner_1645_ 明注册资本: ?16,000 万元经营范围: 许可经营项目:制造高效节能感应电机;普通货运。', '三、关联交易标的基本情况 1、交易标的基本情况 公司名称: ner_1648_ 司地址:无锡市锡山区东港镇锡港东路 2 号 企业类型:有限责任公司 法定代表人: ner_1647_ 燕注册资本:50000 万元整财务公司是公司参股公司,成立于 2008 年 11 月,经营范围为:对成员单位 办理财务和融资顾问、信用鉴证及相关的咨询、代理业务;协助成员单位实现交 易款项的收付;经批准的保险代理业务;对成员单位提供担保;办理成员单位之 间的委托贷款及委托投资;对成员单位办理票据承兑与贴现;办理成员单位之间 的内部转账结算及相应的结算、清算方案设计;吸收成员单位的存款;对成员单 位办理贷款及融资租赁;从事同业拆借;承销成员单位的企业债券;对金融机构 的股权投资;有价证券投资(股票二级市场投资除外);成员单位产品的买方信 贷。']\n",
"Length: 2, dtype: object\n"
]
}
],
"source": [
"# code\n",
"from sklearn.feature_extraction.text import TfidfTransformer \n",
"from sklearn.feature_extraction.text import CountVectorizer \n",
"from pyltp import Segmentor\n",
"import os\n",
"\n",
"\n",
"# 实体符号加入分词词典\n",
"# with open('../data/user_dict.txt', 'w') as fw:\n",
"# for v in ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']:\n",
"# fw.write( v + '号企业 ni\\n')\n",
"\n",
"with open('../data/user_dict.txt', 'w',encoding='utf-8') as fw:\n",
" for v in ner_dict_new.values():\n",
" fw.write('ner{}\\n'.format(str(v)))\n",
"\n",
"LTP_DATA_DIR = '/home/xiayulong/work/pyltp.d/models/ltp_data_v3.4.0' # ltp模型目录的路径\n",
"cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为`cws.model`\n",
" \n",
"# 初始化实例\n",
"segmentor = Segmentor() \n",
"# 加载模型,加载自定义词典\n",
"segmentor.load_with_lexicon(cws_model_path, '../data/user_dict.txt') \n",
"\n",
"# 加载停用词\n",
"fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
"stop_word = fr.readlines()\n",
"stop_word = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
"\n",
"# 分词\n",
"# f = lambda x: ' '.join([word for word in segmentor.segment(x) if word not in stop_word and not re.findall(r'ner\\_\\d\\d\\d\\d\\_', word)])\n",
"# print(X['ner'].array[0])\n",
"# print([word for word in segmentor.segment('ner1001是个公司')])\n",
"# corpus=X['ner'].map(f).tolist()\n",
"\n",
"corpus = []\n",
"for sen in X['ner'].array:\n",
" for replace in re.findall(r'ner\\_\\d\\d\\d\\d\\_', sen):\n",
" sen = re.sub(replace,replace.replace('_',''),sen)\n",
" tmp = ' '.join([word for word in segmentor.segment(sen) if word not in stop_word and not re.findall(r'ner\\d\\d\\d\\d', word)])\n",
" corpus.append(tmp)\n",
"\n",
"\n",
"\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"# TODO:提取tfidf特征\n",
"# TODO ...\n",
"tfidf = TfidfVectorizer()\n",
"vec = tfidf.fit_transform(corpus)\n",
"print(corpus[:5])\n",
"print(vec[:5])\n",
"print(X['ner'].array[:2])\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习4:提取句法特征\n",
"除了词语层面的句向量特征,我们还可以从句法入手,提取一些句法分析的特征。\n",
"\n",
"参考特征:\n",
"\n",
"1、企业实体间距离\n",
"\n",
"2、企业实体间句法距离\n",
"\n",
"3、企业实体分别和关键触发词的距离\n",
"\n",
"4、实体的依存关系类别"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"与本公司关系:受同一公司控制 2, ner_1646_ 司企业类型: 有限公司注册地址: 富阳市东洲街道东洲工业功能区九号路 1 号 法定代表人: ner_1645_ 明注册资本: ?16,000 万元经营范围: 许可经营项目:制造高效节能感应电机;普通货运。\n",
"[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0]\n",
"(1269, 4522)\n"
]
}
],
"source": [
"# -*- coding: utf-8 -*-\n",
"from pyltp import Parser\n",
"from pyltp import Segmentor\n",
"from pyltp import Postagger\n",
"import networkx as nx\n",
"import numpy as np\n",
"import pylab\n",
"import re\n",
"import os\n",
"\n",
"LTP_DATA_DIR = '/home/xiayulong/work/pyltp.d/models/ltp_data_v3.4.0' # ltp模型目录的路径\n",
"cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为`cws.model`\n",
"pos_path = os.path.join(LTP_DATA_DIR, 'pos.model')\n",
"\n",
"\n",
"postagger = Postagger() # 初始化实例\n",
"postagger.load_with_lexicon(pos_path, '../data/user_dict.txt') # 加载模型\n",
"segmentor = Segmentor() # 初始化实例\n",
"segmentor.load_with_lexicon(cws_model_path, '../data/user_dict.txt') # 加载模型\n",
"parser = Parser() # 初始化实例\n",
"parser.load(os.path.join(LTP_DATA_DIR, 'parser.model')) # 加载模型\n",
"\n",
"\n",
"\n",
"# 以实体对为中心,提取特征是否会更好?\n",
"# 因为每句话中的实体数量不确定,有关系的实体数量更是不确定。以实体对为中心,可以明确观察这对实体在句法依存树中的关系,以及从实体1到实体2的路径\n",
"# 上是否有关键词,例如这里的\"支付\",再辅以某些token级别的特征,例如某个size窗口内的tfidf的特征。这样,一句话可以生成多个样本,目标变成预测每\n",
"# 一对实体所构成的样本的关系\n",
"\n",
"\n",
"relations = [\"SBV\",\n",
" \"VOB\",\n",
" \"IOB\",\n",
" \"FOB\",\n",
" \"DBL\",\n",
" \"ATT\",\n",
" \"ADV\",\n",
" \"CMP\",\n",
" \"COO\",\n",
" \"POB\",\n",
" \"LAD\",\n",
" \"RAD\",\n",
" \"IS\",\n",
" \"HED\"]\n",
"\n",
"\n",
"def parse(s):\n",
" \"\"\"\n",
" 对语句进行句法分析,并返回句法结果\n",
" \"\"\"\n",
" tmp_ner_dict = {}\n",
" num_lst = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']\n",
"\n",
" # 将公司代码替换为特殊称谓,保证分词词性正确\n",
"# for i, ner in enumerate(list(set(re.findall(r'(ner\\_\\d\\d\\d\\d\\_)', s)))):\n",
"# try:\n",
"# tmp_ner_dict[num_lst[i]+'号企业'] = ner\n",
"# except IndexError:\n",
"# # TODO:定义错误情况的输出\n",
"# # TODO ...\n",
" \n",
" \n",
"# s = s.replace(ner, num_lst[i]+'号企业')\n",
" for i, ner in enumerate(list(set(re.findall(r'(ner\\_\\d\\d\\d\\d\\_)', s)))):\n",
" s = re.sub(ner,ner.replace('_',''),s)\n",
" words = segmentor.segment(s)\n",
" tags = postagger.postag(words)\n",
"\n",
" arcs = parser.parse(words, tags) # 句法分析\n",
" arcs_lst = list(map(list, zip(*[[arc.head, arc.relation] for arc in arcs])))\n",
" # 句法分析结果输出\n",
" parse_result = pd.DataFrame([[a,b,c,d] for a,b,c,d in zip(list(words),list(tags), arcs_lst[0], arcs_lst[1])], index = range(1,len(words)+1))\n",
" \n",
"\n",
" # TODO:提取企业实体依存句法类型\n",
" # TODO ...\n",
" # 句子只有两个实体(俩公司或一公司一人名)\n",
" # 找前两个实体间\n",
" dict_of_relation = {relation:0 for relation in relations}\n",
" ners = list()\n",
" for i in list(parse_result.index):\n",
" word = parse_result.loc[i,0]\n",
" relation = parse_result.loc[i,3]\n",
" if re.findall(r'(ner\\d{4})', word):\n",
" if word not in ners:\n",
" ners.append(word)\n",
" ner_id = word[3:]\n",
" if ner_id.isdigit() and int(ner_id) in set_company:\n",
" dict_of_relation[relation] += 1\n",
" \n",
" count_of_relation = list(dict_of_relation.values())\n",
" \n",
" \n",
"\n",
" # 投资关系关键词\n",
" key_words = [\"收购\",\"竞拍\",\"转让\",\"扩张\",\"并购\",\"注资\",\"整合\",\"并入\",\"竞购\",\"竞买\",\"支付\",\"收购价\",\"收购价格\",\"承购\",\"购得\",\"购进\",\n",
" \"购入\",\"买进\",\"买入\",\"赎买\",\"购销\",\"议购\",\"函购\",\"函售\",\"抛售\",\"售卖\",\"销售\",\"转售\"]\n",
" # TODO:*根据关键词和对应句法关系提取特征(如没有思路可以不完成)\n",
" # TODO ...\n",
" # distances[0]: 实体之间距离\n",
" # distances[1]: 实体1和关键词之间距离\n",
" # distances[2]: 实体2和关键词之间距离\n",
" distances = [0,0,0]\n",
" if len(ners) >= 2:\n",
" # 实体1\n",
" entity1 = ners[0]\n",
" # 实体2\n",
" entity2 = ners[1]\n",
" distances[0] = shortest_path(parse_result,entity1,entity2)[0]\n",
" for i in parse_result.index:\n",
" word = parse_result.loc[i,0]\n",
" if word in key_words:\n",
" distances[1] = shortest_path(parse_result,entity1,word)[0]\n",
" distances[2] = shortest_path(parse_result,entity2,word)[0]\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" # parser.release() # 释放模型\n",
" return count_of_relation + distances\n",
"\n",
"\n",
"def get_weight(type):\n",
" return 1.\n",
"\n",
"def print_graph(G):\n",
" for n, nbrs in G.adj.items():\n",
" for nbr, eattr in nbrs.items():\n",
" wt = eattr['weight']\n",
" print(f\"({n}, {nbr}, {wt:.3})\")\n",
"\n",
"\n",
"\n",
"\n",
"def shortest_path(arcs_ret, source, target):\n",
" \"\"\"\n",
" 求出两个词最短依存句法路径,不存在路径返回-1\n",
" arcs_ret:句法分析结果\n",
" source:实体1\n",
" target:实体2\n",
" \"\"\"\n",
" G=nx.DiGraph()\n",
" # 为这个网络添加节点...\n",
" for i in list(arcs_ret.index):\n",
" G.add_node(i)\n",
" # TODO:在网络中添加带权中的边...(注意,我们需要的是无向边)\n",
" # TODO ...\n",
" for cur in list(arcs_ret.index):\n",
" predecessor = arcs_ret.loc[cur,2]\n",
" if predecessor == 0:\n",
" continue\n",
" weight = get_weight(arcs_ret.loc[i,3])\n",
" G.add_edge(predecessor,cur,weight=weight)\n",
" undirected = nx.Graph(G)\n",
" try:\n",
" # TODO:利用nx包中shortest_path_length方法实现最短距离提取\n",
" # TODO ...\n",
" path = nx.shortest_path(undirected,source,target)\n",
" distance = len(path)\n",
" \n",
" return (distance,path)\n",
" except:\n",
" return (-1,None)\n",
"\n",
"\n",
"def get_feature(X,tfidf_vec):\n",
" \"\"\"\n",
" 汇总上述函数汇总句法分析特征与TFIDF特征\n",
" \"\"\"\n",
" # TODO:汇总上述函数汇总句法分析特征与TFIDF特征\n",
" # TODO ...\n",
" syntactic_features = []\n",
" for sentence in X['ner'].array:\n",
" syntactic_features.append(parse(sentence))\n",
" features = np.concatenate([tfidf_vec.toarray(), syntactic_features],axis=1)\n",
" return features\n",
"sen = X['ner'].array[0]\n",
"\n",
"result = parse(sen)\n",
"print(sen)\n",
"print(result)\n",
"print(vec.shape)\n",
"features = get_feature(X,vec)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习5:建立分类器\n",
"\n",
"利用已经提取好的tfidf特征以及parse特征,建立分类器进行分类任务。"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/model_selection/_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.\n",
" warnings.warn(CV_WARNING, FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'mean_fit_time': array([0.03029974, 0.02727429, 0.0401934 , 0.03046942]), 'std_fit_time': array([0.00302083, 0.00220227, 0.00128213, 0.00259774]), 'mean_score_time': array([0.00822973, 0.00249441, 0.00247081, 0.00245563]), 'std_score_time': array([6.69167204e-03, 6.28859855e-05, 1.95409525e-05, 2.45392322e-05]), 'param_C': masked_array(data=[1, 1, 10, 10],\n",
" mask=[False, False, False, False],\n",
" fill_value='?',\n",
" dtype=object), 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2'],\n",
" mask=[False, False, False, False],\n",
" fill_value='?',\n",
" dtype=object), 'params': [{'C': 1, 'penalty': 'l1'}, {'C': 1, 'penalty': 'l2'}, {'C': 10, 'penalty': 'l1'}, {'C': 10, 'penalty': 'l2'}], 'split0_test_score': array([0.89788732, 0.88732394, 0.92605634, 0.92253521]), 'split1_test_score': array([0.93309859, 0.92957746, 0.94014085, 0.95774648]), 'split2_test_score': array([0.90070922, 0.92198582, 0.96099291, 0.94326241]), 'mean_test_score': array([0.91058824, 0.91294118, 0.94235294, 0.94117647]), 'std_test_score': array([0.01598684, 0.01840855, 0.01434018, 0.0144667 ]), 'rank_test_score': array([4, 3, 1, 2], dtype=int32)}\n",
"{'C': 10, 'penalty': 'l2'}\n",
"850\n",
"1269 850\n",
"[['2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》'\n",
" '2015年1月26日, ner_1002_ 司与 ner_1001_ 峰先生签署了《附条件生效的股份认购合同》' '李云峰' '氟化工' 1]\n",
" ['2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先'\n",
" '2、2016年2月5日, ner_1004_ 司与 ner_1003_ 毅先' '侯毅' '深圳市新纶科技股份' 0]\n",
" ['2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》'\n",
" '2015年10月26日, ner_1006_ 司与 ner_1005_ 华先生签署了附条件生效条件的《股份认购合同》' '山东华鹏玻璃'\n",
" '张德华' 1]\n",
" ['2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司非公开发行A股股票之附条件生效的股份认购协议》(以下简称“《附条件生效的股份认购协议》”)'\n",
" '2、2015年12月31日, ner_1008_ 司与 ner_1007_ 革签订了《印纪娱乐传媒股份有限公司非公开发行A股股票之附条件生效的股份认购协议》(以下简称“《附条件生效的股份认购协议》”)'\n",
" '印纪娱乐传媒' '肖文革' 1]\n",
" ['一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收购其所持有的金发小贷13.50%的股份(2,700万股),收购金额为2,837.43万元'\n",
" '一、 ner_1010_ 技拟与 ner_1009_ 涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收购其所持有的金发小贷13.50%的股份(2,700万股),收购金额为2,837.43万元'\n",
" '熊海涛' '金发科技' 0]]\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n"
]
}
],
"source": [
"# 建立分类器进行分类\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn import preprocessing\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"# TODO:定义需要遍历的参数\n",
"parameters = { 'penalty':('l1', 'l2'), 'C':[1, 10]}\n",
"\n",
"# TODO:选择模型\n",
"lr = LogisticRegression(random_state=0)\n",
"clf = GridSearchCV(lr, parameters)\n",
"\n",
"# TODO:利用GridSearchCV搜索最佳参数\n",
"clf.fit(features[:train_num], y[:train_num])\n",
"print(clf.cv_results_)\n",
"best_param = clf.cv_results_[\"params\"][clf.cv_results_[\"rank_test_score\"][0]-1]\n",
"print(best_param)\n",
"# print(clf.cv_results_[\"params\"])\n",
"# print(clf.cv_results_[\"rank_test_score\"])\n",
"\n",
"# TODO:对Test_data进行分类\n",
"print(train_num)\n",
"print(len(features),len(y))\n",
"result = clf.predict(features[train_num:])\n",
"result = result.reshape([len(result),1])\n",
"\n",
"\n",
"# TODO:保存Test_data分类结果\n",
"# 答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"# info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(实体统一的多个实体名用“|”分隔)\n",
"# info_extract_submit.csv格式为:第一列是关系中实体1的编号,第二列为关系中实体2的编号。\n",
"sentenceWithNerIdAndMembers = []\n",
"info_extract_entity = dict()\n",
"info_extract_submit = []\n",
"for sentenceWithNerId in X['ner'].array[train_num:]:\n",
" nerids = []\n",
" for i, ner in enumerate(list(set(re.findall(r'(ner\\_\\d\\d\\d\\d\\_)', sentenceWithNerId)))):\n",
" if ner[4:8].isdigit() and int(ner[4:8]) not in nerids:\n",
" nerids.append(int(ner[4:8]))\n",
" info_extract_entity[int(ner[4:8])] = ner_dict_reverse_new[int(ner[4:8])]\n",
" entity1 = \"0\"\n",
" entity2 = \"0\"\n",
" if len(nerids) >= 2:\n",
" entity1 = ner_dict_reverse_new[nerids[0]]\n",
" entity2 = ner_dict_reverse_new[nerids[1]]\n",
" sentenceWithNerIdAndMembers.append([sentenceWithNerId,entity1,entity2])\n",
"\n",
"test_sentences = test_data.values[:,1].reshape([len(test_data),1])\n",
"\n",
"pred_results = np.concatenate([test_sentences,sentenceWithNerIdAndMembers,result],axis=1)\n",
"print(pred_results[:5])\n",
"for i in range(len(pred_results)):\n",
" if int(pred_results[i,-1]) == 1:\n",
" info_extract_submit.append([ner_dict_new[pred_results[i,2]],ner_dict_new[pred_results[i,3]]])\n",
"df_info_extract_entity = pd.DataFrame(list(info_extract_entity.items()),columns=[\"实体编号\",\"实体名\"])\n",
"df_info_extract_submit = pd.DataFrame(info_extract_submit,columns=[\"实体1\",\"实体2\"])\n",
" \n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习6:操作图数据库\n",
"对关系最好的描述就是用图,那这里就需要使用图数据库,目前最常用的图数据库是noe4j,通过cypher语句就可以操作图数据库的增删改查。可以参考“https://cuiqingcai.com/4778.html”。\n",
"\n",
"本次作业我们使用neo4j作为图数据库,neo4j需要java环境,请先配置好环境。\n",
"\n",
"将我们提出的实体关系插入图数据库,并查询某节点的3层投资关系,即三个节点组成的路径(如果有的话)。如果无法找到3层投资关系,请查询出任意指定节点的投资路径。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"from py2neo import Node, Relationship, Graph\n",
"\n",
"graph = Graph(\n",
" \"http://localhost:7474\", \n",
" username=\"neo4j\", \n",
" password=\"person\"\n",
")\n",
"\n",
"for v in relation_list:\n",
" a = Node('Company', name=v[0])\n",
" b = Node('Company', name=v[1])\n",
" \n",
" # 本次不区分投资方和被投资方,无向图\n",
" r = Relationship(a, 'INVEST', b)\n",
" s = a | b | r\n",
" graph.create(s)\n",
" r = Relationship(b, 'INVEST', a)\n",
" s = a | b | r\n",
" graph.create(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# TODO:查询某节点的3层投资关系\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤4:实体消歧\n",
"解决了实体识别和关系的提取,我们已经完成了一大截,但是我们提取的实体究竟对应知识库中哪个实体呢?下图中,光是“苹果”就对应了13个同名实体。\n",
"<img src=\"../image/baike2.png\", width=340, heigth=480>\n",
"\n",
"在这个问题上,实体消歧旨在解决文本中广泛存在的名称歧义问题,将句中识别的实体与知识库中实体进行匹配,解决实体歧义问题。\n",
"\n",
"\n",
"### 练习7:\n",
"匹配test_data.csv中前25条样本中的人物实体对应的百度百科URL(此部分样本中所有人名均可在百度百科中链接到)。\n",
"\n",
"利用scrapy、beautifulsoup、request等python包对百度百科进行爬虫,判断是否具有一词多义的情况,如果有的话,选择最佳实体进行匹配。\n",
"\n",
"使用URL为‘https://baike.baidu.com/item/’+人名 可以访问百度百科该人名的词条,此处需要根据爬取到的网页识别该词条是否对应多个实体,如下图:\n",
"<img src=\"../image/baike1.png\", width=440, heigth=480>\n",
"如果该词条有对应多个实体,请返回正确匹配的实体URL,例如该示例网页中的‘https://baike.baidu.com/item/陆永/20793929’。\n",
"\n",
"- 提交文件:entity_disambiguation_submit.csv\n",
"- 提交格式:第一列为实体id(与info_extract_submit.csv中id保持一致),第二列为对应URL。\n",
"- 示例:\n",
"\n",
"| 实体编号 | URL |\n",
"| ------ | ------ |\n",
"| 1001 | https://baike.baidu.com/item/陆永/20793929 |\n",
"| 1002 | https://baike.baidu.com/item/王芳/567232 |\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import jieba\n",
"import pandas as pd\n",
"\n",
"# 找出test_data.csv中前25条样本所有的人物名称,以及人物所在文档的上下文内容\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"\n",
"# 存储人物以及上下文信息(key为人物ID,value为人物名称、人物上下文内容)\n",
"person_name = {}\n",
"\n",
"# 观察上下文的窗口大小\n",
"window = 10 \n",
"\n",
"# 遍历前25条样本\n",
"for i in range(25):\n",
" sentence = copy(test_data.iloc[i, 1])\n",
" words, ners = fool.analysis(sentence)\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='person':\n",
" # TODO:提取实体的上下文\n",
" \n",
"\n",
"\n",
"\n",
"# 利用爬虫得到每个人物名称对应的URL\n",
"# TODO:找到每个人物实体的词条内容。\n",
"\n",
"# TODO:将样本中人物上下文与爬取词条结果进行对比,选择最接近的词条。\n",
"\n",
"\n",
"\n",
"# 输出结果\n",
"pd.DataFrame(result_data).to_csv('../submit/entity_disambiguation_submit.csv', index=False)\n"
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 利用信息抽取技术搭建知识库\n",
"\n",
"在这个notebook文件中,有些模板代码已经提供给你,但你还需要实现更多的功能来完成这个项目。除非有明确要求,你无须修改任何已给出的代码。以**'【练习】'**开始的标题表示接下来的代码部分中有你需要实现的功能。这些部分都配有详细的指导,需要实现的部分也会在注释中以'TODO'标出。请仔细阅读所有的提示。\n",
"\n",
">**提示:**Code 和 Markdown 区域可通过 **Shift + Enter** 快捷键运行。此外,Markdown可以通过双击进入编辑模式。\n",
"\n",
"---\n",
"\n",
"### 让我们开始吧\n",
"\n",
"本项目的目的是结合命名实体识别、依存语法分析、实体消歧、实体统一对网站开放语料抓取的数据建立小型知识图谱。\n",
"\n",
"在现实世界中,你需要拼凑一系列的模型来完成不同的任务;举个例子,用来预测狗种类的算法会与预测人类的算法不同。在做项目的过程中,你可能会遇到不少失败的预测,因为并不存在完美的算法和模型。你最终提交的不完美的解决方案也一定会给你带来一个有趣的学习经验!\n",
"\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 1:实体统一"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"实体统一做的是对同一实体具有多个名称的情况进行统一,将多种称谓统一到一个实体上,并体现在实体的属性中(可以给实体建立“别称”属性)\n",
"\n",
"例如:对“河北银行股份有限公司”、“河北银行公司”和“河北银行”我们都可以认为是一个实体,我们就可以将通过提取前两个称谓的主要内容,得到“河北银行”这个实体关键信息。\n",
"\n",
"公司名称有其特点,例如后缀可以省略、上市公司的地名可以省略等等。在data/dict目录中提供了几个词典,可供实体统一使用。\n",
"- company_suffix.txt是公司的通用后缀词典\n",
"- company_business_scope.txt是公司经营范围常用词典\n",
"- co_Province_Dim.txt是省份词典\n",
"- co_City_Dim.txt是城市词典\n",
"- stopwords.txt是可供参考的停用词\n",
"\n",
"### 练习1:\n",
"编写main_extract函数,实现对实体的名称提取“主体名称”的功能。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import jieba\n",
"import jieba.posseg as pseg\n",
"import re\n",
"import datetime\n",
"\n",
"\n",
"# 从输入的“公司名”中提取主体\n",
"def main_extract(input_str,stop_word,d_4_delete,d_city_province):\n",
" # 开始分词并处理\n",
" seg = pseg.cut(input_str)\n",
" seg_lst = remove_word(seg,stop_word,d_4_delete)\n",
" seg_lst = city_prov_ahead(seg_lst,d_city_province)\n",
" return [s.word for s in seg_lst]\n",
"\n",
" \n",
"#TODO:实现公司名称中地名提前\n",
"def city_prov_ahead(seg,d_city_province):\n",
" city_prov_lst = []\n",
" seg_lst = []\n",
" set_d_city_province = set(d_city_province)\n",
" # TODO ...\n",
" for s in seg:\n",
" if s.word in set_d_city_province:\n",
" city_prov_lst.append(s)\n",
" else:\n",
" seg_lst.append(s)\n",
" \n",
" return city_prov_lst+seg_lst\n",
"\n",
"\n",
"\n",
"\n",
"#TODO:替换特殊符号\n",
"def remove_word(seg,stop_word,d_4_delete):\n",
" # TODO ...\n",
" set_stop_word = set(stop_word)\n",
" set_d_4_delete = set(d_4_delete)\n",
" seg_lst = []\n",
" for s in seg:\n",
" if s.word in set_stop_word or s.word in set_d_4_delete:\n",
" continue\n",
" seg_lst.append(s)\n",
" return seg_lst\n",
"\n",
"\n",
"# 初始化,加载词典\n",
"def my_initial():\n",
" fr1 = open(r\"../data/dict/co_City_Dim.txt\", encoding='utf-8')\n",
" fr2 = open(r\"../data/dict/co_Province_Dim.txt\", encoding='utf-8')\n",
" fr3 = open(r\"../data/dict/company_business_scope.txt\", encoding='utf-8')\n",
" fr4 = open(r\"../data/dict/company_suffix.txt\", encoding='utf-8')\n",
" #城市名\n",
" lines1 = fr1.readlines()\n",
" d_4_delete = []\n",
" d_city_province = [re.sub(r'(\\r|\\n)*','',line) for line in lines1]\n",
" #省份名\n",
" lines2 = fr2.readlines()\n",
" l2_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines2]\n",
" d_city_province.extend(l2_tmp)\n",
" #公司后缀\n",
" lines3 = fr3.readlines()\n",
" l3_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines3]\n",
" lines4 = fr4.readlines()\n",
" l4_tmp = [re.sub(r'(\\r|\\n)*','',line) for line in lines4]\n",
" d_4_delete.extend(l4_tmp)\n",
" #get stop_word\n",
" fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
" stop_word = fr.readlines()\n",
" stop_word_after = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
" stop_word_after[-1] = stop_word[-1]\n",
" stop_word = stop_word_after\n",
" return d_4_delete,stop_word,d_city_province\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Building prefix dict from the default dictionary ...\n",
"Loading model from cache /tmp/jieba.cache\n",
"Loading model cost 1.226 seconds.\n",
"Prefix dict has been built succesfully.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"河北银行\n"
]
}
],
"source": [
"# TODO:测试实体统一用例\n",
"d_4_delete,stop_word,d_city_province = my_initial()\n",
"company_name = \"河北银行股份有限公司\"\n",
"lst = main_extract(company_name,stop_word,d_4_delete,d_city_province)\n",
"company_name = ''.join(lst) # 对公司名提取主体部分,将包含相同主体部分的公司统一为一个实体\n",
"print(company_name)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 2:实体识别\n",
"有很多开源工具可以帮助我们对实体进行识别。常见的有LTP、StanfordNLP、FoolNLTK等等。\n",
"\n",
"本次采用FoolNLTK实现实体识别,fool是一个基于bi-lstm+CRF算法开发的深度学习开源NLP工具,包括了分词、实体识别等功能,大家可以通过fool很好地体会深度学习在该任务上的优缺点。\n",
"\n",
"在‘data/train_data.csv’和‘data/test_data.csv’中是从网络上爬虫得到的上市公司公告,数据样例如下:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" <th>tag</th>\n",
" <th>member1</th>\n",
" <th>member2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6461</td>\n",
" <td>与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2111</td>\n",
" <td>三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>9603</td>\n",
" <td>2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515...</td>\n",
" <td>1</td>\n",
" <td>协鑫集成科技股份有限公司</td>\n",
" <td>瑞峰(张家港)光伏科技有限公司</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3456</td>\n",
" <td>证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>8844</td>\n",
" <td>本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数...</td>\n",
" <td>1</td>\n",
" <td>广发证券股份有限公司</td>\n",
" <td>辽宁成大股份有限公司</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence tag member1 \\\n",
"0 6461 与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市... 0 0 \n",
"1 2111 三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无... 0 0 \n",
"2 9603 2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515... 1 协鑫集成科技股份有限公司 \n",
"3 3456 证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限... 0 0 \n",
"4 8844 本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数... 1 广发证券股份有限公司 \n",
"\n",
" member2 \n",
"0 0 \n",
"1 0 \n",
"2 瑞峰(张家港)光伏科技有限公司 \n",
"3 0 \n",
"4 辽宁成大股份有限公司 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"train_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'gb2312', header=0)\n",
"train_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\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",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>sentence</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9259</td>\n",
" <td>2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9136</td>\n",
" <td>2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>220</td>\n",
" <td>2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>9041</td>\n",
" <td>2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>10041</td>\n",
" <td>一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id sentence\n",
"0 9259 2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》\n",
"1 9136 2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先\n",
"2 220 2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》\n",
"3 9041 2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司...\n",
"4 10041 一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收..."
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"test_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们选取一部分样本进行标注,即train_data,该数据由5列组成。id列表示原始样本序号;sentence列为我们截取的一段关键信息;如果关键信息中存在两个实体之间有股权交易关系则tag列为1,否则为0;如果tag为1,则在member1和member2列会记录两个实体出现在sentence中的名称。\n",
"\n",
"剩下的样本没有标注,即test_data,该数据只有id和sentence两列,希望你能训练模型对test_data中的实体进行识别,并判断实体对之间有没有股权交易关系。\n",
"\n",
"### 练习2:\n",
"将每句句子中实体识别出,存入实体词典,并用特殊符号替换语句。\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: Logging before flag parsing goes to stderr.\n",
"W0803 17:53:50.497887 140437070104320 deprecation_wrapper.py:119] From /home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/fool/predictor.py:32: The name tf.gfile.GFile is deprecated. Please use tf.io.gfile.GFile instead.\n",
"\n",
"W0803 17:53:50.499367 140437070104320 deprecation_wrapper.py:119] From /home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/fool/predictor.py:33: The name tf.GraphDef is deprecated. Please use tf.compat.v1.GraphDef instead.\n",
"\n",
"W0803 17:53:50.748158 140437070104320 deprecation_wrapper.py:119] From /home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/fool/predictor.py:53: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" ner\n",
"0 2015年1月26日, ner_1002_ 司与 ner_1001_ 峰先生签署了《附条件生...\n",
"1 2、2016年2月5日, ner_1004_ 司与 ner_1003_ 毅先\n",
"2 2015年10月26日, ner_1006_ 司与 ner_1005_ 华先生签署了附条件生...\n",
"3 2、2015年12月31日, ner_1008_ 司与 ner_1007_ 革签订了《印纪娱...\n",
"4 一、 ner_1010_ 技拟与 ner_1009_ 涛女士签订《股份转让协议》,协议约定:...\n",
"5 同日, ner_1012_ 司与 ner_1011_ 琳先生在上海签署了《股权转让协议》和《...\n",
"6 截至本公告日, ner_1014_ 林持有 ner_1013_ 司股份354,418,300...\n",
"7 本次交易完成后,上市公司将由传统的医药制造业转变成为“企业互联网服务业务为主导,制造业务为支...\n",
"8 2015年1月20日, ner_1018_ 司与 ner_1017_ 飞先生签署《万鸿集团股...\n",
"9 一、(一) ner_1020_ 司(以下简称“公司”)拟以非公开发行方式向 ner_1019...\n",
"10 2、 ner_1022_ 司于2014年12月12日与 ner_1021_ 睿先生签订了《成...\n",
"11 于2015年4月24日, ner_1024_ 司与鲜言先生签订了股权转让协议,鲜言先生按注册...\n",
"12 ner_1026_ 司于2015年11月26日与 ner_1025_ 华先\n",
"13 2015年6月17日, ner_1028_ 峰先生、 ner_1027_ 份高管资管计划分别...\n",
"14 一、 ner_1002_ 司拟向包括 ner_1001_ 峰先生在内的不超过10名特定对象非...\n",
"15 截止2016年12月31日, ner_1018_ 司已向 ner_1017_ 飞归还上述欠款\n",
"16 若公司A股股票在定价基准日至发行日期间发生派发股利、送红股、转增股本、增发新股或配股等除权、...\n",
"17 2015年6月28日, ner_1032_ 司在福建省厦门市与 ner_1031_ 斌先生签...\n",
"18 ner_1013_ 司控股股东、实际控制人 ner_1014_ 林与非关联方分别以自有资金...\n",
"19 2015年4月2日, ner_1034_ 司与 ner_1033_ 峰签署了附条件生效的《关...\n",
"20 一、(一) ner_1037_ 司(以下简称“公司”)拟与公司控股股东和实际控制人 ner_...\n",
"21 在本次非公开发行事项中, ner_1039_ 司总计向5名特定对象非公开发行股票,发行对象包...\n",
"22 一、本次交易方案概述本次交易中, ner_1042_ 份拟以发行股份及支付现金的方式购买 n...\n",
"23 2、 ner_1047_ 司(以下简称“公司”或“ ner_1044_ 技”)计划受让 ne...\n",
"24 ner_1048_ 司本次总计向五名特定对象非公开发行股票,发行对象为 ner_1049_...\n",
"25 2015年6月15日, ner_1055_ 流先生和 ner_1054_ 资分别与公司签署附...\n",
"26 ner_1026_ 司控股股东及实际控制人 ner_1025_ 华先生拟认购不低于本次非公...\n",
"27 一、(一)本次关联交易基本情况 ner_1057_ 良先生为 ner_1056_ 司控股股东...\n",
"28 一、1、 ner_1059_ 司控股股东及实际控制人 ner_1058_ 海以不低于人民币3...\n",
"29 一、(一)关联交易基本情况 ner_1061_ 司(以下简称“公司”)拟向 ner_1060...\n",
".. ...\n",
"389 股票代码:600400 股票简称: ner_1604_ 份 编号:临 2015-054 n...\n",
"390 经 ner_1606_ 司评估,并经 ner_1605_ 司备案,该煤灰池的账面价值为886...\n",
"391 10、2015 年 8 月 24 日,公司使用 10,000 万元人民币购买 ner_160...\n",
"392 3、<附生效条件的股份认购合同>的主要内容2015 年 11 月 18 日,公司与本次非公开...\n",
"393 1因 ner_1269_ 董事系北京缘竟尽⑸虾缘竟尽⒈本缘揽萍脊 ner_1537_ 司的法...\n",
"394 二、 ner_1611_ 厂项目2014年12月底, ner_1611_ 厂转为公用电厂项目...\n",
"395 公司独立董事发表了独立意见,认为: ner_1613_ 司与青海省电力设计院共同组建项目公司...\n",
"396 证券代码:600533 证券简称:栖霞建设 编号:临 2015-059 ner_1614_...\n",
"397 3、本公司与 ner_1534_ 化、 ner_1615_ 君于 2015 年 8 月 25...\n",
"398 重要内容提示●被担保人:控股子公司---- ner_1616_ 司●本次担保金额及已实际为其...\n",
"399 12 / 14 七、历史关联交易(日常关联交易除外)情况1、本次交易前 12 个月内,公司与...\n",
"400 ner_1618_ 司(“公司”)全资拥有的 ner_1617_ 司2号350兆瓦燃煤发电...\n",
"401 二、审议通过了<关于控股子公司 ner_1620_ 司与 ner_1619_ 司签订供热合作...\n",
"402 转让方: ner_1622_ 司 企业类型:有限责任公司(自然人投资或控股) 企业住所:郑州...\n",
"403 证券代码:600108 证券简称: ner_1624_ 团 公告编号:2015-068 n...\n",
"404 会议审议并通过了以下议案,形成如下决议:审议并通过了< ner_1385_ 司关于向 ner...\n",
"405 2014年,公司收购 ner_1626_ 司100%股权, ner_1247_ 司于2014...\n",
"406 申请材料显示,报告期内 ner_1165_ 流、 ner_1164_ 务董事、高级管理人员存...\n",
"407 公司使用暂时闲置募集资金 6,000 万元购买了 ner_1628_ 司 ner_1627_...\n",
"408 二、交易各方当事人情况介绍(一)北京工投基本情况公司名称: ner_1630_ 司住所:北京...\n",
"409 (依法需经批准的项目经相关部门批准后方可开展经营活动)经 ner_1632_ 所审计,201...\n",
"410 ner_1634_ 司吸收合并 ner_1633_ 司及发行股份购买资产并募集配套资金 暨...\n",
"411 回复:(一) 核查情况:1、请你公司结合行业情况、未来经营战略、盈利模式等补充披露客户集中 ...\n",
"412 三、 受让标的基本情况企业名称: ner_1637_ 司 企业类型:有限责任公司(法人独资)...\n",
"413 本次股权转让前,公司持有 ner_1638_ 险 18%的股权;本次股权转让完成后,公 司将...\n",
"414 近日,该子公司已完成工商注册登记手续,并领取了南京市工商行政管理局颁发的<企业法人营业执照>...\n",
"415 (二)本次交易构成关联交易正元投资拟认购金额不低于 13 亿元且不低于本次配套融资总额的 2...\n",
"416 证券代码:600225 证券简称: ner_1642_ 公告编号:临 2015-118 ...\n",
"417 2015年3月31日, ner_1644_ 司与 ner_1643_ 司签署了附条件生效的《...\n",
"418 三、本公司不会利用对 ner_1068_ 份控制关系损害 ner_1068_ 份及其他股东 ...\n",
"\n",
"[419 rows x 1 columns]\n"
]
}
],
"source": [
"# 处理test数据,利用开源工具进行实体识别和并使用实体统一函数存储实体\n",
"\n",
"import fool\n",
"import pandas as pd\n",
"from copy import copy\n",
"\n",
"\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"test_data['ner'] = None\n",
"ner_id = 1001\n",
"ner_dict_new = {} # 存储所有实体\n",
"ner_dict_reverse_new = {} # 存储所有实体\n",
"set_company = set()\n",
"\n",
"for i in range(len(test_data)):\n",
" sentence = copy(test_data.iloc[i, 1])\n",
" # TODO:调用fool进行实体识别,得到words和ners结果\n",
" # TODO ...\n",
" words, ners = fool.analysis([sentence])\n",
" \n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='company' :\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
" company_main_name = main_extract(ner_name,stop_word,d_4_delete,d_city_province)\n",
" company_main_name = ''.join(company_main_name)\n",
" if company_main_name not in ner_dict_new:\n",
" ner_dict_new[company_main_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[company_main_name]] = company_main_name\n",
" ner_id += 1\n",
" set_company.add(ner_id)\n",
" \n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[company_main_name]) + '_ ' + sentence[end-1:]\n",
" elif ner_type=='person':\n",
" if ner_name not in ner_dict_new:\n",
" ner_dict_new[ner_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[ner_name]] = ner_name\n",
" ner_id += 1\n",
" \n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[ner_name]) + '_ ' + sentence[end-1:]\n",
" test_data.iloc[i, -1] = sentence\n",
"\n",
"X_test = test_data[['ner']]\n",
"print(X_test)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" id sentence tag \\\n",
"0 6461 与本公司关系:受同一公司控制 2,杭州富生电器有限公司企业类型: 有限公司注册地址: 富阳市... 0 \n",
"1 2111 三、关联交易标的基本情况 1、交易标的基本情况 公司名称:红豆集团财务有限公司 公司地址:无... 0 \n",
"2 9603 2016年协鑫集成科技股份有限公司向瑞峰(张家港)光伏科技有限公司支付设备款人民币4,515... 1 \n",
"3 3456 证券代码:600777 证券简称:新潮实业 公告编号:2015-091 烟台新潮实业股份有限... 0 \n",
"4 8844 本集团及广发证券股份有限公司持有辽宁成大股份有限公司股票的本期变动系买卖一揽子沪深300指数... 1 \n",
"5 8722 二、被担保人基本情况被担保人:上海同济建设有限公司 住所:上海市杨浦区中山北二路 1121 ... 0 \n",
"6 9200 2014年12月12日,绵阳市国资委出具了<关于同意转让绵阳国虹通讯数码集团有限责任公司股权... 0 \n",
"7 3723 特变电工股份有限公司 2015 年第十二次临时董事会会议 证券代码:600089 证券简称:... 0 \n",
"8 3964 变更 完成后,本公司持有翔通动漫 100%的股权,翔通动漫已成为公司全资子公司。 0 \n",
"9 9547 根据上市公司与浦发银行达成的并购贷款意向函,浦发银行合肥分行愿意提供不高于50%交易金额的并... 0 \n",
"10 3177 特此公告广东四通集团股份有限公司董事会 2015 年 11 月 8 日备查文件<广东四通集团... 0 \n",
"11 7137 证券代码:600348 股票简称:阳泉煤业 编号:临 2015-056阳泉煤业(集团)股份有... 0 \n",
"12 5169 附件:上海申达股份有限公司董事会 2015 年 11 月 17 日1、 上海申达股份有限公司... 0 \n",
"13 4728 根据以上评估结果,经交易各方协商确定本次天安财险 26.96%股权交易价 格为 6,907,... 0 \n",
"14 1810 资产出售和资产购买方案简要介绍如 下:(一)资产出售公司拟向控股股东金诚实业出售双鹿实业 1... 0 \n",
"15 9598 根据京东方集团实际投资额,在2012年6月11日和2013年8月12日,内蒙古自治区人民政府... 0 \n",
"16 4788 五、本公司保证将依照西水股份章程参加股东大会,平等地行使相 应权利,承担相应义务,不利用控股... 0 \n",
"17 3104 2015 年 6 月 25 日,公司以人民币 8,000 万元闲置募集资金购买了广发银行 广... 0 \n",
"18 852 会议应参与表决董事9人,实际 表决9人,独立董事何红渠先生因公出差委托独立董事刘曙萍女士代为... 0 \n",
"19 9483 二、关联方介绍(一)关联方关系介绍根据<上海证券交易所股票上市规则>和<香港联合交易所有限公... 0 \n",
"20 9894 第五届董事会第十九次会议决议审议通过了《关于退出上海高特佳懿康投资合伙企业(有限合伙)暨关联... 1 \n",
"21 1784 公司将与浙江南浔 农村商业银行股份有限公司和孚支行及时分析和跟踪理财产品的进展情况,加强 风... 0 \n",
"22 4868 经评估,截至 2015 年 5 月 31 日,天安财险32经审计的归属母公司股东权益合计为 ... 0 \n",
"23 7 本年度上海大西洋收购天津大西洋焊接材料有限公司将其所持天津大西洋销售44%股权,支付对价8,... 1 \n",
"24 3205 变更后,中天科技持有中天宽 带 100%股权。 0 \n",
"25 8504 2、2014年11月7日公司与平安银行股份有限公司签订平安银行对公结构 性存款产品合约;资金... 0 \n",
"26 1885 13(本页无正文,为<延边石岘白麓纸业股份有限公司重大资产出售和重大资产 购买暨关联交易实施... 0 \n",
"27 8394 经合肥市工商行政管理局核准,公司全资子公司“安徽继远电网技术有限责 任公司”更名为“安徽南瑞... 0 \n",
"28 9336 四、对外投资合作合同的主要内容甲方:泉州盛翔投资管理中心(有限合伙)乙方:泉州泉晟投资有限公... 0 \n",
"29 3633 股票代码:601877 股票简称:正泰电器 编号:临 2015-068 债券代码:12208... 0 \n",
".. ... ... ... \n",
"820 8750 五、参与天堂硅谷增资扩股对公司影响天堂硅谷自成立以来,业务和资产规模快速发展,经济效益稳步提升。 0 \n",
"821 9593 五、包括贵州盘江精股份有限公司在内,被提名人兼任独立董事的境内上市公司数量未超过五家,被提名... 0 \n",
"822 6460 (二)预计增加关联交易的基本情况 类别 关联人 原预计金额 (万元) 增加预计额 (万元) ... 0 \n",
"823 1238 新疆天业股份有限公司(以下简称“公司”)收到中国证券监督管理委员会(以下 简称“中国证监会”... 0 \n",
"824 296 二、交易对方情况介绍11、公司名称:甘肃亚盛薯业有限责任公司 2、企业性质:有限责任公司 3... 0 \n",
"825 2572 公司于 2014 年 1 月 7 日与交通银行股份有限公司江苏省分行签订协议,使用 暂时闲置... 0 \n",
"826 6280 证券代码:601028 证券简称:玉龙股份 公告编号:2015-055 江苏玉龙钢管股份有限... 0 \n",
"827 236 郴州市政府旗下的郴州城投公司,是 国家开发银行湖南分行的信贷客户,在银行存在着良好的信用,符... 0 \n",
"828 3122 证券代码:603222 证券简称:济民制药 公告编号:2015-051 浙江济民制药股份有限... 0 \n",
"829 4343 ? 本次担保是否有反担保:无 ? 对外担保逾期的累计数量:零一、担保情况概述公司全资子公司保... 0 \n",
"830 8969 浙江苏泊尔股份有限公司向苏泊尔集团有限公司购买位于浙江省玉环县大麦屿街道南尤工业区部分地块,... 1 \n",
"831 2935 重要内容提示:委托理财受托方:上海浦东发展银行股份有限公司 委托理财金额: 2,000万元人... 0 \n",
"832 679 重要提示?关联交易标的名称: 钢铁产品? 关联交易金额: 2015 年销售金额预计人民币 5... 0 \n",
"833 6982 证券代码:600237 证券简称:铜峰电子 编号:临 2015-054 安徽铜峰电子股份有限... 0 \n",
"834 2808 重庆渝电工程监理咨询有限公司,成立于1998年6月,法定代表人赵 久云,工商注册号为5009... 0 \n",
"835 7122 17、公司购买理财产品名称:农业银行“汇利丰”对公定制人民币理财产品; 购买金额:人民币2亿... 0 \n",
"836 6508 (21)刘雯婧刘雯婧,女,国籍中国,身份证号 42010619880315****,住所为武... 0 \n",
"837 3221 三、关联交易标的基本情况(一)交易标的:与关联方北京缘竟尽⑸虾缘竟尽⒈本缘揽萍脊 司和缘咀什... 0 \n",
"838 95 2015年11月9日,江中药业股份有限公司将所持有的江西九州通51%股权在江西省产权交易所公... 1 \n",
"839 9340 采用成本法(资产基础法)对深圳金桔莱(母公司)全部股东权益价值进行评估,评估价值为125,1... 0 \n",
"840 942 2、平安大华基金管理有限公司(1)基本情况企业类型:有限责任公司(中外合资) 住所:深圳市福... 0 \n",
"841 866 华景公司另一股东嘉兴华泰不进行 增资,并同意我公司增资,其他权利义务不变。 0 \n",
"842 4908 如果天安财险 未能适应业务变化并及时调整风险管理政策及程序,则可能会对天安财险的业 务、经营... 0 \n",
"843 3210 变更后,中天科技持有中天合金 100%股权。 0 \n",
"844 3552 评估机构:广东中广信资产评估会计师事务所 评估基准日:2015 年 8 月 31 日 评估方... 0 \n",
"845 1225 请 你公司结合天伟化工的经营变化状况、上述增资价格与本次交易作价的差异,进一步补 充披露天伟... 0 \n",
"846 2970 公司使用暂时闲置募集资金6,483万元购买了中国农业银行股 份有限公司沈阳南湖支行“本利丰・... 0 \n",
"847 7961 (二) 本次重组尚需履行的决策程序18 本次交易尚需履行的决策和审批程序包括但不限于:1、本... 0 \n",
"848 1033 2015 年 5 月 6 日,公司以人民币 3,000 万元闲置募集资金购买了广发银行 广州... 0 \n",
"849 9282 一、:1、关联交易的基本情况广州毅昌科技股份有限公司(以下简称“公司”)拟以4617030元... 1 \n",
"\n",
" member1 member2 \\\n",
"0 0 0 \n",
"1 0 0 \n",
"2 协鑫集成科技股份有限公司 瑞峰(张家港)光伏科技有限公司 \n",
"3 0 0 \n",
"4 广发证券股份有限公司 辽宁成大股份有限公司 \n",
"5 0 0 \n",
"6 0 0 \n",
"7 0 0 \n",
"8 0 0 \n",
"9 0 0 \n",
"10 0 0 \n",
"11 0 0 \n",
"12 0 0 \n",
"13 0 0 \n",
"14 0 0 \n",
"15 0 0 \n",
"16 0 0 \n",
"17 0 0 \n",
"18 0 0 \n",
"19 0 0 \n",
"20 上海高特佳懿康投资合伙企业(有限合伙) 博雅生物制药集团股份有限公司 \n",
"21 0 0 \n",
"22 0 0 \n",
"23 大西洋 天津大西洋焊接材料有限公司 \n",
"24 0 0 \n",
"25 0 0 \n",
"26 0 0 \n",
"27 0 0 \n",
"28 0 0 \n",
"29 0 0 \n",
".. ... ... \n",
"820 0 0 \n",
"821 0 0 \n",
"822 0 0 \n",
"823 0 0 \n",
"824 0 0 \n",
"825 0 0 \n",
"826 0 0 \n",
"827 0 0 \n",
"828 0 0 \n",
"829 0 0 \n",
"830 浙江苏泊尔股份有限公司 苏泊尔集团有限公司 \n",
"831 0 0 \n",
"832 0 0 \n",
"833 0 0 \n",
"834 0 0 \n",
"835 0 0 \n",
"836 0 0 \n",
"837 0 0 \n",
"838 九州通 江中药业股份有限公司 \n",
"839 0 0 \n",
"840 0 0 \n",
"841 0 0 \n",
"842 0 0 \n",
"843 0 0 \n",
"844 0 0 \n",
"845 0 0 \n",
"846 0 0 \n",
"847 0 0 \n",
"848 0 0 \n",
"849 广州华南新材料创新园有限公司 广州毅昌科技股份有限公司 \n",
"\n",
" ner \n",
"0 与本公司关系:受同一公司控制 2, ner_1646_ 司企业类型: 有限公司注册地址: 富... \n",
"1 三、关联交易标的基本情况 1、交易标的基本情况 公司名称: ner_1648_ 司地址:无锡... \n",
"2 2016年 ner_1649_ 向 ner_1650_ 支付设备款人民币4,515,770.00元 \n",
"3 证券代码:600777 证券简称: ner_1201_ 公告编号:2015-091 ne... \n",
"4 本集团及 ner_1651_ 持有 ner_1652_ 股票的本期变动系买卖一揽子沪深300... \n",
"5 二、被担保人基本情况被担保人: ner_1654_ 司 住所:上海市杨浦区中山北二路 112... \n",
"6 2014年12月12日,绵阳市国资委出具了<关于同意转让 ner_1656_ 司股权有关事项... \n",
"7 ner_1657_ 司 2015 年第十二次临时董事会会议 证券代码:600089 证券简... \n",
"8 变更 完成后,本公司持有 ner_1659_ 100%的股权, ner_1658_ 漫已成... \n",
"9 根据上市公司与 ner_1661_ 行达成的并购贷款意向函, ner_1660_ 行愿意提供... \n",
"10 特此公告 ner_1128_ 司董事会 2015 年 11 月 8 日备查文件< ner_1... \n",
"11 证券代码:600348 股票简称: ner_1313_ 业 编号:临 2015-056 ne... \n",
"12 附件: ner_1485_ 司董事会 2015 年 11 月 17 日1、 ner_1662... \n",
"13 根据以上评估结果,经交易各方协商确定本次 ner_1166_ 险 26.96%股权交易价 格... \n",
"14 资产出售和资产购买方案简要介绍如 下:(一)资产出售公司拟向控股股东 ner_1663_ 业... \n",
"15 根据 ner_1665_ 团实际投资额,在2012年6月11日和2013年8月12日,内蒙古... \n",
"16 五、本公司保证将依照 ner_1068_ 份章程参加股东大会,平等地行使相 应权利,承担相应... \n",
"17 2015 年 6 月 25 日,公司以人民币 8,000 万元闲置募集资金购买了 ner_1... \n",
"18 会议应参与表决董事9人,实际 表决9人,独立董事 ner_1667_ 渠先生因公出差委托独立... \n",
"19 二、关联方介绍(一)关联方关系介绍根据<上海证券交易所股票上市规则>和 ner_1669_ ... \n",
"20 第五届董事会第十九次会议决议审议通过了《关于退出 ner_1670_ 暨关联交易的议案》, ... \n",
"21 公司将与 ner_1672_ 司和 ner_1100_ 行及时分析和跟踪理财产品的进展情况,... \n",
"22 经评估,截至 2015 年 5 月 31 日, ner_1166_ 险32经审计的归属母公司... \n",
"23 本年度上海 ner_1673_ 收购天津 ner_1673_ 焊接材料有限公司将其所持天津 ... \n",
"24 变更后, ner_1554_ 技持有 ner_1675_ 带 100%股权。 \n",
"25 2、2014年11月7日公司与 ner_1099_ 司签订 ner_1099_ 行对公结构 ... \n",
"26 13(本页无正文,为<延边 ner_1677_ 司重大资产出售和重大资产 购买暨关联交易实施... \n",
"27 经合肥市工商行政管理局核准,公司全资子公司“ ner_1679_ 司”更名为“ ner_16... \n",
"28 四、对外投资合作合同的主要内容甲方: ner_1681_ 心(有限合伙)乙方: ner_16... \n",
"29 股票代码:601877 股票简称: ner_1683_ 器 编号:临 2015-068 债券... \n",
".. ... \n",
"820 五、参与 ner_1223_ 谷增资扩股对公司影响 ner_1223_ 谷自成立以来,业务和... \n",
"821 五、包括 ner_2553_ 司在内,被提名人兼任独立董事的境内上市公司数量未超过五家,被提... \n",
"822 (二)预计增加关联交易的基本情况 类别 关联人 原预计金额 (万元) 增加预计额 (万元) ... \n",
"823 ner_1826_ 司(以下简称“公司”)收到中国证券监督管理委员会(以下 简称“中国证监... \n",
"824 二、交易对方情况介绍11、公司名称: ner_2557_ 司 2、企业性质:有限责任公司 3... \n",
"825 公司于 2014 年 1 月 7 日与 ner_1577_ 司 ner_2177_ 行签订协... \n",
"826 证券代码:601028 证券简称: ner_2559_ 份 公告编号:2015-055 n... \n",
"827 郴州市政府旗下的 ner_1816_ 司,是 ner_2560_ 行的信贷客户,在银行存在着... \n",
"828 证券代码:603222 证券简称: ner_2561_ 公告编号:2015-051 ne... \n",
"829 ? 本次担保是否有反担保:无 ? 对外担保逾期的累计数量:零一、担保情况概述公司全资子公司 ... \n",
"830 ner_2563_ 向 ner_2564_ 购买位于浙江省玉环县大麦屿街道南尤工业区部分地... \n",
"831 重要内容提示:委托理财受托方: ner_2086_ 司 委托理财金额: 2,000万元人民币... \n",
"832 重要提示?关联交易标的名称: 钢铁产品? 关联交易金额: 2015 年销售金额预计人民币 5... \n",
"833 证券代码:600237 证券简称: ner_2567_ 子 编号:临 2015-054 n... \n",
"834 ner_1954_ 司,成立于1998年6月,法定代表人 ner_2568_ 云,工商注册... \n",
"835 17、公司购买理财产品名称: ner_1422_ 行“ ner_1421_ 丰”对公定制人民... \n",
"836 (21) ner_2569_ 婧 ner_2569_ 婧,女,国籍中国,身份证号 42010... \n",
"837 三、关联交易标的基本情况(一)交易标的:与关联方北京缘竟尽⑸虾缘竟尽⒈本缘揽 ner_178... \n",
"838 2015年11月9日, ner_2572_ 将所持有的江西 ner_2571_ 51%股权在... \n",
"839 采用成本法(资产基础法)对 ner_2574_ 司)全部股东权益价值进行评估,评估价值为12... \n",
"840 2、 ner_2576_ 司(1)基本情况企业类型:有限责任公司(中外合资) 住所:深圳市福... \n",
"841 ner_2578_ 司另一股东 ner_2577_ 泰不进行 增资,并同意我公司增资,其他... \n",
"842 如果 ner_1166_ 险 未能适应业务变化并及时调整风险管理政策及程序,则可能会对 ne... \n",
"843 变更后, ner_1554_ 技持有 ner_2579_ 100%股权。 \n",
"844 评估机构: ner_2580_ 所 评估基准日:2015 年 8 月 31 日 评估方法:资... \n",
"845 请 你公司结合 ner_1322_ 工的经营变化状况、上述增资价格与本次交易作价的差异,进一... \n",
"846 公司使用暂时闲置募集资金6,483万元购买了 ner_2582_ 司 ner_2581_ 行... \n",
"847 (二) 本次重组尚需履行的决策程序18 本次交易尚需履行的决策和审批程序包括但不限于:1、本... \n",
"848 2015 年 5 月 6 日,公司以人民币 3,000 万元闲置募集资金购买了 ner_10... \n",
"849 一、:1、关联交易的基本情况 ner_2584_ (以下简称“公司”)拟以4617030元人... \n",
"\n",
"[850 rows x 6 columns]\n"
]
}
],
"source": [
"# 处理train数据,利用开源工具进行实体识别和并使用实体统一函数存储实体\n",
"train_data = pd.read_csv('../data/info_extract/train_data.csv', encoding = 'gb2312', header=0)\n",
"train_data['ner'] = None\n",
"\n",
"for i in range(len(train_data)):\n",
" # 判断正负样本\n",
" if train_data.iloc[i,:]['member1']=='0' and train_data.iloc[i,:]['member2']=='0':\n",
" sentence = copy(train_data.iloc[i, 1])\n",
" # TODO:调用fool进行实体识别,得到words和ners结果\n",
" # TODO ...\n",
" \n",
" words, ners = fool.analysis([sentence])\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='company' :\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
" company_main_name = main_extract(ner_name,stop_word,d_4_delete,d_city_province)\n",
" company_main_name = ''.join(company_main_name)\n",
" if company_main_name not in ner_dict_new:\n",
" ner_dict_new[company_main_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[company_main_name]] = company_main_name\n",
" ner_id += 1\n",
" set_company.add(ner_id)\n",
"\n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[company_main_name]) + '_ ' + sentence[end-1:]\n",
"\n",
" elif ner_type=='person':\n",
" if ner_name not in ner_dict_new:\n",
" ner_dict_new[ner_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[ner_name]] = ner_name\n",
" ner_id += 1\n",
"\n",
" # 在句子中用编号替换实体名\n",
" sentence = sentence[:start] + ' ner_' + str(ner_dict_new[ner_name]) + '_ ' + sentence[end-1:]\n",
" train_data.iloc[i, -1] = sentence\n",
" else:\n",
" # 将训练集中正样本已经标注的实体也使用编码替换\n",
" sentence = copy(train_data.iloc[i,:]['sentence'])\n",
" for company_main_name in [train_data.iloc[i,:]['member1'],train_data.iloc[i,:]['member2']]:\n",
" # TODO:调用实体统一函数,存储统一后的实体\n",
" # 并自增ner_id\n",
" # TODO ...\n",
" company_main_name = ''.join(company_main_name)\n",
" if company_main_name not in ner_dict_new:\n",
" ner_dict_new[company_main_name] = ner_id\n",
" ner_dict_reverse_new[ner_dict_new[company_main_name]] = company_main_name\n",
" ner_id += 1\n",
" set_company.add(ner_id)\n",
"\n",
"\n",
" # 在句子中用编号替换实体名\n",
" sentence = re.sub(company_main_name, ' ner_%s_ '%(str(ner_dict_new[company_main_name])), sentence)\n",
" train_data.iloc[i, -1] = sentence\n",
"print(train_data) \n",
"y = train_data.loc[:,['tag']]\n",
"train_num = len(train_data)\n",
"X_train = train_data[['ner']]\n",
"\n",
"# 将train和test放在一起提取特征\n",
"X = pd.concat([X_train, X_test])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤 3:关系抽取\n",
"\n",
"\n",
"目标:借助句法分析工具,和实体识别的结果,以及文本特征,基于训练数据抽取关系,并存储进图数据库。\n",
"\n",
"本次要求抽取股权交易关系,关系为无向边,不要求判断投资方和被投资方,只要求得到双方是否存在交易关系。\n",
"\n",
"模板建立可以使用“正则表达式”、“实体间距离”、“实体上下文”、“依存句法”等。\n",
"\n",
"答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"- info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(实体统一的多个实体名用“|”分隔)\n",
"- info_extract_submit.csv格式为:第一列是关系中实体1的编号,第二列为关系中实体2的编号。\n",
"\n",
"示例:\n",
"- info_extract_entity.csv\n",
"\n",
"| 实体编号 | 实体名 |\n",
"| ------ | ------ |\n",
"| 1001 | 小王 |\n",
"| 1002 | A化工厂 |\n",
"\n",
"- info_extract_submit.csv\n",
"\n",
"| 实体1 | 实体2 |\n",
"| ------ | ------ |\n",
"| 1001 | 1003 |\n",
"| 1002 | 1001 |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习3:提取文本tf-idf特征\n",
"\n",
"去除停用词,并转换成tfidf向量。"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['公司 受 同一 公司 控制 2 司 企业 类型 有限公司 注册 地址 富阳市 东洲 街道 东洲 工业 功能 区九号路 1 号 法定 代表人 明 注册 资本 16 000万 元 经营 许可 经营 制造 高效 节能 感应 电机 ; 普通 货运', '三 关联 交易 标的 1 交易 标的 公司 名称 司 地址 无锡市 锡山区 东港镇 锡港东路 2 号 企业 类型 责任 公司 法定 代表人 燕 注册 资本 50000万 元 整 财务 公司 公司 参股 公司 成立 2008年 11月 经营 成员 单位 财务 融资 顾问 信用 鉴证 咨询 代理 业务 ; 成员 单位 交易 款项 收付 ; 批准 保险 代理 业务 ; 成员 单位 担保 ; 成员 单位 委托 贷款 委托 投资 ; 成员 单位 票据 承兑 贴现 ; 成员 单位 转账 结算 结算 清算 方案 设计 ; 吸收 成员 单位 存款 ; 成员 单位 贷款 融资 租赁 ; 同业 拆借 ; 承销 成员 单位 企业 债券 ; 金融 机构 股权 投资 ; 有价证券 投资 股票 二级 市场 投资 除外 ; 成员 单位 产品 买方 信贷', '2016年 支付 设备 款 人民币 4 515 770.00 元', '证券 代码 600777 证券 简称 公告 编号 2015-091 司 第八 届 监事会 第十一 次 会议 决议 公告 公司 监事会 全体 监事 公告 不 虚假 记载 误导性 陈述 遗漏 真实性 准确性 完整性 承担 个别 连带 责任', '集团 持有 股票 本期 变动 系 买卖 一揽子 沪 深 300 指数 成份股 致']\n",
" (0, 4103)\t0.2114565894485973\n",
" (0, 3022)\t0.1567445046668198\n",
" (0, 3469)\t0.20447702741373694\n",
" (0, 2712)\t0.22045480991774755\n",
" (0, 3894)\t0.2114565894485973\n",
" (0, 4498)\t0.22045480991774755\n",
" (0, 1855)\t0.16809558961226798\n",
" (0, 4023)\t0.15290970636043075\n",
" (0, 3754)\t0.19454004856814155\n",
" (0, 5)\t0.11077546570621795\n",
" (0, 235)\t0.16111602757740762\n",
" (0, 4136)\t0.10354667247447477\n",
" (0, 1542)\t0.11205231032692424\n",
" (0, 3241)\t0.11407096876121413\n",
" (0, 1920)\t0.22045480991774755\n",
" (0, 1880)\t0.22045480991774755\n",
" (0, 2525)\t0.17459020627859542\n",
" (0, 3953)\t0.18609203055056847\n",
" (0, 1382)\t0.4409096198354951\n",
" (0, 2470)\t0.22045480991774755\n",
" (0, 2246)\t0.1294748204889748\n",
" (0, 3248)\t0.20562135469497786\n",
" (0, 3052)\t0.13645438252383515\n",
" (0, 3705)\t0.11585878961850787\n",
" (0, 1557)\t0.11407096876121413\n",
" :\t:\n",
" (3, 1773)\t0.1524667506120705\n",
" (3, 1576)\t0.1316661833337407\n",
" (3, 3657)\t0.24603105663498262\n",
" (3, 3498)\t0.45619536537824595\n",
" (3, 3653)\t0.20244151361851392\n",
" (3, 111)\t0.2957368225980327\n",
" (3, 333)\t0.11526242758557653\n",
" (3, 3784)\t0.12716965106831488\n",
" (3, 1713)\t0.3432944013645088\n",
" (3, 3688)\t0.1074725684540511\n",
" (3, 861)\t0.26823488296435966\n",
" (3, 1540)\t0.12745407459398825\n",
" (3, 4032)\t0.2427573010643158\n",
" (3, 4091)\t0.11282000048679083\n",
" (3, 1711)\t0.059273701771436815\n",
" (4, 2718)\t0.3806528037580807\n",
" (4, 2846)\t0.3349928861087956\n",
" (4, 481)\t0.34914329741412814\n",
" (4, 1307)\t0.3806528037580807\n",
" (4, 1449)\t0.35782284493343813\n",
" (4, 2060)\t0.2959648137169803\n",
" (4, 3076)\t0.3349928861087956\n",
" (4, 2836)\t0.20790422248622678\n",
" (4, 4396)\t0.27313485489233774\n",
" (4, 3843)\t0.17437374334046382\n",
"<PandasArray>\n",
"['与本公司关系:受同一公司控制 2, ner_1646_ 司企业类型: 有限公司注册地址: 富阳市东洲街道东洲工业功能区九号路 1 号 法定代表人: ner_1645_ 明注册资本: ?16,000 万元经营范围: 许可经营项目:制造高效节能感应电机;普通货运。', '三、关联交易标的基本情况 1、交易标的基本情况 公司名称: ner_1648_ 司地址:无锡市锡山区东港镇锡港东路 2 号 企业类型:有限责任公司 法定代表人: ner_1647_ 燕注册资本:50000 万元整财务公司是公司参股公司,成立于 2008 年 11 月,经营范围为:对成员单位 办理财务和融资顾问、信用鉴证及相关的咨询、代理业务;协助成员单位实现交 易款项的收付;经批准的保险代理业务;对成员单位提供担保;办理成员单位之 间的委托贷款及委托投资;对成员单位办理票据承兑与贴现;办理成员单位之间 的内部转账结算及相应的结算、清算方案设计;吸收成员单位的存款;对成员单 位办理贷款及融资租赁;从事同业拆借;承销成员单位的企业债券;对金融机构 的股权投资;有价证券投资(股票二级市场投资除外);成员单位产品的买方信 贷。']\n",
"Length: 2, dtype: object\n"
]
}
],
"source": [
"# code\n",
"from sklearn.feature_extraction.text import TfidfTransformer \n",
"from sklearn.feature_extraction.text import CountVectorizer \n",
"from pyltp import Segmentor\n",
"import os\n",
"\n",
"\n",
"# 实体符号加入分词词典\n",
"# with open('../data/user_dict.txt', 'w') as fw:\n",
"# for v in ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']:\n",
"# fw.write( v + '号企业 ni\\n')\n",
"\n",
"with open('../data/user_dict.txt', 'w',encoding='utf-8') as fw:\n",
" for v in ner_dict_new.values():\n",
" fw.write('ner{}\\n'.format(str(v)))\n",
"\n",
"LTP_DATA_DIR = '/home/xiayulong/work/pyltp.d/models/ltp_data_v3.4.0' # ltp模型目录的路径\n",
"cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为`cws.model`\n",
" \n",
"# 初始化实例\n",
"segmentor = Segmentor() \n",
"# 加载模型,加载自定义词典\n",
"segmentor.load_with_lexicon(cws_model_path, '../data/user_dict.txt') \n",
"\n",
"# 加载停用词\n",
"fr = open(r'../data/dict/stopwords.txt', encoding='utf-8') \n",
"stop_word = fr.readlines()\n",
"stop_word = [re.sub(r'(\\r|\\n)*','',stop_word[i]) for i in range(len(stop_word))]\n",
"\n",
"# 分词\n",
"# f = lambda x: ' '.join([word for word in segmentor.segment(x) if word not in stop_word and not re.findall(r'ner\\_\\d\\d\\d\\d\\_', word)])\n",
"# print(X['ner'].array[0])\n",
"# print([word for word in segmentor.segment('ner1001是个公司')])\n",
"# corpus=X['ner'].map(f).tolist()\n",
"\n",
"corpus = []\n",
"for sen in X['ner'].array:\n",
" for replace in re.findall(r'ner\\_\\d\\d\\d\\d\\_', sen):\n",
" sen = re.sub(replace,replace.replace('_',''),sen)\n",
" tmp = ' '.join([word for word in segmentor.segment(sen) if word not in stop_word and not re.findall(r'ner\\d\\d\\d\\d', word)])\n",
" corpus.append(tmp)\n",
"\n",
"\n",
"\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"# TODO:提取tfidf特征\n",
"# TODO ...\n",
"tfidf = TfidfVectorizer()\n",
"vec = tfidf.fit_transform(corpus)\n",
"print(corpus[:5])\n",
"print(vec[:5])\n",
"print(X['ner'].array[:2])\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习4:提取句法特征\n",
"除了词语层面的句向量特征,我们还可以从句法入手,提取一些句法分析的特征。\n",
"\n",
"参考特征:\n",
"\n",
"1、企业实体间距离\n",
"\n",
"2、企业实体间句法距离\n",
"\n",
"3、企业实体分别和关键触发词的距离\n",
"\n",
"4、实体的依存关系类别"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"与本公司关系:受同一公司控制 2, ner_1646_ 司企业类型: 有限公司注册地址: 富阳市东洲街道东洲工业功能区九号路 1 号 法定代表人: ner_1645_ 明注册资本: ?16,000 万元经营范围: 许可经营项目:制造高效节能感应电机;普通货运。\n",
"[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0]\n",
"(1269, 4522)\n"
]
}
],
"source": [
"# -*- coding: utf-8 -*-\n",
"from pyltp import Parser\n",
"from pyltp import Segmentor\n",
"from pyltp import Postagger\n",
"import networkx as nx\n",
"import numpy as np\n",
"import pylab\n",
"import re\n",
"import os\n",
"\n",
"LTP_DATA_DIR = '/home/xiayulong/work/pyltp.d/models/ltp_data_v3.4.0' # ltp模型目录的路径\n",
"cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为`cws.model`\n",
"pos_path = os.path.join(LTP_DATA_DIR, 'pos.model')\n",
"\n",
"\n",
"postagger = Postagger() # 初始化实例\n",
"postagger.load_with_lexicon(pos_path, '../data/user_dict.txt') # 加载模型\n",
"segmentor = Segmentor() # 初始化实例\n",
"segmentor.load_with_lexicon(cws_model_path, '../data/user_dict.txt') # 加载模型\n",
"parser = Parser() # 初始化实例\n",
"parser.load(os.path.join(LTP_DATA_DIR, 'parser.model')) # 加载模型\n",
"\n",
"\n",
"\n",
"# 以实体对为中心,提取特征是否会更好?\n",
"# 因为每句话中的实体数量不确定,有关系的实体数量更是不确定。以实体对为中心,可以明确观察这对实体在句法依存树中的关系,以及从实体1到实体2的路径\n",
"# 上是否有关键词,例如这里的\"支付\",再辅以某些token级别的特征,例如某个size窗口内的tfidf的特征。这样,一句话可以生成多个样本,目标变成预测每\n",
"# 一对实体所构成的样本的关系\n",
"\n",
"\n",
"relations = [\"SBV\",\n",
" \"VOB\",\n",
" \"IOB\",\n",
" \"FOB\",\n",
" \"DBL\",\n",
" \"ATT\",\n",
" \"ADV\",\n",
" \"CMP\",\n",
" \"COO\",\n",
" \"POB\",\n",
" \"LAD\",\n",
" \"RAD\",\n",
" \"IS\",\n",
" \"HED\"]\n",
"\n",
"\n",
"def parse(s):\n",
" \"\"\"\n",
" 对语句进行句法分析,并返回句法结果\n",
" \"\"\"\n",
" tmp_ner_dict = {}\n",
" num_lst = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']\n",
"\n",
" # 将公司代码替换为特殊称谓,保证分词词性正确\n",
"# for i, ner in enumerate(list(set(re.findall(r'(ner\\_\\d\\d\\d\\d\\_)', s)))):\n",
"# try:\n",
"# tmp_ner_dict[num_lst[i]+'号企业'] = ner\n",
"# except IndexError:\n",
"# # TODO:定义错误情况的输出\n",
"# # TODO ...\n",
" \n",
" \n",
"# s = s.replace(ner, num_lst[i]+'号企业')\n",
" for i, ner in enumerate(list(set(re.findall(r'(ner\\_\\d\\d\\d\\d\\_)', s)))):\n",
" s = re.sub(ner,ner.replace('_',''),s)\n",
" words = segmentor.segment(s)\n",
" tags = postagger.postag(words)\n",
"\n",
" arcs = parser.parse(words, tags) # 句法分析\n",
" arcs_lst = list(map(list, zip(*[[arc.head, arc.relation] for arc in arcs])))\n",
" # 句法分析结果输出\n",
" parse_result = pd.DataFrame([[a,b,c,d] for a,b,c,d in zip(list(words),list(tags), arcs_lst[0], arcs_lst[1])], index = range(1,len(words)+1))\n",
" \n",
"\n",
" # TODO:提取企业实体依存句法类型\n",
" # TODO ...\n",
" # 句子只有两个实体(俩公司或一公司一人名)\n",
" # 找前两个实体间\n",
" dict_of_relation = {relation:0 for relation in relations}\n",
" ners = list()\n",
" for i in list(parse_result.index):\n",
" word = parse_result.loc[i,0]\n",
" relation = parse_result.loc[i,3]\n",
" if re.findall(r'(ner\\d{4})', word):\n",
" if word not in ners:\n",
" ners.append(word)\n",
" ner_id = word[3:]\n",
" if ner_id.isdigit() and int(ner_id) in set_company:\n",
" dict_of_relation[relation] += 1\n",
" \n",
" count_of_relation = list(dict_of_relation.values())\n",
" \n",
" \n",
"\n",
" # 投资关系关键词\n",
" key_words = [\"收购\",\"竞拍\",\"转让\",\"扩张\",\"并购\",\"注资\",\"整合\",\"并入\",\"竞购\",\"竞买\",\"支付\",\"收购价\",\"收购价格\",\"承购\",\"购得\",\"购进\",\n",
" \"购入\",\"买进\",\"买入\",\"赎买\",\"购销\",\"议购\",\"函购\",\"函售\",\"抛售\",\"售卖\",\"销售\",\"转售\"]\n",
" # TODO:*根据关键词和对应句法关系提取特征(如没有思路可以不完成)\n",
" # TODO ...\n",
" # distances[0]: 实体之间距离\n",
" # distances[1]: 实体1和关键词之间距离\n",
" # distances[2]: 实体2和关键词之间距离\n",
" distances = [0,0,0]\n",
" if len(ners) >= 2:\n",
" # 实体1\n",
" entity1 = ners[0]\n",
" # 实体2\n",
" entity2 = ners[1]\n",
" distances[0] = shortest_path(parse_result,entity1,entity2)[0]\n",
" for i in parse_result.index:\n",
" word = parse_result.loc[i,0]\n",
" if word in key_words:\n",
" distances[1] = shortest_path(parse_result,entity1,word)[0]\n",
" distances[2] = shortest_path(parse_result,entity2,word)[0]\n",
" \n",
" \n",
"\n",
" \n",
" \n",
" # parser.release() # 释放模型\n",
" return count_of_relation + distances\n",
"\n",
"\n",
"def get_weight(type):\n",
" return 1.\n",
"\n",
"def print_graph(G):\n",
" for n, nbrs in G.adj.items():\n",
" for nbr, eattr in nbrs.items():\n",
" wt = eattr['weight']\n",
" print(f\"({n}, {nbr}, {wt:.3})\")\n",
"\n",
"\n",
"\n",
"\n",
"def shortest_path(arcs_ret, source, target):\n",
" \"\"\"\n",
" 求出两个词最短依存句法路径,不存在路径返回-1\n",
" arcs_ret:句法分析结果\n",
" source:实体1\n",
" target:实体2\n",
" \"\"\"\n",
" G=nx.DiGraph()\n",
" # 为这个网络添加节点...\n",
" for i in list(arcs_ret.index):\n",
" G.add_node(i)\n",
" # TODO:在网络中添加带权中的边...(注意,我们需要的是无向边)\n",
" # TODO ...\n",
" for cur in list(arcs_ret.index):\n",
" predecessor = arcs_ret.loc[cur,2]\n",
" if predecessor == 0:\n",
" continue\n",
" weight = get_weight(arcs_ret.loc[i,3])\n",
" G.add_edge(predecessor,cur,weight=weight)\n",
" undirected = nx.Graph(G)\n",
" try:\n",
" # TODO:利用nx包中shortest_path_length方法实现最短距离提取\n",
" # TODO ...\n",
" path = nx.shortest_path(undirected,source,target)\n",
" distance = len(path)\n",
" \n",
" return (distance,path)\n",
" except:\n",
" return (-1,None)\n",
"\n",
"\n",
"def get_feature(X,tfidf_vec):\n",
" \"\"\"\n",
" 汇总上述函数汇总句法分析特征与TFIDF特征\n",
" \"\"\"\n",
" # TODO:汇总上述函数汇总句法分析特征与TFIDF特征\n",
" # TODO ...\n",
" syntactic_features = []\n",
" for sentence in X['ner'].array:\n",
" syntactic_features.append(parse(sentence))\n",
" features = np.concatenate([tfidf_vec.toarray(), syntactic_features],axis=1)\n",
" return features\n",
"sen = X['ner'].array[0]\n",
"\n",
"result = parse(sen)\n",
"print(sen)\n",
"print(result)\n",
"print(vec.shape)\n",
"features = get_feature(X,vec)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习5:建立分类器\n",
"\n",
"利用已经提取好的tfidf特征以及parse特征,建立分类器进行分类任务。"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/model_selection/_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.\n",
" warnings.warn(CV_WARNING, FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/xiayulong/anaconda3-2019.07/lib/python3.7/site-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'mean_fit_time': array([0.02740773, 0.02587167, 0.03985373, 0.02955047]), 'std_fit_time': array([0.00234381, 0.00048195, 0.00140094, 0.00162232]), 'mean_score_time': array([0.00247908, 0.00247018, 0.00244745, 0.00244482]), 'std_score_time': array([4.81680276e-05, 3.60999287e-05, 4.03044161e-05, 1.54933354e-05]), 'param_C': masked_array(data=[1, 1, 10, 10],\n",
" mask=[False, False, False, False],\n",
" fill_value='?',\n",
" dtype=object), 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2'],\n",
" mask=[False, False, False, False],\n",
" fill_value='?',\n",
" dtype=object), 'params': [{'C': 1, 'penalty': 'l1'}, {'C': 1, 'penalty': 'l2'}, {'C': 10, 'penalty': 'l1'}, {'C': 10, 'penalty': 'l2'}], 'split0_test_score': array([0.89788732, 0.88732394, 0.92605634, 0.92253521]), 'split1_test_score': array([0.93309859, 0.92957746, 0.94014085, 0.95774648]), 'split2_test_score': array([0.90070922, 0.92198582, 0.96099291, 0.94326241]), 'mean_test_score': array([0.91058824, 0.91294118, 0.94235294, 0.94117647]), 'std_test_score': array([0.01598684, 0.01840855, 0.01434018, 0.0144667 ]), 'rank_test_score': array([4, 3, 1, 2], dtype=int32)}\n",
"{'C': 10, 'penalty': 'l2'}\n",
"850\n",
"1269 850\n",
"[['2015年1月26日,多氟多化工股份有限公司与李云峰先生签署了《附条件生效的股份认购合同》'\n",
" '2015年1月26日, ner_1002_ 司与 ner_1001_ 峰先生签署了《附条件生效的股份认购合同》' '李云峰' '氟化工' 1]\n",
" ['2、2016年2月5日,深圳市新纶科技股份有限公司与侯毅先'\n",
" '2、2016年2月5日, ner_1004_ 司与 ner_1003_ 毅先' '侯毅' '深圳市新纶科技股份' 0]\n",
" ['2015年10月26日,山东华鹏玻璃股份有限公司与张德华先生签署了附条件生效条件的《股份认购合同》'\n",
" '2015年10月26日, ner_1006_ 司与 ner_1005_ 华先生签署了附条件生效条件的《股份认购合同》' '山东华鹏玻璃'\n",
" '张德华' 1]\n",
" ['2、2015年12月31日,印纪娱乐传媒股份有限公司与肖文革签订了《印纪娱乐传媒股份有限公司非公开发行A股股票之附条件生效的股份认购协议》(以下简称“《附条件生效的股份认购协议》”)'\n",
" '2、2015年12月31日, ner_1008_ 司与 ner_1007_ 革签订了《印纪娱乐传媒股份有限公司非公开发行A股股票之附条件生效的股份认购协议》(以下简称“《附条件生效的股份认购协议》”)'\n",
" '印纪娱乐传媒' '肖文革' 1]\n",
" ['一、金发科技拟与熊海涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收购其所持有的金发小贷13.50%的股份(2,700万股),收购金额为2,837.43万元'\n",
" '一、 ner_1010_ 技拟与 ner_1009_ 涛女士签订《股份转让协议》,协议约定:以每股1.0509元的收购价格,收购其所持有的金发小贷13.50%的股份(2,700万股),收购金额为2,837.43万元'\n",
" '熊海涛' '金发科技' 0]]\n"
]
},
{
"ename": "ValueError",
"evalue": "invalid literal for int() with base 10: '李云峰'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-59-a08d1dfec342>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpred_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpred_results\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 55\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpred_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpred_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpred_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 56\u001b[0m \u001b[0minfo_extract_submit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mner_dict_new\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpred_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mner_dict_new\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpred_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 57\u001b[0m \u001b[0mdf_info_extract_entity\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minfo_extract_entity\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"实体编号\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\"实体名\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: '李云峰'"
]
}
],
"source": [
"# 建立分类器进行分类\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn import preprocessing\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"# TODO:定义需要遍历的参数\n",
"parameters = { 'penalty':('l1', 'l2'), 'C':[1, 10]}\n",
"\n",
"# TODO:选择模型\n",
"lr = LogisticRegression(random_state=0)\n",
"clf = GridSearchCV(lr, parameters)\n",
"\n",
"# TODO:利用GridSearchCV搜索最佳参数\n",
"clf.fit(features[:train_num], y[:train_num])\n",
"print(clf.cv_results_)\n",
"best_param = clf.cv_results_[\"params\"][clf.cv_results_[\"rank_test_score\"][0]-1]\n",
"print(best_param)\n",
"# print(clf.cv_results_[\"params\"])\n",
"# print(clf.cv_results_[\"rank_test_score\"])\n",
"\n",
"# TODO:对Test_data进行分类\n",
"print(train_num)\n",
"print(len(features),len(y))\n",
"result = clf.predict(features[train_num:])\n",
"result = result.reshape([len(result),1])\n",
"\n",
"\n",
"# TODO:保存Test_data分类结果\n",
"# 答案提交在submit目录中,命名为info_extract_submit.csv和info_extract_entity.csv。\n",
"# info_extract_entity.csv格式为:第一列是实体编号,第二列是实体名(实体统一的多个实体名用“|”分隔)\n",
"# info_extract_submit.csv格式为:第一列是关系中实体1的编号,第二列为关系中实体2的编号。\n",
"sentenceWithNerIdAndMembers = []\n",
"info_extract_entity = dict()\n",
"info_extract_submit = []\n",
"for sentenceWithNerId in X['ner'].array[train_num:]:\n",
" nerids = []\n",
" for i, ner in enumerate(list(set(re.findall(r'(ner\\_\\d\\d\\d\\d\\_)', sentenceWithNerId)))):\n",
" if ner[4:8].isdigit() and int(ner[4:8]) not in nerids:\n",
" nerids.append(int(ner[4:8]))\n",
" info_extract_entity[int(ner[4:8])] = ner_dict_reverse_new[int(ner[4:8])]\n",
" entity1 = \"0\"\n",
" entity2 = \"0\"\n",
" if len(nerids) >= 2:\n",
" entity1 = ner_dict_reverse_new[nerids[0]]\n",
" entity2 = ner_dict_reverse_new[nerids[1]]\n",
" sentenceWithNerIdAndMembers.append([sentenceWithNerId,entity1,entity2])\n",
"\n",
"test_sentences = test_data.values[:,1].reshape([len(test_data),1])\n",
"\n",
"pred_results = np.concatenate([test_sentences,sentenceWithNerIdAndMembers,result],axis=1)\n",
"print(pred_results[:5])\n",
"for i in range(len(pred_results)):\n",
" if int(pred_results[i,-1]) == 1 and int(pred_results[i,2]) != 0 and int(pred_results[i,3]) != 0:\n",
" info_extract_submit.append([ner_dict_new[pred_results[i,2]],ner_dict_new[pred_results[i,3]]])\n",
"df_info_extract_entity = pd.DataFrame(list(info_extract_entity.items()),columns=[\"实体编号\",\"实体名\"])\n",
"df_info_extract_submit = pd.DataFrame(info_extract_submit,columns=[\"实体1\",\"实体2\"])\n",
"\n",
"df_info_extract_entity.to_csv(\"../submits/df_info_extract_entity.csv\")\n",
"df_info_extract_submit.to_csv(\"../submits/df_info_extract_submit.csv\")\n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 练习6:操作图数据库\n",
"对关系最好的描述就是用图,那这里就需要使用图数据库,目前最常用的图数据库是noe4j,通过cypher语句就可以操作图数据库的增删改查。可以参考“https://cuiqingcai.com/4778.html”。\n",
"\n",
"本次作业我们使用neo4j作为图数据库,neo4j需要java环境,请先配置好环境。\n",
"\n",
"将我们提出的实体关系插入图数据库,并查询某节点的3层投资关系,即三个节点组成的路径(如果有的话)。如果无法找到3层投资关系,请查询出任意指定节点的投资路径。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"from py2neo import Node, Relationship, Graph\n",
"\n",
"graph = Graph(\n",
" \"http://localhost:7474\", \n",
" username=\"neo4j\", \n",
" password=\"person\"\n",
")\n",
"\n",
"for v in relation_list:\n",
" a = Node('Company', name=v[0])\n",
" b = Node('Company', name=v[1])\n",
" \n",
" # 本次不区分投资方和被投资方,无向图\n",
" r = Relationship(a, 'INVEST', b)\n",
" s = a | b | r\n",
" graph.create(s)\n",
" r = Relationship(b, 'INVEST', a)\n",
" s = a | b | r\n",
" graph.create(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# TODO:查询某节点的3层投资关系\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 步骤4:实体消歧\n",
"解决了实体识别和关系的提取,我们已经完成了一大截,但是我们提取的实体究竟对应知识库中哪个实体呢?下图中,光是“苹果”就对应了13个同名实体。\n",
"<img src=\"../image/baike2.png\", width=340, heigth=480>\n",
"\n",
"在这个问题上,实体消歧旨在解决文本中广泛存在的名称歧义问题,将句中识别的实体与知识库中实体进行匹配,解决实体歧义问题。\n",
"\n",
"\n",
"### 练习7:\n",
"匹配test_data.csv中前25条样本中的人物实体对应的百度百科URL(此部分样本中所有人名均可在百度百科中链接到)。\n",
"\n",
"利用scrapy、beautifulsoup、request等python包对百度百科进行爬虫,判断是否具有一词多义的情况,如果有的话,选择最佳实体进行匹配。\n",
"\n",
"使用URL为‘https://baike.baidu.com/item/’+人名 可以访问百度百科该人名的词条,此处需要根据爬取到的网页识别该词条是否对应多个实体,如下图:\n",
"<img src=\"../image/baike1.png\", width=440, heigth=480>\n",
"如果该词条有对应多个实体,请返回正确匹配的实体URL,例如该示例网页中的‘https://baike.baidu.com/item/陆永/20793929’。\n",
"\n",
"- 提交文件:entity_disambiguation_submit.csv\n",
"- 提交格式:第一列为实体id(与info_extract_submit.csv中id保持一致),第二列为对应URL。\n",
"- 示例:\n",
"\n",
"| 实体编号 | URL |\n",
"| ------ | ------ |\n",
"| 1001 | https://baike.baidu.com/item/陆永/20793929 |\n",
"| 1002 | https://baike.baidu.com/item/王芳/567232 |\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import jieba\n",
"import pandas as pd\n",
"\n",
"# 找出test_data.csv中前25条样本所有的人物名称,以及人物所在文档的上下文内容\n",
"test_data = pd.read_csv('../data/info_extract/test_data.csv', encoding = 'gb2312', header=0)\n",
"\n",
"# 存储人物以及上下文信息(key为人物ID,value为人物名称、人物上下文内容)\n",
"person_name = {}\n",
"\n",
"# 观察上下文的窗口大小\n",
"window = 10 \n",
"\n",
"# 遍历前25条样本\n",
"for i in range(25):\n",
" sentence = copy(test_data.iloc[i, 1])\n",
" words, ners = fool.analysis(sentence)\n",
" ners[0].sort(key=lambda x:x[0], reverse=True)\n",
" for start, end, ner_type, ner_name in ners[0]:\n",
" if ner_type=='person':\n",
" # TODO:提取实体的上下文\n",
" \n",
"\n",
"\n",
"\n",
"# 利用爬虫得到每个人物名称对应的URL\n",
"# TODO:找到每个人物实体的词条内容。\n",
"\n",
"# TODO:将样本中人物上下文与爬取词条结果进行对比,选择最接近的词条。\n",
"\n",
"\n",
"\n",
"# 输出结果\n",
"pd.DataFrame(result_data).to_csv('../submit/entity_disambiguation_submit.csv', index=False)\n"
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
File added
海口
三亚
洋浦经济开发区
文昌
琼海
万宁
儋州
东城区
五指山
定安
屯昌
澄迈
临高
三沙
西城区
崇文区
宣武区
朝阳区
丰台区
石景山区
海淀区
门头沟区
房山区
福州
鼓楼区
台江区
仓山区
马尾区
晋安区
闽侯县
连江县
罗源县
闽清县
永泰县
平潭县
福清市
长乐市
厦门
泉州
漳州
莆田
三明
南平
宁德
通州区
龙岩
顺义区
昌平区
大兴区
怀柔区
平谷区
密云县
延庆县
济南
历下区
市中区
槐荫区
天桥区
历城区
长清区
平阴县
济阳县
商河县
章丘市
高新区
青岛
市南区
市北区
黄岛区
崂山区
城阳区
李沧区
胶州市
即墨市
平度市
莱西市
烟台
潍坊
威海
淄博
临沂
济宁
东营
泰安
日照
德州
菏泽
滨州
枣庄
聊城
莱芜
南昌
九江
景德镇
萍乡
新余
鹰潭
赣州
吉安
宜春
抚州
上饶
南宁
桂林
柳州
北海
玉林
梧州
防城港
钦州
贵港
百色
河池
来宾
崇左
贺州
合肥
瑶海区
庐阳区
蜀山区
包河区
经开区
滨湖新区
新站区
高新区
政务区
北城新区
巢湖市
芜湖
安庆
马鞍山
蚌埠
阜阳
铜陵
滁州
黄山
淮南
六安
宣城
池州
宿州
淮北
亳州
石家庄
廊坊
保定
唐山
秦皇岛
邯郸
沧州
张家口
承德
邢台
衡水
燕郊开发区
郑州
中原区
二七区
管城回族区
金水区
上街区
惠济区
中牟县
巩义市
荥阳市
新密市
新郑市
登封市
洛阳
开封
焦作
南阳
新乡
周口
安阳
平顶山
许昌
信阳
商丘
驻马店
漯河
濮阳
鹤壁
三门峡
济源
邓州
武汉
江岸区
江汉区
硚口区
汉阳区
武昌区
青山区
洪山区
东西湖区
汉南区
蔡甸区
江夏区
黄陂区
新洲区
宜昌
黄石
襄阳
十堰
荆州
荆门
孝感
鄂州
黄冈
随州
咸宁
仙桃
潜江
天门
神农架
恩施
长沙
芙蓉区
天心区
岳麓区
开福区
雨花区
望城区
长沙县
宁乡县
浏阳市
株洲
湘潭
衡阳
岳阳
常德
益阳
郴州
邵阳
怀化
娄底
永州
张家界
湘西
西安
莲湖区
新城区
碑林区
灞桥区
未央区
雁塔区
阎良区
临潼区
长安区
蓝田县
周至县
户县
高陵县
高新技术产业开发区
经济技术开发区
曲江文化新区
浐灞生态区
国家民用航天产业基地
西咸新区
咸阳
宝鸡
铜川
延安
渭南
榆林
汉中
黄浦区
安康
商洛
杨凌
卢湾区
徐汇区
长宁区
静安区
普陀区
闸北区
虹口区
杨浦区
浦东新区
太原
运城
大同
临汾
长治
晋城
阳泉
朔州
闵行区
晋中
忻州
吕梁
宝山区
嘉定区
金山区
松江区
青浦区
奉贤区
崇明县
哈尔滨
道里区
南岗区
道外区
平房区
松北区
香坊区
呼兰区
阿城区
依兰县
方正县
宾县
巴彦县
木兰县
通河县
延寿县
双城市
尚志市
五常市
伊春
绥化
大庆
齐齐哈尔
牡丹江
佳木斯
鸡西
鹤岗
双鸭山
黑河
七台河
大兴安岭
沈阳
大东区
东陵区(浑南新区)
康平县
和平区
皇姑区
沈北新区
沈河区
苏家屯区
铁西区
于洪区
法库县
辽中县
新民市
大连
西岗区
中山区
沙河口区
甘井子区
旅顺口区
金州区
瓦房店市
普兰店市
庄河市
长海县
开发区
高新园区
长兴岛
鞍山
营口
抚顺
锦州
丹东
葫芦岛
本溪
辽阳
铁岭
盘锦
朝阳
阜新
长春
朝阳区
南关区
宽城区
二道区
绿园区
双阳区
经济技术开发区
高新技术产业开发区
净月经济开发区
汽车产业开发区
榆树市
九台市
德惠市
农安县
吉林
辽源
通化
四平
松原
延吉
白山
白城
延边
昆明
五华区
盘龙区
官渡区
西山区
东川区
呈贡区
晋宁县
富民县
宜良县
石林彝族自治县
嵩明县
禄劝县
寻甸县
安宁市
曲靖
玉溪
大理
丽江
红河州
普洱
保山
昭通
文山
西双版纳
德宏
楚雄
临沧
怒江
迪庆
贵阳
遵义
六盘水
安顺
铜仁
毕节
黔西南
黔东南
黔南
兰州
金昌
嘉峪关
酒泉
天水
武威
白银
张掖
平凉
定西
陇南
庆阳
临夏
甘南
呼和浩特
赤峰
包头
通辽
鄂尔多斯
巴彦淖尔
乌海
呼伦贝尔
乌兰察布
兴安盟
锡林郭勒盟
阿拉善盟
银川
吴忠
中卫
石嘴山
固原
拉萨
日喀则
林芝
山南
昌都
那曲
阿里
广州
越秀区
荔湾区
海珠区
天河区
白云区
黄埔区
番禺区
花都区
南沙区
萝岗区
增城
从化
惠州
汕头
珠海
佛山
中山
东莞
莞城街道
南城街道
东城街道
万江街道
石碣镇
石龙镇
茶山镇
石排镇
企石镇
横沥镇
桥头镇
谢岗镇
东坑镇
常平镇
寮步镇
大朗镇
麻涌镇
中堂镇
高埗镇
樟木头镇
大岭山镇
望牛墩镇
黄江镇
洪梅镇
清溪镇
沙田镇
道滘镇
塘厦镇
虎门镇
厚街镇
凤岗镇
长安镇
乌鲁木齐
克拉玛依
喀什地区
伊犁
阿克苏
哈密
石河子
阿拉尔
五家渠
图木舒克
昌吉
阿勒泰
吐鲁番
塔城
和田
克孜勒苏柯尔克孜
巴音郭楞
博尔塔拉
韶关
江门
湛江
肇庆
清远
潮州
西宁
海东
海西
海北
黄南
海南
果洛
玉树
河源
揭阳
茂名
汕尾
顺德
梅州
开平
阳江
云浮
福田区
罗湖区
南山区
盐田区
宝安区
龙岗区
光明新区
坪山新区
大鹏新区
龙华新区
和平区
河东区
河西区
南开区
河北区
红桥区
东丽区
西青区
津南区
北辰区
武清区
宝坻区
滨海新区
宁河县
静海县
蓟县
渝中区
大渡口区
江北区
沙坪坝区
合川区
渝北区
永川区
巴南区
南川区
九龙坡区
万州区
涪陵区
黔江区
南岸区
北碚区
长寿区
江津区
綦江区
潼南县
铜梁县
大足区
荣昌县
璧山县
垫江县
丰都县
忠县
石柱县
城口县
彭水县
梁平县
酉阳县
开县
秀山县
巫溪县
巫山县
奉节县
武隆县
云阳县
南京
玄武区
白下区
秦淮区
建邺区
鼓楼区
下关区
浦口区
六合区
栖霞区
雨花台区
江宁区
溧水县
高淳县
苏州
姑苏区
虎丘区
吴中区
相城区
吴江区
工业园区
高新区
无锡
崇安区
南长区
北塘区
滨湖区
无锡新区
惠山区
锡山区
宜兴市
江阴市
常州
天宁区
钟楼区
戚墅堰区
新北区
武进区
金坛市
溧阳市
昆山
常熟
扬州
南通
镇江
徐州
连云港
盐城
张家港
太仓
泰州
淮安
宿迁
丹阳
泰兴
靖江
杭州
拱墅区
上城区
下城区
江干区
西湖区
滨江区
余杭区
萧山区
临安市
富阳市
建德市
桐庐县
淳安县
宁波
海曙区
江东区
江北区
北仑区
镇海区
鄞州区
慈溪市
余姚市
奉化市
宁海县
象山县
温州
绍兴
金华
嘉兴
台州
湖州
丽水
舟山
衢州
义乌
海宁
成都
青羊区
锦江区
金牛区
武侯区
成华区
龙泉驿区
青白江区
新都区
温江区
都江堰市
彭州市
邛崃市
崇州市
金堂县
双流县
郫县
大邑县
蒲江县
新津县
高新区
绵阳
乐山
泸州
德阳
宜宾
自贡
内江
攀枝花
南充
眉山
广安
资阳
遂宁
广元
达州
雅安
西昌
巴中
甘孜
阿坝
凉山
海口市
三亚市
文昌市
琼海市
万宁市
儋州市
东方市
五指山市
定安市
屯昌市
澄迈市
临高市
三沙市
福州市
闽侯县市
连江县市
罗源县市
闽清县市
永泰县市
平潭县市
福清
长乐
厦门市
泉州市
漳州市
莆田市
三明市
南平市
宁德市
龙岩市
密云县市
延庆县市
济南市
平阴县市
济阳县市
商河县市
章丘
青岛市
胶州
即墨
平度
莱西
烟台市
潍坊市
威海市
淄博市
临沂市
济宁市
东营市
泰安市
日照市
德州市
菏泽市
滨州市
枣庄市
聊城市
莱芜市
南昌市
九江市
景德镇市
萍乡市
新余市
鹰潭市
赣州市
吉安市
宜春市
抚州市
上饶市
南宁市
桂林市
柳州市
北海市
玉林市
梧州市
防城港市
钦州市
贵港市
百色市
河池市
来宾市
崇左市
贺州市
合肥市
巢湖
芜湖市
安庆市
马鞍山市
蚌埠市
阜阳市
铜陵市
滁州市
黄山市
淮南市
六安市
宣城市
池州市
宿州市
淮北市
亳州市
石家庄市
廊坊市
保定市
唐山市
秦皇岛市
邯郸市
沧州市
张家口市
承德市
邢台市
衡水市
郑州市
中牟县市
巩义
荥阳
新密
新郑
登封
洛阳市
开封市
焦作市
南阳市
新乡市
周口市
安阳市
平顶山市
许昌市
信阳市
商丘市
驻马店市
漯河市
濮阳市
鹤壁市
三门峡市
济源市
邓州市
武汉市
宜昌市
黄石市
襄阳市
十堰市
荆州市
荆门市
孝感市
鄂州市
黄冈市
随州市
咸宁市
仙桃市
潜江市
天门市
神农架市
恩施市
长沙市
长沙县市
宁乡县市
浏阳
株洲市
湘潭市
衡阳市
岳阳市
常德市
益阳市
郴州市
邵阳市
怀化市
娄底市
永州市
张家界市
湘西市
西安市
蓝田县市
周至县市
户县市
高陵县市
国家民用航天产业基地市
咸阳市
宝鸡市
铜川市
延安市
渭南市
榆林市
汉中市
安康市
商洛市
杨凌市
太原市
运城市
大同市
临汾市
长治市
晋城市
阳泉市
朔州市
晋中市
忻州市
吕梁市
崇明县市
哈尔滨市
依兰县市
方正县市
宾县市
巴彦县市
木兰县市
通河县市
延寿县市
双城
尚志
五常
伊春市
绥化市
大庆市
齐齐哈尔市
牡丹江市
佳木斯市
鸡西市
鹤岗市
双鸭山市
黑河市
七台河市
大兴安岭市
沈阳市
东陵区(浑南新区)市
康平县市
法库县市
辽中县市
新民
大连市
瓦房店
普兰店
庄河
长海县市
长兴岛市
鞍山市
营口市
抚顺市
锦州市
丹东市
葫芦岛市
本溪市
辽阳市
铁岭市
盘锦市
朝阳市
阜新市
长春市
榆树
九台
德惠
农安县市
吉林市
辽源市
通化市
四平市
松原市
延吉市
白山市
白城市
延边市
昆明市
晋宁县市
富民县市
宜良县市
石林彝族自治县市
嵩明县市
禄劝县市
寻甸县市
安宁
曲靖市
玉溪市
大理市
丽江市
红河州市
普洱市
保山市
昭通市
文山市
西双版纳市
德宏市
楚雄市
临沧市
怒江市
迪庆市
贵阳市
遵义市
六盘水市
安顺市
铜仁市
毕节市
黔西南市
黔东南市
黔南市
兰州市
金昌市
嘉峪关市
酒泉市
天水市
武威市
白银市
张掖市
平凉市
定西市
陇南市
庆阳市
临夏市
甘南市
呼和浩特市
赤峰市
包头市
通辽市
鄂尔多斯市
巴彦淖尔市
乌海市
呼伦贝尔市
乌兰察布市
兴安盟市
锡林郭勒盟市
阿拉善盟市
银川市
吴忠市
中卫市
石嘴山市
固原市
拉萨市
日喀则市
林芝市
山南市
昌都市
那曲市
阿里市
广州市
增城市
从化市
惠州市
汕头市
珠海市
佛山市
中山市
东莞市
莞城街道市
南城街道市
东城街道市
万江街道市
石碣镇市
石龙镇市
茶山镇市
石排镇市
企石镇市
横沥镇市
桥头镇市
谢岗镇市
东坑镇市
常平镇市
寮步镇市
大朗镇市
麻涌镇市
中堂镇市
高埗镇市
樟木头镇市
大岭山镇市
望牛墩镇市
黄江镇市
洪梅镇市
清溪镇市
沙田镇市
道滘镇市
塘厦镇市
虎门镇市
厚街镇市
凤岗镇市
长安镇市
乌鲁木齐市
克拉玛依市
伊犁市
阿克苏市
哈密市
石河子市
阿拉尔市
五家渠市
图木舒克市
昌吉市
阿勒泰市
吐鲁番市
塔城市
和田市
克孜勒苏柯尔克孜市
巴音郭楞市
博尔塔拉市
韶关市
江门市
湛江市
肇庆市
清远市
潮州市
西宁市
海东市
海西市
海北市
黄南市
海南市
果洛市
玉树市
河源市
揭阳市
茂名市
汕尾市
顺德市
梅州市
开平市
阳江市
云浮市
宁河县市
静海县市
蓟县市
潼南县市
铜梁县市
荣昌县市
璧山县市
垫江县市
丰都县市
忠县市
石柱县市
城口县市
彭水县市
梁平县市
酉阳县市
开县市
秀山县市
巫溪县市
巫山县市
奉节县市
武隆县市
云阳县市
南京市
溧水县市
高淳县市
苏州市
无锡市
宜兴
江阴
常州市
金坛
溧阳
昆山市
常熟市
扬州市
南通市
镇江市
徐州市
连云港市
盐城市
张家港市
太仓市
泰州市
淮安市
宿迁市
丹阳市
泰兴市
靖江市
杭州市
临安
富阳
建德
桐庐县市
淳安县市
宁波市
慈溪
余姚
奉化
宁海县市
象山县市
温州市
绍兴市
金华市
嘉兴市
台州市
湖州市
丽水市
舟山市
衢州市
义乌市
海宁市
成都市
都江堰
彭州
邛崃
崇州
金堂县市
双流县市
郫县市
大邑县市
蒲江县市
新津县市
绵阳市
乐山市
泸州市
德阳市
宜宾市
自贡市
内江市
攀枝花市
南充市
眉山市
广安市
资阳市
遂宁市
广元市
达州市
雅安市
西昌市
巴中市
甘孜市
阿坝市
凉山市
北京
上海
广东省
深圳
天津
重庆
江苏省
浙江省
四川省
海南省
福建省
山东省
江西省
广西
安徽省
河北省
河南省
湖北省
湖南省
陕西省
山西省
黑龙江省
辽宁省
吉林省
云南省
贵州省
甘肃省
内蒙古
宁夏
西藏
新疆
青海省
香港
澳门
台湾
国外
北京省
上海省
广东
深圳省
天津省
重庆省
江苏
浙江
四川
海南
福建
山东
江西
广西省
安徽
河北
河南
湖北
湖南
陕西
山西
黑龙江
辽宁
吉林
云南
贵州
甘肃
内蒙古省
宁夏省
西藏省
新疆省
青海
香港省
澳门省
台湾省
国外省
控股
分厂
代理
传媒
供电
出版
制药
化纤
区域
发电
合作
咨询
商业
商贸
地产
基金
工业
工程
建筑
技术
投资
担保
旅游
服装
服饰
期货
机械
材料
汽车
港务
焦煤
煤业
煤炭
物流
电商
电器
电子
电气
监理
矿业
研究
科技
管理
置业
能源
药业
营销
装饰
设计
贸易
软件
通信
酒业
金属
金矿
铁矿
铝业
销售
附属
鞋业
飞机
饰品
创业板
实业总
新能源
煤化工
销售分
世界
中介
中心
义齿
乳业
五金
产业
人才
介绍
代理
仪器
仪表
企业
会展
会所
传媒
传播
估价
供应
供热
保护
保洁
保理
信息
健身
储运
光学
光电
公园
典当
养护
内衣
农业
农庄
冲压
刀具
创业
创意
制品
制服
制药
制衣
制造
动力
动漫
包装
化学
化工
医疗
医药
医院
印务
压铸
厨具
发展
发电
口岸
咨询
品牌
商业
商务
商贸
啤酒
器具
器材
回收
园林
园艺
国际
国际
图书
地产
培训
基地
塑料
塑胶
外包
婚庆
学校
安全
安防
定制
实业
家具
家居
家私
家纺
宾馆
展柜
展览
工业
工具
工程
工贸
布艺
幕墙
平台
广告
庄园
应用
座椅
建材
建筑
开关
彩印
影业
影院
征信
快运
快递
成套
房屋
手套
手袋
承包
技术
技术
投资
担保
拍卖
招标
支付
教育
数控
文具
文化
旅游
日化
时装
景观
服务
服装
服饰
期货
木业
机床
机构
机械
机电
材料
板房
染整
标牌
标签
标识
检测
模具
模型
模塑
橡胶
橱柜
正大
水务
水泥
汽贸
汽车
油脂
泵业
洁具
派遣
浆纸
测试
涂料
液压
渔具
游戏
激光
炊具
热电
焦化
煤业
煤业
照明
牧业
物流
物资
特钢
环保
环境
玻璃
珠宝
生化
生物
用具
用品
电力
电器
电子
电机
电梯
电气
电源
电缆
电装
百货
皮具
眼镜
石化
矿业
研发
研究
磨具
礼仪
礼服
种植
科技
科教
科贸
租赁
策划
管业
管桩
管理
箱包
米业
粮油
系统
索具
纤维
纸业
纸品
纺织
组件
织带
织造
经济
经纪
经营
经贸
经销
结构
维修
维护
网络
置业
置地
美容
胶带
能源
航空
船务
艺术
花卉
药业
药店
药房
营养
营造
营销
衬布
装备
装璜
装饰
规划
认证
记帐
记账
设备
设施
设计
证券
评价
评估
诊所
财务
货架
货运
贸易
资本
资源
超市
轮胎
软件
轴承
运输
连锁
通信
通讯
道具
配件
配送
酒业
酒店
采购
金属
鉴定
针织
钓具
钢构
钢管
钢铁
钣金
钻具
铝业
银行
铸造
销售
锁具
锻造
门业
门诊
阀门
防护
陶瓷
附属
雨具
鞋业
鞋服
音响
顾问
食品
食品
餐具
餐饮
饮品
饮料
饰品
饲料
高科
业科技
事务所
云科技
交易所
产业园
享科技
优科技
供应链
保健品
信科技
俱乐部
兴科技
力科技
化妆品
化学品
华科技
原科技
发制品
味食品
图科技
大酒店
学科技
客科技
客食品
工业炉
工艺品
度假村
微电子
房地产
拓科技
新能源
旅行社
日用品
星科技
木家具
机器人
树科技
检验所
棉纺织
欧科技
汇服饰
汇科技
泰实业
润滑油
淘科技
游科技
源实业
煤化工
爱科技
玩科技
电技术
电科技
盛实业
研究所
研究院
碳科技
科工贸
纺织品
美家具
美广告
美建材
联科技
聚科技
脚手架
膜技术
膜科技
膜结构
自动化
芯科技
融投资
视科技
设计院
购科技
贵金属
赢科技
车科技
运物流
进出口
通科技
钢结构
门诊部
零部件
高科技
鼎实业
企业
企业
传媒
传媒
传播
信息
典当
农业
制药
制造
化工
化工
医疗
医药
医院
印刷
咨询
商贸
培训
媒体
实业
实业
实业
家具
家居
工业
工程
工贸
广告
建筑
技术
技术
技术
投资
投资
投资
担保
招标
控股
支付
检测
水泥
照明
牧业
物流
环境
电器
电子
电子
电气
矿业
矿业
科技
科技
科技
科贸
管理
管理
系统
经销
网络
置业
置业
美容
能源
能源
药业
药业
药房
营销
证券
证券
诊所
贸易
软件
金融
银行
销售
销售
顾问
食品
食品
高科
事务所
新能源
宁波分
福建分
苏州分
高科技
高科技
传媒
控股
科技
科技
药业
集团
控股
集团
附属
公司
集团
公司
责任
公司
股份
公司
贸易
公司
有限
公司
人力
资源
工艺
饰品
市场
研究
技术
服务
投资
管理
文化
传媒
物业
管理
电子
商务
管理
咨询
资产
管理
资本
管理
万达
百货
专利
代理
专用
汽车
专用
设备
专用
车辆
中介
服务
中医
医院
中医
诊所
中央
空调
中药
饮片
事务
代理
互动
传媒
互动
娱乐
互动
广告
互动
科技
互动
网络
互通
科技
五金
制品
五金
工具
五金
模具
交易
市场
交通
工程
交通
科技
交通
设备
交通
设施
产业
发展
产业
开发
产业
投资
产品
开发
产品
检测
产品
设计
产品
销售
亮化
工程
人力
资源
人寿
保险
人工
环境
人才
咨询
人造
草坪
人防
设备
仓储
服务
仓储
设备
代理
服务
代理
记帐
代理
记账
代理
销售
仪器
仪表
仪器
制造
仪器
设备
仪表
科技
仪表
设备
企业
发展
企业
咨询
企业
征信
企业
服务
企业
策划
企业
管理
企业
通信
企业
食品
休闲
健身
休闲
娱乐
休闲
用品
优品
科技
会务
服务
会展
服务
会计
事务
会计
代理
会计
咨询
会计
服务
会议
展览
会议
服务
伟业
科技
传动
系统
传动
设备
传媒
发展
传媒
广告
传媒
技术
传媒
投资
传媒
文化
传感
技术
住宅
工业
住宅
设施
体检
管理
体育
产业
体育
健身
体育
发展
体育
器材
体育
文化
体育
服务
体育
用品
体育
科技
体育
策划
体育
管理
体育
设备
体育
设施
供水
设备
保健
服务
保健
用品
保安
服务
保洁
服务
保温
材料
保险
代理
保险
公估
保险
经纪
保险
销售
信息
产业
信息
传媒
信息
传播
信息
咨询
信息
安全
信息
技术
信息
技术
信息
服务
信息
科技
信息
管理
信息
系统
信息
网络
信用
担保
信用
管理
信用
评估
停车
管理
停车
设备
健身
休闲
健身
器材
健身
服务
健身
管理
儿童
娱乐
儿童
摄影
儿童
游乐
儿童
用品
充气
制品
光伏
科技
光学
科技
光电
工程
光电
技术
光电
材料
光电
科技
光电
设备
公关
策划
公关
顾问
公寓
管理
养老
产业
养老
服务
内衣
服饰
内饰
系统
再生
资源
农业
发展
农业
开发
农业
技术
农业
投资
农业
服务
农业
机械
农业
科技
农牧
科技
农牧
设备
冷冻
设备
冷冻
食品
冷却
设备
冷暖
工程
冷暖
设备
冷气
工程
冷气
设备
冷链
物流
净化
工程
净化
技术
净化
科技
净化
设备
净水
科技
净水
设备
出国
咨询
出国
服务
分析
仪器
切削
工具
创业
发展
创业
投资
创业
服务
创业
科技
创客
科技
创展
科技
创意
产业
创意
发展
创意
咨询
创意
家居
创意
广告
创意
文化
创意
科技
创意
设计
创新
科技
创新
软件
制冷
工程
制冷
技术
制冷
科技
制冷
设备
制动
系统
制造
技术
制造
科技
办公
家具
办公
服务
办公
用品
办公
系统
办公
设备
加固
工程
加工
配送
动力
技术
动力
电池
动力
科技
动力
系统
动力
装备
动力
设备
动物
药业
动画
制作
动画
设计
劳保
用品
劳务
分包
劳务
服务
劳务
派遣
勘察
设计
勘测
设计
包装
制品
包装
印刷
包装
印务
包装
工程
包装
材料
包装
用品
包装
科技
包装
设备
包装
设计
化妆
用具
化妆
用品
化学
工业
化学
科技
化学
试剂
化工
产品
化工
原料
化工
实业
化工
材料
化工
科技
化工
设备
化工
贸易
医学
检验
医学
科技
医用
材料
医用
设备
医疗
仪器
医疗
咨询
医疗
器材
医疗
器械
医疗
技术
医疗
投资
医疗
服务
医疗
用品
医疗
电子
医疗
科技
医疗
管理
医疗
系统
医疗
美容
医疗
装备
医疗
设备
医药
化工
医药
发展
医药
咨询
医药
开发
医药
技术
医药
物流
医药
科技
医药
贸易
医药
连锁
医药
销售
医院
管理
卫生
用品
印刷
制品
印刷
包装
印刷
器材
印刷
技术
印刷
材料
印刷
科技
印刷
设计
印务
设计
压力
容器
叉车
销售
发电
设备
口腔
诊所
古典
家具
合成
材料
合金
材料
后勤
管理
咨询
发展
咨询
服务
咨询
监理
咨询
策划
咨询
管理
咨询
设计
咨询
顾问
品牌
传播
品牌
咨询
品牌
策划
品牌
管理
品牌
营销
品牌
设计
品牌
运营
品牌
顾问
商业
保理
商业
发展
商业
广场
商业
投资
商业
服务
商业
管理
商业
运营
商业
连锁
商务
会展
商务
信息
商务
发展
商务
咨询
商务
服务
商务
管理
商务
顾问
商品
交易
商品
经营
商品
贸易
商旅
服务
商标
代理
商用
设备
商贸
发展
嘉业
科技
器材
制造
器材
贸易
园林
工程
园林
建设
园林
景观
园林
绿化
园林
设计
国际
传媒
国际
发展
国际
咨询
国际
商务
国际
商贸
国际
家居
国际
展览
国际
投资
国际
旅游
国际
服装
国际
服饰
国际
物流
国际
科技
国际
租赁
国际
经贸
国际
货运
国际
贸易
图书
发行
图书
文化
图书
销售
图像
技术
图文
制作
图文
设计
土地
估价
土地
评估
在线
广告
在线
科技
地产
代理
地产
开发
地产
投资
地产
控股
地产
经纪
地产
顾问
地理
信息
培训
咨询
培训
服务
基业
科技
基因
技术
基因
科技
基础
工程
基金
管理
基金
销售
塑料
制品
塑料
包装
塑料
技术
塑料
模具
塑料
科技
塑胶
五金
塑胶
制品
塑胶
原料
塑胶
工业
塑胶
模具
塑胶
科技
墙体
材料
复合
材料
外包
服务
外语
培训
天下
广告
天下
科技
天使
投资
妇儿
医院
娱乐
传媒
娱乐
管理
婚介
服务
婚姻
服务
婚庆
服务
婚庆
礼仪
婚礼
服务
婚礼
策划
婚纱
摄影
婚纱
礼服
婴儿
用品
媒介
广告
媒体
广告
媒体
技术
媒体
科技
孕婴
用品
存储
技术
安全
工程
安全
技术
安全
玻璃
安全
科技
安全
系统
安全
设备
安防
工程
安防
技术
安防
电子
安防
设备
实业
投资
实验
仪器
实验
器材
实验
设备
宠物
用品
宠物
食品
室内
装饰
室内
设计
家具
制造
家具
设计
家具
销售
家居
制品
家居
制造
家居
发展
家居
建材
家居
用品
家居
科技
家居
装饰
家居
设计
家居
集成
家居
饰品
家庭
服务
家庭
用品
家政
服务
家用
电器
密封
技术
导航
技术
导航
科技
小额
贷款
居民
服务
展览
工程
展览
策划
展览
装饰
展览
设计
岩土
工程
工业
发展
工业
器材
工业
技术
工业
材料
工业
气体
工业
皮带
工业
科技
工业
装备
工业
设备
工业
设计
工具
制造
工控
设备
工程
发展
工程
咨询
工程
塑料
工程
安装
工程
建设
工程
技术
工程
服务
工程
机械
工程
材料
工程
检测
工程
玻璃
工程
监理
工程
科技
工程
管理
工程
设备
工程
设计
工程
顾问
工艺
制品
工艺
礼品
工艺
饰品
工贸
发展
市场
开发
市场
策划
市场
管理
市场
营销
市场
调查
市场
调研
市场
顾问
市政
工程
市政
建设
幕墙
工程
幕墙
装饰
平面
设计
广告
传媒
广告
传播
广告
制作
广告
发展
广告
器材
广告
展览
广告
工程
广告
材料
广告
标识
广告
策划
广告
装饰
广告
设备
广告
设计
广场
投资
广场
置业
床上
用品
应用
技术
应用
材料
建材
市场
建材
科技
建材
贸易
建材
销售
建筑
劳务
建筑
发展
建筑
咨询
建筑
安装
建筑
工程
建筑
技术
建筑
机械
建筑
材料
建筑
模型
建筑
科技
建筑
系统
建筑
装潢
建筑
装饰
建筑
设计
建设
工程
开关
设备
形象
策划
形象
设计
彩印
包装
彩色
印刷
影像
科技
影城
管理
影视
传媒
影视
制作
影视
动画
影视
广告
影视
投资
影视
科技
影院
管理
影音
科技
征信
服务
微波
技术
心理
咨询
快递
服务
成型
技术
成套
工程
成套
设备
户外
用品
户外
运动
房产
代理
房产
开发
房产
经纪
房屋
中介
房屋
经纪
房屋
销售
手袋
制品
打印
耗材
技术
发展
技术
咨询
技术
培训
技术
工程
技术
开发
技术
服务
技术
检测
技术
研发
技术
研究
技术
设备
投资
发展
投资
咨询
投资
基金
投资
建设
投资
开发
投资
担保
投资
控股
投资
策划
投资
管理
投资
置业
投资
顾问
护理
服务
护理
用品
报关
代理
招标
代理
招标
咨询
按揭
代理
按揭
服务
排气
系统
控制
工程
控制
技术
控制
系统
摄影
器材
摄影
服务
摄影
设计
支付
技术
支付
服务
救援
服务
教学
设备
教育
发展
教育
咨询
教育
图书
教育
培训
教育
开发
教育
技术
教育
投资
教育
文化
教育
服务
教育
科技
教育
管理
教育
设备
数字
传媒
数字
出版
数字
媒体
数字
技术
数字
科技
数字
设备
数据
处理
数据
技术
数据
服务
数据
科技
数控
刀具
数控
技术
数控
机床
数控
机械
数控
科技
数控
设备
数码
产品
数码
印刷
数码
图文
数码
影像
数码
技术
数码
电子
数码
科技
数码
设备
整形
医院
文体
用品
文具
用品
文具
礼品
文化
交流
文化
产业
文化
传媒
文化
传播
文化
创意
文化
发展
文化
咨询
文化
投资
文化
服务
文化
用品
文化
科技
文化
策划
文化
管理
文化
经纪
文化
艺术
文教
用品
新型
建材
新型
材料
新药
开发
旅旅
行社
旅游
发展
旅游
咨询
旅游
开发
旅游
投资
旅游
文化
旅游
服务
旅游
用品
旅游
科技
旅游
管理
旅行
用品
无忧
科技
无线
技术
无线
科技
无限
广告
无限
科技
时尚
商贸
时尚
服饰
时尚
科技
时装
设计
景观
工程
景观
建设
景观
艺术
景观
设计
科技
智能
仪器
智能
仪表
智能
家居
智能
工程
智能
技术
智能
电子
智能
电气
智能
科技
智能
系统
智能
装备
智能
设备
暖通
工程
暖通
设备
有机
农业
有机
食品
有色
金属
服务
发展
服务
咨询
服务
外包
服务
管理
服务
连锁
服装
商贸
服装
服饰
服装
科技
服装
设计
服装
辅料
服装
销售
服饰
发展
服饰
商贸
服饰
实业
服饰
用品
服饰
皮具
服饰
科技
服饰
设计
服饰
贸易
服饰
辅料
服饰
销售
机器
制造
机床
制造
机房
设备
机械
制造
机械
加工
机械
工程
机械
技术
机械
模具
机械
电子
机械
科技
机械
装备
机械
设备
机械
设计
机械
贸易
机械
配件
机电
制造
机电
发展
机电
安装
机电
工程
机电
技术
机电
科技
机电
设备
机电
贸易
材料
制造
材料
开发
材料
技术
材料
科技
材料
销售
条码
技术
条码
科技
标识
制作
标识
工程
标识
技术
标识
标牌
标识
科技
标识
系统
标识
设备
标识
设计
格力
贸易
档案
管理
桥梁
工程
检测
仪器
检测
技术
检测
服务
检测
科技
检测
设备
检测
评价
楼宇
科技
模具
制品
模具
制造
模具
塑胶
模具
技术
模具
科技
模具
配件
模型
科技
模型
设计
模塑
科技
橡胶
制品
母婴
护理
母婴
服务
母婴
用品
气体
设备
气模
制品
水电
工程
汇聚
科技
汽车
修理
汽车
制造
汽车
发展
汽车
实业
汽车
座椅
汽车
技术
汽车
投资
汽车
服务
汽车
模具
汽车
物流
汽车
玻璃
汽车
用品
汽车
电器
汽车
电子
汽车
科技
汽车
租赁
汽车
空调
汽车
系统
汽车
经纪
汽车
维修
汽车
美容
汽车
装备
汽车
装饰
汽车
设备
汽车
设计
汽车
贸易
汽车
部件
汽车
配件
汽车
销售
汽车
附件
汽车
零件
汽车
饰件
汽配
贸易
沟通
广告
法律
咨询
法律
服务
洗涤
服务
洗涤
用品
洗涤
设备
活动
策划
流体
技术
流体
控制
流体
机械
流体
科技
流体
系统
流体
设备
测控
技术
测控
设备
测绘
工程
测绘
技术
测绘
服务
测试
技术
测试
设备
测量
仪器
测量
设备
海外
旅游
海洋
工程
海洋
科技
海洋
食品
涂料
科技
涂装
设备
消费
金融
消防
器材
消防
工程
消防
技术
消防
检测
消防
设备
润滑
技术
液压
技术
液压
机械
液压
科技
液压
设备
清洁
用品
清洗
设备
清真
食品
游乐
设备
游戏
科技
演出
器材
演艺
经纪
演艺
设备
激光
技术
激光
科技
激光
设备
灯光
工程
灯光
设备
热工
设备
热能
技术
热能
设备
焊割
设备
焊接
技术
焊接
材料
焊接
科技
焊接
设备
照明
器材
照明
工程
照明
技术
照明
科技
照明
设备
照明
设计
燃气
设备
牧业
科技
物业
发展
物业
服务
物业
管理
物流
发展
物流
服务
物流
科技
物流
管理
物流
设备
物流
配送
物联
科技
特种
材料
特种
玻璃
玩具
制品
玩具
礼品
玩具
设计
环保
产业
环保
实业
环保
工程
环保
建材
环保
技术
环保
投资
环保
服务
环保
机械
环保
材料
环保
科技
环保
能源
环保
设备
环境
咨询
环境
工程
环境
建设
环境
技术
环境
服务
环境
检测
环境
治理
环境
科技
环境
艺术
环境
设备
环境
设计
现代
农业
玻璃
制品
玻璃
器皿
玻璃
技术
珠宝
销售
珠宝
饰品
珠宝
首饰
理财
咨询
理财
服务
理财
顾问
生化
科技
生命
科技
生态
农业
生态
发展
生态
园林
生态
工程
生态
建设
生态
旅游
生态
科技
生活
商贸
生活
用品
生活
电器
生活
科技
生活
贸易
生活
超市
生物
制品
生物
制药
生物
医药
生物
工程
生物
开发
生物
技术
生物
材料
生物
科技
用品
制造
用品
科技
用品
销售
电力
发展
电力
工程
电力
建设
电力
技术
电力
科技
电力
设备
电力
设计
电动
工具
电动
汽车
电动
科技
电商
发展
电器
制造
电器
科技
电器
设备
电器
配件
电器
销售
电子
产品
电子
信息
电子
制造
电子
口岸
电子
商务
电子
商贸
电子
安全
电子
工程
电子
开发
电子
技术
电子
支付
电子
机械
电子
材料
电子
科技
电子
系统
电子
设备
电子
贸易
电影
院线
电控
设备
电梯
工程
电梯
设备
电气
工程
电气
技术
电气
科技
电气
设备
电源
技术
电源
系统
电源
设备
电线
电缆
电脑
技术
电脑
设备
电脑
软件
电路
科技
畜牧
科技
登记
代理
登记
服务
皮具
制品
监测
技术
监理
咨询
真空
科技
石化
设备
石油
化工
石油
技术
石油
科技
石油
装备
石油
设备
矿山
机械
研究
咨询
研究
开发
礼仪
服务
礼仪
策划
礼品
包装
礼品
贸易
社区
服务
票务
代理
票务
服务
科创
科技
科学
仪器
科学
器材
科技
产业
科技
传媒
科技
信息
科技
南京
科技
发展
科技
咨询
科技
实业
科技
工程
科技
开发
科技
成都
科技
技术
科技
投资
科技
文化
科技
无锡
科技
服务
科技
江苏
科技
研发
科技
管理
科技
网络
科技
设备
科教
仪器
科教
设备
租赁
服务
称重
设备
移动
科技
移动
通信
移民
咨询
移民
顾问
空调
工程
空调
技术
空调
系统
空调
设备
空间
设计
策划
代理
策划
咨询
策划
服务
策划
管理
策划
顾问
管业
科技
管理
发展
管理
咨询
管理
技术
管理
投资
管理
服务
管理
科技
管理
策划
管理
软件
管理
连锁
管理
顾问
管道
制造
管道
技术
管道
设备
箱包
皮具
粉末
冶金
粉末
涂料
粮油
食品
精密
仪器
精密
机械
精细
化工
系统
工程
系统
技术
系统
服务
系统
科技
系统
设备
系统
集成
红木
家具
纤维
制品
纳米
科技
纵横
科技
纸品
包装
纺织
服装
纺织
服饰
纺织
机械
纺织
科技
纺织
贸易
经济
发展
经济
合作
经纪
咨询
经纪
服务
经营
服务
经营
管理
经贸
发展
结构
工程
绝热
材料
绝缘
材料
维修
服务
综合
开发
综合
服务
绿化
工程
绿色
能源
绿色
食品
缝纫
设备
网络
传媒
网络
信息
网络
发展
网络
工程
网络
技术
网络
文化
网络
服务
网络
系统
网络
营销
网络
设备
置业
代理
置业
发展
置业
投资
置业
顾问
置地
投资
羊绒
制品
羊绒
服饰
美化
妆品
美发
用品
美容
仪器
美容
医院
美容
咨询
美容
服务
美容
用品
美容
科技
美容
管理
美容
美体
美容
设备
美容
诊所
美术
设计
翻译
咨询
翻译
服务
联创
科技
联动
科技
股权
投资
能源
发展
能源
工程
能源
开发
能源
技术
能源
投资
能源
科技
能源
管理
自动
控制
自控
技术
自控
系统
自控
设备
致远
科技
舞台
设备
航空
服务
航空
票务
航空
科技
航空
设备
船务
代理
船舶
代理
船舶
制造
船舶
工程
船舶
服务
船舶
科技
船舶
管理
船舶
设备
艺术
传媒
艺术
发展
艺术
咨询
艺术
培训
艺术
工程
艺术
文化
艺术
策划
艺术
设计
节能
工程
节能
建材
节能
技术
节能
服务
节能
材料
节能
环保
节能
科技
节能
设备
节能
门窗
英语
培训
药品
销售
药房
连锁
药物
研发
营销
代理
营销
咨询
营销
服务
营销
策划
营销
管理
营销
顾问
蓝图
科技
融资
担保
融资
租赁
融通
科技
行销
策划
表面
处理
表面
技术
装修
工程
装修
设计
装备
制造
装备
技术
装备
科技
装潢
工程
装潢
设计
装璜
工程
装饰
工程
装饰
工程
装饰
科技
装饰
艺术
装饰
装修
装饰
设计
视听
工程
视听
科技
视听
设备
视觉
传媒
视觉
科技
视觉
艺术
视觉
设计
视频
技术
视频
科技
计算
科技
认证
服务
设备
制造
设备
安装
设备
实业
设备
工程
设备
开发
设备
技术
设备
科技
设备
租赁
设备
维修
设备
贸易
设备
销售
设施
工程
设计
制作
设计
咨询
设计
工程
设计
服务
设计
策划
设计
营造
设计
装饰
设计
顾问
识别
技术
诊断
试剂
试验
仪器
试验
设备
语言
培训
财务
代理
财务
咨询
财务
服务
财务
管理
财务
顾问
财富
商贸
财富
投资
财富
管理
财税
代理
财税
咨询
财税
服务
财税
顾问
货架
制造
货物
运输
货运
代理
货运
服务
质量
检测
贸易
发展
贸易
实业
资产
管理
资产
经营
资产
评估
资本
投资
资本
控股
资本
管理
资源
开发
资源
投资
资源
管理
资讯
信息技术
服务
资讯
科技
起重
设备
超市
连锁
车辆
部件
车辆
配件
转向
系统
轮胎
销售
软件
信息
软件
发展
软件
工程
软件
开发
软件
技术
软件
服务
软件
科技
软件
系统
软件
设计
轴承
制造
输送
设备
达内
科技
过滤
技术
过滤
设备
运动
器材
运动
服饰
运动
用品
运动
科技
运营
服务
运营
管理
运输
代理
运输
服务
远景
科技
连锁
发展
连锁
管理
连锁
经营
连锁
超市
通信
发展
通信
器材
通信
工程
通信
建设
通信
技术
通信
服务
通信
科技
通信
网络
通信
设备
通用
设备
通讯
器材
通讯
工程
通讯
技术
通讯
服务
通讯
科技
通讯
设备
通达
物流
造价
咨询
配套
工程
酒业
营销
酒业
销售
酒店
用品
酒店
管理
酒店
设备
酒类
营销
酒类
销售
重工
机械
金属
制品
金属
制造
金属
加工
金属
工业
金属
材料
金属
科技
金属
结构
金服
科技
金融
投资
金融
控股
金融
服务
金融
科技
金融
租赁
金融
设备
针织
制衣
针织
服饰
钢材
加工
钢铁
贸易
银联
商务
铸造
机械
铸造
材料
销售
代理
销售
服务
销售
管理
锅炉
制造
镀膜
科技
门窗
工程
门窗
幕墙
门窗
科技
门窗
系统
阀门
制造
防护
技术
防护
用品
防护
科技
防护
装备
防护
设备
防水
工程
防水
技术
防水
材料
防火
技术
防爆
电器
防腐
工程
防范
技术
集成
房屋
雕塑
艺术
音响
器材
音响
工程
音响
技术
音响
设备
项目
咨询
项目
投资
项目
管理
顾问
咨询
顾问
服务
风力
发电
风险
管理
飞扬
广告
飞扬
科技
食品
原料
食品
商贸
食品
工业
食品
开发
食品
机械
食品
科技
食品
营销
食品
设备
食品
贸易
食品
配料
食品
销售
食品
饮料
餐厅
食品
餐饮
发展
餐饮
娱乐
餐饮
文化
餐饮
服务
餐饮
管理
餐饮
设备
餐饮
连锁
饮料
食品
饮水
设备
饮食
文化
饮食
服务
饮食
管理
饲料
科技
首饰
包装
香精
香料
驾驶
培训
骨科
医院
高压
开关
高温
材料
世纪
科技
产业
控股
人力
资源
人寿
保险
企业
管理
企业
管理
企业
管理
传媒
广告
传媒
科技
保险
经纪
信息
咨询
信息
技术
信息
技术
信息
服务
信息
科技
信息
科技
信息
科技
信用
管理
养老
保险
养老
服务
农业
科技
农业
科技
创新
科技
动力
科技
医疗
器械
医疗
器械
医疗
投资
医疗
科技
医疗
科技
医疗
设备
医疗
设备
医药
科技
咨询
服务
商业
管理
商业
银行
商务
服务
商务
服务
园林
工程
园林
建设
国际
传媒
国际
投资
国际
物流
国际
贸易
在线
科技
基金
管理
安全
技术
家居
用品
小额
贷款
小额
贷款
工程
建设
工程
技术
工程
技术
工程
机械
广告
传媒
广告
传媒
广告
传播
建材
科技
建筑
劳务
建筑
装饰
建筑
设计
建设
工程
建设
工程
建设
工程
影视
传媒
技术
开发
技术
服务
投资
发展
投资
咨询
投资
开发
投资
控股
投资
控股
投资
顾问
教育
咨询
教育
投资
教育
科技
教育
科技
教育
科技
数字
技术
数字
科技
数据
技术
数据
科技
数码
科技
数码
科技
文化
产业
文化
产业
文化
传媒
文化
传媒
文化
传媒
文化
传播
文化
创意
文化
发展
文化
科技
文化
艺术
科技
智能
技术
智能
技术
智能
装备
智能
设备
服装
服饰
机电
设备
材料
科技
村镇
银行
检测
技术
汽车
技术
汽车
服务
汽车
服务
汽车
科技
汽车
租赁
汽车
贸易
汽车
部件
汽车
部件
汽车
销售
测控
技术
消防
工程
激光
科技
物业
服务
物业
管理
物流
科技
环保
技术
环保
科技
环境
工程
环境
科技
生态
农业
生态
园林
生态
科技
生物
医药
生物
工程
生物
技术
生物
科技
生物
科技
电力
科技
电子
商务
电子
商务
电子
技术
电子
技术
电子
设备
科技
发展
科技
工程
科技
开发
科技
开发
管理
咨询
管理
顾问
精密
机械
系统
集成
网络
技术
网络
技术
网络
服务
网络
科技
网络
科技
联网
科技
能源
技术
能源
科技
节能
技术
节能
科技
营销
策划
营销
策划
融资
担保
融资
担保
融资
租赁
装饰
工程
装饰
工程
装饰
设计
设计
工程
财务
咨询
财富
管理
资产
管理
资产
管理
资产
管理
软件
开发
软件
技术
软件
科技
软件
科技
运营
管理
通信
技术
通信
技术
通讯
技术
酒店
管理
金融
控股
金融
服务
金融
服务
销售
服务
防水
材料
项目
管理
食品
科技
餐饮
管理
餐饮
管理
餐饮
管理
代理
公司
传媒
公司
供电
公司
出版
公司
制药
公司
化纤
公司
区域
公司
发电
公司
合作
公司
咨询
公司
商业
公司
商贸
公司
地产
公司
基金
公司
工业
公司
工程
公司
建筑
公司
技术
公司
投资
公司
担保
公司
旅游
公司
服装
公司
服饰
公司
期货
公司
机械
公司
材料
公司
汽车
公司
港务
公司
焦煤
公司
煤业
公司
煤炭
公司
物流
公司
电商
公司
电器
公司
电子
公司
电气
公司
监理
公司
矿业
公司
研究
公司
科技
公司
管理
公司
置业
公司
能源
公司
药业
公司
营销
公司
装饰
公司
设计
公司
贸易
公司
软件
公司
通信
公司
酒业
公司
金属
公司
金矿
公司
铁矿
公司
铝业
公司
销售
公司
附属
公司
集团
公司
鞋业
公司
飞机
公司
饰品
公司
仅对非常通用的后缀进行删除
ltd
Ltd
limited
.Ltd
Ltd.
LTD
LTD.
.LTD
Co.Ltd
CO.LTD
Co.LTD
CO.Ltd
co.ltd
co.Ltd
Co.
Co
CO.
CO
co.
co
下属
业务
公司
营业部
中心
总部
实验室
研究所
总公司
分公司
子公司
设计院
事务所
集团
控股
责任
附属
有限
股份
分厂
设计院有限公司
国际集团
控股集团
附属公司
集团公司
责任公司
股份公司
贸易公司
有限公司
{
}
,
(
)
.
-
?
@
%
#
$
^
>
<
[
]
\t
\ t
\
/
:
jgklkjgkj
asetgasdgasdgsdgsdfgsdfg
NULL
成功
异常
积极
往来
主导
不良
优秀
其他
丰富
简单
严格
月末
稳定
努力
快速
07年
随时
年会
主动
最新
特殊
现在
明确
两年
各地
定时
经常
半年
平时
周边
一期
多家
之前
耐心
更加
正式
清理
二期
多种
新进
充分
最佳
必须
较强
平衡
进一步
年底
特别
各级
一名
初期
当月
重新
临时性
以后
未来
二次
三年
常用
当天
很大
多年
先进
迅速
适时
月初
一个月
及时发现
几个
第二
最高
一份
整洁
以来
日期
大小
方便
室内
清晰
真实
这份
小型
自我
当时
不足
顺畅
尤其
相对
后来
草拟
户外
首页
清楚
逐步
适当
固定
当日
较为
同步
还要
同行
较大
多项
四个
隐蔽
深刻
两次
相处
最好
细致
一款
踏实
三级
复杂
年初
每次
曾经
单独
区内
密切
独自
三期
对本
联盟
现代
高速
深化
紧密
一位
严谨
正在
短期
下级
完全
三维
许多
新型
及时性
当中
不是
一种
即时
成熟
第一个
里面
分项
原来
这是
广泛
到期
端的
三大
大部分
整齐
尽快
主流
所用
灵活
每季
同比
畅通
亲自
第三
难点
不少
第一名
尽量
唯一
当前
最低
两家
真正
详情
进步
一步
一天
既定
多人
众多
以前
中间
极大
新开
再次
从中
有时
优异
扎实
不错
近期
全新
一部分
会后
第一份
尽可能
贯彻落实
一周
周末
完美
最优
积极参与
最初
特定
偶尔
热爱
多层
年末
初级
三家
很快
当年
相互
四年
相当
省内
几年
余人
第一次
常见
各店
前往
认真完成
著名
该项
每位
月结
生日
本月
五年
同期
首次
逐渐
上述
各部
一个人
这次
仔细
以此
十分
有限
下来
干净
以外
充足
早会
现已
曾多次
明显
万左右
接管
自行
严重
立即
至少
批次
首件
之星
这家
乐观
其间
失效
20人
50人
充实
多方面
如期
本身
成效
五个
完好
本组
舒适
每期
一下
主推
中试
前来
独特
新老
平方
六大
将近
上面
友好
重复
二维
始终
自然
慢慢
来说
五大
一同
精确
一人
职及
快乐
一层
一项
优良
一块
千万
天下
即将
主办
之外
多名
一批
中级
最快
同年
一支
并于
真诚
在内
扩初
七大
今后
别人
强烈
一点
很强
两大
容易
附近
一手
下面
切实
此次
大概
相机
向上
后面
有幸
多方
手中
第一家
勤奋
有利
今年
层次
以往
&#
去年
公里
难度
敏锐
之内
显著
承上启下
平稳
当然
过来
一笔
第四
诚实
大致
这一
分钟
30人
更大
号楼
最近
事后
如实
几乎
下游
过去
到场
日后
若干
第一年
晚上
诸多
这块
或是
同样
三次
轻松
十二
两种
以内
谨慎
坚实
愉快
早上
随后
第二名
不好
这种
平常
流畅
同意
还会
辛苦
强大
协助
处理
协调
跟踪
内部
进度
有效
编写
品质
落实
更新
学习
独立
支持
前期
达成
拓展
改进
参加
后期
针对
熟练
帮助
每天
正常
描述
出现
按时
应收
不同
获得
重要
能够
达到
保持
是否
得到
做到
结合
每周
依据
重大
一定
以上
降低
满足
选择
涉及
临时
加强
持续
出具
一家
符合
取得
现有
做出
目前
直接
最终
认真
发生
后续
增加
系列
长期
填写
其他
月底
至今
促进
形成
一职
线下
正确
多次
状态
每年
最大
遇到
第一
接受
比较
一起
多个
为主
存在
如下
减少
相符
合适
两个
一年
初步
形式
详细
一致
各大
统一
表现
成为
变化
关键
共同
很多
职能
增长
完整
全部
包含
全年
先后
认可
采用
更好
或者
差异
具备
一直
机会
基于
特点
一次
最后
三个
高级
事情
之后
对应
月份
没有
影响
已经
左右
必要
非常
进展
所在
作出
条件
应对
以下
全过程
发送
连续
处理
组织
日常
执行
及时
参与
各项
提供
做好
每月
确保
要求
各类
完善
熟悉
了解
解决
保证
提高
期间
提出
所有
提升
开展
担任
良好
确认
实现
相应
本人
准备
整个
具体
一些
确定
每日
只是
准确
主要
计划
分析
情况
问题
关系
办理
年度
整理
发展
定期
文件
过程
方面
事宜
内容
中心
优化
全面
能力
岗位
职责
调整
标准
合理
建议
专业
规范
整体
电话
代表
汇总
经验
部分
汇报
综合
全国
状况
事项
总结
效果
实际
作业
季度
基础
重点
阶段
个人
意见
方式
运用
方法
原因
利用
范围
数量
基本
交流
交代
目的
水平
......
.....
>
<
_
#
o
-
&
*
~
·
"
.
|
\
/
+
%
?
None
办法
顺利
进行
顺利进行
之间
具有
相关
项目
负责
分配
任务
工作
完成
从事
建立
包括
一个
目标
时间
不断
每个
使用
分别
哎呀
哎哟
俺们
按照
吧哒
罢了
本着
比方
比如
鄙人
彼此
别的
别说
并且
不比
不成
不单
不但
不独
不管
不光
不过
不仅
不拘
不论
不怕
不然
不如
不特
不惟
不问
不只
朝着
趁着
除此之外
除非
除了
此间
此外
从而
但是
当着
的话
等等
叮咚
对于
多少
而况
而且
而是
而外
而言
而已
尔后
反过来
反过来说
反之
非但
非徒
否则
嘎登
各个
各位
各种
各自
根据
故此
固然
关于
果然
果真
哈哈
何处
何况
何时
哼唷
呼哧
还是
还有
换句话说
换言之
极了
及其
及至
即便
即或
即令
即若
即使
几时
既然
既是
继而
加之
假如
假若
假使
鉴于
较之
接着
结果
紧接着
进而
尽管
经过
就是
就是说
具体地说
具体说来
开始
开外
可见
可是
可以
况且
来着
例如
连同
两者
另外
另一方面
慢说
漫说
每当
莫若
某个
某些
哪边
哪儿
哪个
哪里
哪年
哪怕
哪天
哪些
哪样
那边
那儿
那个
那会儿
那里
那么
那么些
那么样
那时
那些
那样
乃至
你们
宁可
宁肯
宁愿
啪达
旁人
凭借
其次
其二
其他
其它
其一
其余
其中
起见
起见
岂但
恰恰相反
前后
前者
然而
然后
然则
人家
任何
任凭
如此
如果
如何
如其
如若
如上所述
若非
若是
上下
尚且
设若
设使
甚而
甚么
甚至
省得
时候
什么
什么样
使得
是的
首先
谁知
顺着
似的
虽然
虽说
虽则
随着
所以
他们
他人
它们
她们
倘或
倘然
倘若
倘使
通过
同时
万一
为何
为了
为什么
为着
嗡嗡
我们
呜呼
乌乎
无论
无宁
毋宁
相对而言
向着
沿
沿着
要不
要不然
要不是
要么
要是
也罢
也好
一般
一旦
一方面
一来
一切
一样
一则
依照
以便
以及
以免
以至
以至于
以致
抑或
因此
因而
因为
由此可见
由于
有的
有关
有些
于是
于是乎
与此同时
与否
与其
越是
云云
再说
再者
在下
咱们
怎么
怎么办
怎么样
怎样
照着
这边
这儿
这个
这会儿
这就是说
这里
这么
这么点儿
这么些
这么样
这时
这些
这样
正如
之类
之所以
之一
只是
只限
只要
只有
至于
诸位
着呢
自从
自个儿
自各儿
自己
自家
自身
综上所述
总的来看
总的来说
总的说来
总而言之
总之
纵令
纵然
纵使
遵照
作为
喔唷
、、、、、、、、、、、、、、、、、、、
?
末##末
哎呀
哎哟
俺们
按照
吧哒
罢了
本着
比方
比如
鄙人
彼此
别的
别说
并且
不比
不成
不单
不但
不独
不管
不光
不过
不仅
不拘
不论
不怕
不然
不如
不特
不惟
不问
不只
朝着
趁着
除此之外
除非
除了
此间
此外
从而
但是
当着
的话
等等
叮咚
对于
多少
而况
而且
而是
而外
而言
而已
尔后
反过来
反过来说
反之
非但
非徒
否则
嘎登
各个
各位
各种
各自
根据
故此
固然
关于
果然
果真
哈哈
何处
何况
何时
哼唷
呼哧
还是
还有
换句话说
换言之
极了
及其
及至
即便
即或
即令
即若
即使
几时
既然
既是
继而
加之
假如
假若
假使
鉴于
较之
接着
结果
紧接着
进而
尽管
经过
就是
就是说
具体地说
具体说来
开始
开外
可见
可是
可以
况且
来着
例如
连同
两者
另外
另一方面
慢说
漫说
每当
莫若
某个
某些
哪边
哪儿
哪个
哪里
哪年
哪怕
哪天
哪些
哪样
那边
那儿
那个
那会儿
那里
那么
那么些
那么样
那时
那些
那样
乃至
你们
宁可
宁肯
宁愿
啪达
旁人
凭借
其次
其二
其他
其它
其一
其余
其中
起见
起见
岂但
恰恰相反
前后
前者
然而
然后
然则
人家
任何
任凭
如此
如果
如何
如其
如若
如上所述
若非
若是
上下
尚且
设若
设使
甚而
甚么
甚至
省得
时候
什么
什么样
使得
是的
首先
谁知
顺着
似的
虽然
虽说
虽则
随着
所以
他们
他人
它们
她们
倘或
倘然
倘若
倘使
通过
同时
万一
为何
为了
为什么
为着
嗡嗡
我们
呜呼
乌乎
无论
无宁
毋宁
相对而言
向着
沿
沿着
要不
要不然
要不是
要么
要是
也罢
也好
一般
一旦
一方面
一来
一切
一样
一则
依照
以便
以及
以免
以至
以至于
以致
抑或
因此
因而
因为
由此可见
由于
有的
有关
有些
于是
于是乎
与此同时
与否
与其
越是
云云
再说
再者
在下
咱们
怎么
怎么办
怎么样
怎样
照着
这边
这儿
这个
这会儿
这就是说
这里
这么
这么点儿
这么些
这么样
这时
这些
这样
正如
之类
之所以
之一
只是
只限
只要
只有
至于
诸位
着呢
自从
自个儿
自各儿
自己
自家
自身
综上所述
总的来看
总的来说
总的说来
总而言之
总之
纵令
纵然
纵使
遵照
作为
喔唷
a
able
about
above
abst
accordance
according
accordingly
across
act
actually
added
adj
adopted
affected
affecting
affects
after
afterwards
again
against
ah
ain't
all
allow
allows
almost
alone
along
already
also
although
always
am
among
amongst
an
and
announce
another
any
anybody
anyhow
anymore
anyone
anything
anyway
anyways
anywhere
apart
apparently
appear
appreciate
appropriate
approximately
are
area
areas
aren
arent
aren't
arise
around
as
a's
aside
ask
asked
asking
asks
associated
at
auth
available
away
awfully
b
back
backed
backing
backs
be
became
because
become
becomes
becoming
been
before
beforehand
began
begin
beginning
beginnings
begins
behind
being
beings
believe
below
beside
besides
best
better
between
beyond
big
biol
both
brief
briefly
but
by
c
ca
came
can
cannot
cant
can't
case
cases
cause
causes
certain
certainly
changes
clear
clearly
c'mon
co
com
come
comes
concerning
consequently
consider
considering
contain
containing
contains
corresponding
could
couldnt
couldn't
course
c's
currently
d
'd
date
definitely
describe
described
despite
did
didn't
differ
different
differently
discuss
do
does
doesn't
doing
done
don't
down
downed
downing
downs
downwards
due
during
e
each
early
ed
edu
effect
eg
eight
eighty
either
else
elsewhere
end
ended
ending
ends
enough
entirely
especially
et
et-al
etc
even
evenly
ever
every
everybody
everyone
everything
everywhere
ex
exactly
example
except
f
face
faces
fact
facts
far
felt
few
ff
fifth
find
finds
first
five
fix
followed
following
follows
for
former
formerly
forth
found
four
from
full
fully
further
furthered
furthering
furthermore
furthers
g
gave
general
generally
get
gets
getting
give
given
gives
giving
go
goes
going
gone
good
goods
got
gotten
great
greater
greatest
greetings
group
grouped
grouping
groups
h
had
hadn't
happens
hardly
has
hasn't
have
haven't
having
he
hed
hello
help
hence
her
here
hereafter
hereby
herein
heres
here's
hereupon
hers
herself
hes
he's
hi
hid
high
higher
highest
him
himself
his
hither
home
hopefully
how
howbeit
however
hundred
i
id
i'd
ie
if
ignored
i'll
im
i'm
immediate
immediately
importance
important
in
inasmuch
inc
include
indeed
index
indicate
indicated
indicates
information
inner
insofar
instead
interest
interested
interesting
interests
into
invention
inward
is
isn't
it
itd
it'd
it'll
its
it's
itself
i've
j
just
k
keep
keeps
kept
keys
kg
kind
km
knew
know
known
knows
l
large
largely
last
lately
later
latest
latter
latterly
least
less
lest
let
lets
let's
like
liked
likely
line
little
'll
long
longer
longest
look
looking
looks
ltd
m
'm
made
mainly
make
makes
making
man
many
may
maybe
me
mean
means
meantime
meanwhile
member
members
men
merely
mg
might
million
miss
ml
more
moreover
most
mostly
mr
mrs
much
mug
must
my
myself
n
na
name
namely
nay
nd
near
nearly
necessarily
necessary
need
needed
needing
needs
neither
never
nevertheless
new
newer
newest
next
nine
ninety
no
nobody
non
none
nonetheless
noone
nor
normally
nos
not
noted
nothing
novel
now
nowhere
n't
number
numbers
o
obtain
obtained
obviously
of
off
often
oh
ok
okay
old
older
oldest
omitted
on
once
one
ones
only
onto
open
opened
opening
opens
or
ord
order
ordered
ordering
orders
other
others
otherwise
ought
our
ours
ourselves
out
outside
over
overall
owing
own
p
page
pages
part
parted
particular
particularly
parting
parts
past
per
perhaps
place
placed
places
please
plus
point
pointed
pointing
points
poorly
possible
possibly
potentially
pp
predominantly
present
presented
presenting
presents
presumably
previously
primarily
probably
problem
problems
promptly
proud
provides
put
puts
q
que
quickly
quite
qv
r
ran
rather
rd
re
're
readily
really
reasonably
recent
recently
ref
refs
regarding
regardless
regards
related
relatively
research
respectively
resulted
resulting
results
right
room
rooms
run
s
's
said
same
saw
say
saying
says
sec
second
secondly
seconds
section
see
seeing
seem
seemed
seeming
seems
seen
sees
self
selves
sensible
sent
serious
seriously
seven
several
shall
she
shed
she'll
shes
should
shouldn't
show
showed
showing
shown
showns
shows
side
sides
significant
significantly
similar
similarly
since
six
slightly
small
smaller
smallest
so
some
somebody
somehow
someone
somethan
something
sometime
sometimes
somewhat
somewhere
soon
sorry
specifically
specified
specify
specifying
state
states
still
stop
strongly
sub
substantially
successfully
such
sufficiently
suggest
sup
sure
t
't
take
taken
taking
tell
tends
th
than
thank
thanks
thanx
that
that'll
thats
that's
that've
the
their
theirs
them
themselves
then
thence
there
thereafter
thereby
thered
therefore
therein
there'll
thereof
therere
theres
there's
thereto
thereupon
there've
these
they
theyd
they'd
they'll
theyre
they're
they've
thing
things
think
thinks
third
this
thorough
thoroughly
those
thou
though
thoughh
thought
thoughts
thousand
three
throug
through
throughout
thru
thus
til
tip
to
today
together
too
took
toward
towards
tried
tries
truly
try
trying
ts
t's
turn
turned
turning
turns
twice
two
u
un
under
unfortunately
unless
unlike
unlikely
until
unto
up
upon
ups
us
use
used
useful
usefully
usefulness
uses
using
usually
uucp
v
value
various
've
very
via
viz
vol
vols
vs
w
want
wanted
wanting
wants
was
wasn't
way
ways
we
wed
we'd
welcome
well
we'll
wells
went
were
we're
weren't
we've
what
whatever
what'll
whats
what's
when
whence
whenever
where
whereafter
whereas
whereby
wherein
wheres
where's
whereupon
wherever
whether
which
while
whim
whither
who
whod
whoever
whole
who'll
whom
whomever
whos
who's
whose
why
widely
will
willing
wish
with
within
without
wonder
won't
words
work
worked
working
works
world
would
wouldn't
www
x
y
year
years
yes
yet
you
youd
you'd
you'll
young
younger
youngest
your
youre
you're
yours
yourself
yourselves
you've
z
zero
LTD.
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
ner1001
ner1002
ner1003
ner1004
ner1005
ner1006
ner1007
ner1008
ner1009
ner1010
ner1011
ner1012
ner1013
ner1014
ner1015
ner1016
ner1017
ner1018
ner1019
ner1020
ner1021
ner1022
ner1023
ner1024
ner1025
ner1026
ner1027
ner1028
ner1029
ner1030
ner1031
ner1032
ner1033
ner1034
ner1035
ner1036
ner1037
ner1038
ner1039
ner1040
ner1041
ner1042
ner1043
ner1044
ner1045
ner1046
ner1047
ner1048
ner1049
ner1050
ner1051
ner1052
ner1053
ner1054
ner1055
ner1056
ner1057
ner1058
ner1059
ner1060
ner1061
ner1062
ner1063
ner1064
ner1065
ner1066
ner1067
ner1068
ner1069
ner1070
ner1071
ner1072
ner1073
ner1074
ner1075
ner1076
ner1077
ner1078
ner1079
ner1080
ner1081
ner1082
ner1083
ner1084
ner1085
ner1086
ner1087
ner1088
ner1089
ner1090
ner1091
ner1092
ner1093
ner1094
ner1095
ner1096
ner1097
ner1098
ner1099
ner1100
ner1101
ner1102
ner1103
ner1104
ner1105
ner1106
ner1107
ner1108
ner1109
ner1110
ner1111
ner1112
ner1113
ner1114
ner1115
ner1116
ner1117
ner1118
ner1119
ner1120
ner1121
ner1122
ner1123
ner1124
ner1125
ner1126
ner1127
ner1128
ner1129
ner1130
ner1131
ner1132
ner1133
ner1134
ner1135
ner1136
ner1137
ner1138
ner1139
ner1140
ner1141
ner1142
ner1143
ner1144
ner1145
ner1146
ner1147
ner1148
ner1149
ner1150
ner1151
ner1152
ner1153
ner1154
ner1155
ner1156
ner1157
ner1158
ner1159
ner1160
ner1161
ner1162
ner1163
ner1164
ner1165
ner1166
ner1167
ner1168
ner1169
ner1170
ner1171
ner1172
ner1173
ner1174
ner1175
ner1176
ner1177
ner1178
ner1179
ner1180
ner1181
ner1182
ner1183
ner1184
ner1185
ner1186
ner1187
ner1188
ner1189
ner1190
ner1191
ner1192
ner1193
ner1194
ner1195
ner1196
ner1197
ner1198
ner1199
ner1200
ner1201
ner1202
ner1203
ner1204
ner1205
ner1206
ner1207
ner1208
ner1209
ner1210
ner1211
ner1212
ner1213
ner1214
ner1215
ner1216
ner1217
ner1218
ner1219
ner1220
ner1221
ner1222
ner1223
ner1224
ner1225
ner1226
ner1227
ner1228
ner1229
ner1230
ner1231
ner1232
ner1233
ner1234
ner1235
ner1236
ner1237
ner1238
ner1239
ner1240
ner1241
ner1242
ner1243
ner1244
ner1245
ner1246
ner1247
ner1248
ner1249
ner1250
ner1251
ner1252
ner1253
ner1254
ner1255
ner1256
ner1257
ner1258
ner1259
ner1260
ner1261
ner1262
ner1263
ner1264
ner1265
ner1266
ner1267
ner1268
ner1269
ner1270
ner1271
ner1272
ner1273
ner1274
ner1275
ner1276
ner1277
ner1278
ner1279
ner1280
ner1281
ner1282
ner1283
ner1284
ner1285
ner1286
ner1287
ner1288
ner1289
ner1290
ner1291
ner1292
ner1293
ner1294
ner1295
ner1296
ner1297
ner1298
ner1299
ner1300
ner1301
ner1302
ner1303
ner1304
ner1305
ner1306
ner1307
ner1308
ner1309
ner1310
ner1311
ner1312
ner1313
ner1314
ner1315
ner1316
ner1317
ner1318
ner1319
ner1320
ner1321
ner1322
ner1323
ner1324
ner1325
ner1326
ner1327
ner1328
ner1329
ner1330
ner1331
ner1332
ner1333
ner1334
ner1335
ner1336
ner1337
ner1338
ner1339
ner1340
ner1341
ner1342
ner1343
ner1344
ner1345
ner1346
ner1347
ner1348
ner1349
ner1350
ner1351
ner1352
ner1353
ner1354
ner1355
ner1356
ner1357
ner1358
ner1359
ner1360
ner1361
ner1362
ner1363
ner1364
ner1365
ner1366
ner1367
ner1368
ner1369
ner1370
ner1371
ner1372
ner1373
ner1374
ner1375
ner1376
ner1377
ner1378
ner1379
ner1380
ner1381
ner1382
ner1383
ner1384
ner1385
ner1386
ner1387
ner1388
ner1389
ner1390
ner1391
ner1392
ner1393
ner1394
ner1395
ner1396
ner1397
ner1398
ner1399
ner1400
ner1401
ner1402
ner1403
ner1404
ner1405
ner1406
ner1407
ner1408
ner1409
ner1410
ner1411
ner1412
ner1413
ner1414
ner1415
ner1416
ner1417
ner1418
ner1419
ner1420
ner1421
ner1422
ner1423
ner1424
ner1425
ner1426
ner1427
ner1428
ner1429
ner1430
ner1431
ner1432
ner1433
ner1434
ner1435
ner1436
ner1437
ner1438
ner1439
ner1440
ner1441
ner1442
ner1443
ner1444
ner1445
ner1446
ner1447
ner1448
ner1449
ner1450
ner1451
ner1452
ner1453
ner1454
ner1455
ner1456
ner1457
ner1458
ner1459
ner1460
ner1461
ner1462
ner1463
ner1464
ner1465
ner1466
ner1467
ner1468
ner1469
ner1470
ner1471
ner1472
ner1473
ner1474
ner1475
ner1476
ner1477
ner1478
ner1479
ner1480
ner1481
ner1482
ner1483
ner1484
ner1485
ner1486
ner1487
ner1488
ner1489
ner1490
ner1491
ner1492
ner1493
ner1494
ner1495
ner1496
ner1497
ner1498
ner1499
ner1500
ner1501
ner1502
ner1503
ner1504
ner1505
ner1506
ner1507
ner1508
ner1509
ner1510
ner1511
ner1512
ner1513
ner1514
ner1515
ner1516
ner1517
ner1518
ner1519
ner1520
ner1521
ner1522
ner1523
ner1524
ner1525
ner1526
ner1527
ner1528
ner1529
ner1530
ner1531
ner1532
ner1533
ner1534
ner1535
ner1536
ner1537
ner1538
ner1539
ner1540
ner1541
ner1542
ner1543
ner1544
ner1545
ner1546
ner1547
ner1548
ner1549
ner1550
ner1551
ner1552
ner1553
ner1554
ner1555
ner1556
ner1557
ner1558
ner1559
ner1560
ner1561
ner1562
ner1563
ner1564
ner1565
ner1566
ner1567
ner1568
ner1569
ner1570
ner1571
ner1572
ner1573
ner1574
ner1575
ner1576
ner1577
ner1578
ner1579
ner1580
ner1581
ner1582
ner1583
ner1584
ner1585
ner1586
ner1587
ner1588
ner1589
ner1590
ner1591
ner1592
ner1593
ner1594
ner1595
ner1596
ner1597
ner1598
ner1599
ner1600
ner1601
ner1602
ner1603
ner1604
ner1605
ner1606
ner1607
ner1608
ner1609
ner1610
ner1611
ner1612
ner1613
ner1614
ner1615
ner1616
ner1617
ner1618
ner1619
ner1620
ner1621
ner1622
ner1623
ner1624
ner1625
ner1626
ner1627
ner1628
ner1629
ner1630
ner1631
ner1632
ner1633
ner1634
ner1635
ner1636
ner1637
ner1638
ner1639
ner1640
ner1641
ner1642
ner1643
ner1644
ner1645
ner1646
ner1647
ner1648
ner1649
ner1650
ner1651
ner1652
ner1653
ner1654
ner1655
ner1656
ner1657
ner1658
ner1659
ner1660
ner1661
ner1662
ner1663
ner1664
ner1665
ner1666
ner1667
ner1668
ner1669
ner1670
ner1671
ner1672
ner1673
ner1674
ner1675
ner1676
ner1677
ner1678
ner1679
ner1680
ner1681
ner1682
ner1683
ner1684
ner1685
ner1686
ner1687
ner1688
ner1689
ner1690
ner1691
ner1692
ner1693
ner1694
ner1695
ner1696
ner1697
ner1698
ner1699
ner1700
ner1701
ner1702
ner1703
ner1704
ner1705
ner1706
ner1707
ner1708
ner1709
ner1710
ner1711
ner1712
ner1713
ner1714
ner1715
ner1716
ner1717
ner1718
ner1719
ner1720
ner1721
ner1722
ner1723
ner1724
ner1725
ner1726
ner1727
ner1728
ner1729
ner1730
ner1731
ner1732
ner1733
ner1734
ner1735
ner1736
ner1737
ner1738
ner1739
ner1740
ner1741
ner1742
ner1743
ner1744
ner1745
ner1746
ner1747
ner1748
ner1749
ner1750
ner1751
ner1752
ner1753
ner1754
ner1755
ner1756
ner1757
ner1758
ner1759
ner1760
ner1761
ner1762
ner1763
ner1764
ner1765
ner1766
ner1767
ner1768
ner1769
ner1770
ner1771
ner1772
ner1773
ner1774
ner1775
ner1776
ner1777
ner1778
ner1779
ner1780
ner1781
ner1782
ner1783
ner1784
ner1785
ner1786
ner1787
ner1788
ner1789
ner1790
ner1791
ner1792
ner1793
ner1794
ner1795
ner1796
ner1797
ner1798
ner1799
ner1800
ner1801
ner1802
ner1803
ner1804
ner1805
ner1806
ner1807
ner1808
ner1809
ner1810
ner1811
ner1812
ner1813
ner1814
ner1815
ner1816
ner1817
ner1818
ner1819
ner1820
ner1821
ner1822
ner1823
ner1824
ner1825
ner1826
ner1827
ner1828
ner1829
ner1830
ner1831
ner1832
ner1833
ner1834
ner1835
ner1836
ner1837
ner1838
ner1839
ner1840
ner1841
ner1842
ner1843
ner1844
ner1845
ner1846
ner1847
ner1848
ner1849
ner1850
ner1851
ner1852
ner1853
ner1854
ner1855
ner1856
ner1857
ner1858
ner1859
ner1860
ner1861
ner1862
ner1863
ner1864
ner1865
ner1866
ner1867
ner1868
ner1869
ner1870
ner1871
ner1872
ner1873
ner1874
ner1875
ner1876
ner1877
ner1878
ner1879
ner1880
ner1881
ner1882
ner1883
ner1884
ner1885
ner1886
ner1887
ner1888
ner1889
ner1890
ner1891
ner1892
ner1893
ner1894
ner1895
ner1896
ner1897
ner1898
ner1899
ner1900
ner1901
ner1902
ner1903
ner1904
ner1905
ner1906
ner1907
ner1908
ner1909
ner1910
ner1911
ner1912
ner1913
ner1914
ner1915
ner1916
ner1917
ner1918
ner1919
ner1920
ner1921
ner1922
ner1923
ner1924
ner1925
ner1926
ner1927
ner1928
ner1929
ner1930
ner1931
ner1932
ner1933
ner1934
ner1935
ner1936
ner1937
ner1938
ner1939
ner1940
ner1941
ner1942
ner1943
ner1944
ner1945
ner1946
ner1947
ner1948
ner1949
ner1950
ner1951
ner1952
ner1953
ner1954
ner1955
ner1956
ner1957
ner1958
ner1959
ner1960
ner1961
ner1962
ner1963
ner1964
ner1965
ner1966
ner1967
ner1968
ner1969
ner1970
ner1971
ner1972
ner1973
ner1974
ner1975
ner1976
ner1977
ner1978
ner1979
ner1980
ner1981
ner1982
ner1983
ner1984
ner1985
ner1986
ner1987
ner1988
ner1989
ner1990
ner1991
ner1992
ner1993
ner1994
ner1995
ner1996
ner1997
ner1998
ner1999
ner2000
ner2001
ner2002
ner2003
ner2004
ner2005
ner2006
ner2007
ner2008
ner2009
ner2010
ner2011
ner2012
ner2013
ner2014
ner2015
ner2016
ner2017
ner2018
ner2019
ner2020
ner2021
ner2022
ner2023
ner2024
ner2025
ner2026
ner2027
ner2028
ner2029
ner2030
ner2031
ner2032
ner2033
ner2034
ner2035
ner2036
ner2037
ner2038
ner2039
ner2040
ner2041
ner2042
ner2043
ner2044
ner2045
ner2046
ner2047
ner2048
ner2049
ner2050
ner2051
ner2052
ner2053
ner2054
ner2055
ner2056
ner2057
ner2058
ner2059
ner2060
ner2061
ner2062
ner2063
ner2064
ner2065
ner2066
ner2067
ner2068
ner2069
ner2070
ner2071
ner2072
ner2073
ner2074
ner2075
ner2076
ner2077
ner2078
ner2079
ner2080
ner2081
ner2082
ner2083
ner2084
ner2085
ner2086
ner2087
ner2088
ner2089
ner2090
ner2091
ner2092
ner2093
ner2094
ner2095
ner2096
ner2097
ner2098
ner2099
ner2100
ner2101
ner2102
ner2103
ner2104
ner2105
ner2106
ner2107
ner2108
ner2109
ner2110
ner2111
ner2112
ner2113
ner2114
ner2115
ner2116
ner2117
ner2118
ner2119
ner2120
ner2121
ner2122
ner2123
ner2124
ner2125
ner2126
ner2127
ner2128
ner2129
ner2130
ner2131
ner2132
ner2133
ner2134
ner2135
ner2136
ner2137
ner2138
ner2139
ner2140
ner2141
ner2142
ner2143
ner2144
ner2145
ner2146
ner2147
ner2148
ner2149
ner2150
ner2151
ner2152
ner2153
ner2154
ner2155
ner2156
ner2157
ner2158
ner2159
ner2160
ner2161
ner2162
ner2163
ner2164
ner2165
ner2166
ner2167
ner2168
ner2169
ner2170
ner2171
ner2172
ner2173
ner2174
ner2175
ner2176
ner2177
ner2178
ner2179
ner2180
ner2181
ner2182
ner2183
ner2184
ner2185
ner2186
ner2187
ner2188
ner2189
ner2190
ner2191
ner2192
ner2193
ner2194
ner2195
ner2196
ner2197
ner2198
ner2199
ner2200
ner2201
ner2202
ner2203
ner2204
ner2205
ner2206
ner2207
ner2208
ner2209
ner2210
ner2211
ner2212
ner2213
ner2214
ner2215
ner2216
ner2217
ner2218
ner2219
ner2220
ner2221
ner2222
ner2223
ner2224
ner2225
ner2226
ner2227
ner2228
ner2229
ner2230
ner2231
ner2232
ner2233
ner2234
ner2235
ner2236
ner2237
ner2238
ner2239
ner2240
ner2241
ner2242
ner2243
ner2244
ner2245
ner2246
ner2247
ner2248
ner2249
ner2250
ner2251
ner2252
ner2253
ner2254
ner2255
ner2256
ner2257
ner2258
ner2259
ner2260
ner2261
ner2262
ner2263
ner2264
ner2265
ner2266
ner2267
ner2268
ner2269
ner2270
ner2271
ner2272
ner2273
ner2274
ner2275
ner2276
ner2277
ner2278
ner2279
ner2280
ner2281
ner2282
ner2283
ner2284
ner2285
ner2286
ner2287
ner2288
ner2289
ner2290
ner2291
ner2292
ner2293
ner2294
ner2295
ner2296
ner2297
ner2298
ner2299
ner2300
ner2301
ner2302
ner2303
ner2304
ner2305
ner2306
ner2307
ner2308
ner2309
ner2310
ner2311
ner2312
ner2313
ner2314
ner2315
ner2316
ner2317
ner2318
ner2319
ner2320
ner2321
ner2322
ner2323
ner2324
ner2325
ner2326
ner2327
ner2328
ner2329
ner2330
ner2331
ner2332
ner2333
ner2334
ner2335
ner2336
ner2337
ner2338
ner2339
ner2340
ner2341
ner2342
ner2343
ner2344
ner2345
ner2346
ner2347
ner2348
ner2349
ner2350
ner2351
ner2352
ner2353
ner2354
ner2355
ner2356
ner2357
ner2358
ner2359
ner2360
ner2361
ner2362
ner2363
ner2364
ner2365
ner2366
ner2367
ner2368
ner2369
ner2370
ner2371
ner2372
ner2373
ner2374
ner2375
ner2376
ner2377
ner2378
ner2379
ner2380
ner2381
ner2382
ner2383
ner2384
ner2385
ner2386
ner2387
ner2388
ner2389
ner2390
ner2391
ner2392
ner2393
ner2394
ner2395
ner2396
ner2397
ner2398
ner2399
ner2400
ner2401
ner2402
ner2403
ner2404
ner2405
ner2406
ner2407
ner2408
ner2409
ner2410
ner2411
ner2412
ner2413
ner2414
ner2415
ner2416
ner2417
ner2418
ner2419
ner2420
ner2421
ner2422
ner2423
ner2424
ner2425
ner2426
ner2427
ner2428
ner2429
ner2430
ner2431
ner2432
ner2433
ner2434
ner2435
ner2436
ner2437
ner2438
ner2439
ner2440
ner2441
ner2442
ner2443
ner2444
ner2445
ner2446
ner2447
ner2448
ner2449
ner2450
ner2451
ner2452
ner2453
ner2454
ner2455
ner2456
ner2457
ner2458
ner2459
ner2460
ner2461
ner2462
ner2463
ner2464
ner2465
ner2466
ner2467
ner2468
ner2469
ner2470
ner2471
ner2472
ner2473
ner2474
ner2475
ner2476
ner2477
ner2478
ner2479
ner2480
ner2481
ner2482
ner2483
ner2484
ner2485
ner2486
ner2487
ner2488
ner2489
ner2490
ner2491
ner2492
ner2493
ner2494
ner2495
ner2496
ner2497
ner2498
ner2499
ner2500
ner2501
ner2502
ner2503
ner2504
ner2505
ner2506
ner2507
ner2508
ner2509
ner2510
ner2511
ner2512
ner2513
ner2514
ner2515
ner2516
ner2517
ner2518
ner2519
ner2520
ner2521
ner2522
ner2523
ner2524
ner2525
ner2526
ner2527
ner2528
ner2529
ner2530
ner2531
ner2532
ner2533
ner2534
ner2535
ner2536
ner2537
ner2538
ner2539
ner2540
ner2541
ner2542
ner2543
ner2544
ner2545
ner2546
ner2547
ner2548
ner2549
ner2550
ner2551
ner2552
ner2553
ner2554
ner2555
ner2556
ner2557
ner2558
ner2559
ner2560
ner2561
ner2562
ner2563
ner2564
ner2565
ner2566
ner2567
ner2568
ner2569
ner2570
ner2571
ner2572
ner2573
ner2574
ner2575
ner2576
ner2577
ner2578
ner2579
ner2580
ner2581
ner2582
ner2583
ner2584
,实体编号,实体名
0,1001,李云峰
1,1002,氟化工
2,1004,深圳市新纶科技股份
3,1003,侯毅
4,1005,张德华
5,1006,山东华鹏玻璃
6,1007,肖文革
7,1008,印纪娱乐传媒
8,1010,金发科技
9,1009,熊海涛
10,1011,宋琳
11,1012,上海新朋实业
12,1013,康力电梯
13,1014,王友林
14,1015,神州易桥100股权
15,1016,彭聪
16,1017,曹飞
17,1018,百川能源
18,1019,颜军
19,1020,珠海欧比特控制工程
20,1021,宋睿
21,1022,成都云图
22,1023,柯塞威
23,1024,上海岩石企业
24,1026,广州阳普医疗科技股份
25,1025,邓冠华
26,1027,金固
27,1028,孙锋峰
28,1029,林奇
29,1030,游族网络
30,1031,江斌
31,1032,厦门金达威集团股份
32,1033,林海峰
33,1034,东方日升新能源
34,1036,郭为
35,1037,神州数码集团股份
36,1035,云科服务
37,1038,吴宏亮
38,1039,浙江唐德影视
39,1042,广博
40,1040,灵云传媒
41,1041,王利平
42,1047,金亚科技股份
43,1044,金亚科技
44,1043,周旭辉
45,1045,天象互动
46,1046,成都天象互动科技
47,1052,天津和达股权投资基金管理合伙企业
48,1049,吴艳
49,1050,浙江奥鑫
50,1051,杭州雄健投资合伙企业
51,1048,汉鼎宇佑互联网
52,1053,深圳市方德智联投资管理
53,1055,杜应流
54,1054,衡胜投资
55,1056,江苏亨通光电
56,1057,崔根良
57,1059,江苏亚太轻合金科技股份
58,1058,周福海
59,1060,谭颂斌
60,1061,广东银禧科技股份
61,1063,山东日科化学
62,1062,赵东日
63,1064,钟烈华
64,1065,广东塔牌集团股份
65,1067,金浦钛业
66,1066,郭金东
67,1068,西水股份
68,1070,南京熊猫电子
69,1069,中国电子财务有限责任
70,1072,腾达建设
71,1071,腾达建设集团股份
72,1074,上海申华风电新能源
73,1073,东投能 源投资
74,1075,西安大雁塔支行
75,1076,中国银行
76,1077, 远东
77,1078,红豆集团
78,1080,深圳威新软件科技
79,1079,金地商置
80,1081,广发银行
81,1082,淮安广发银行分行
82,1084,锐电设计
83,1083,锐电国 际贸易
84,1086,泰格 林纸集团股份
85,1085,泰格林纸
86,1088,大唐国际发电
87,1087,大唐塔山发电有限责任
88,1089,广发证券
89,1090,中航资本
90,1091,中航工业
91,1092,刘梦龙
92,1093,深圳市易尚展示
93,1094,北京市盈科律师
94,1095,国盛证券有限责任
95,1097,中国工商银行
96,1096,沈阳和平支行
97,1099,平安银行
98,1098,广州中石化大厦支行
99,1101,浙江南浔农村商业银行
100,1100,孚支行
101,1103,亿阳集团股份
102,1102,亿阳信通
103,1104,维科
104,1105,宁波维科精华集团股份
105,1107, 誉德能源
106,1106,柯罗尼
107,1108,开封汽博园
108,1109,开封申华汽车博展
109,1110,沈金彦
110,1111,中国信息信托投资公司
111,1112,宁夏隆基
112,1113,上海中国证券登记结算有限责任
113,1114,深圳市梅江南投资
114,1115,上海实
115,1116,上海国际
116,1118,天津 博苑高新材料
117,1117,博苑公 司
118,1119,中国电力建设
119,1120,中国电建
120,1122,辽宁时代万恒
121,1121,王忠岩
122,1123,钱江四桥
123,1124,杭州钱江四桥经营
124,1125,温州民商银行
125,1126,牡丹江恒丰纸业有限责任
126,1127,牡丹江恒丰纸业
127,1128,广东四通集团
128,1129,四通
129,1131,五洲松德联合会计师
130,1130,药业
131,1133,康美保险
132,1132,康美健康保险
133,1134,广州珠江新城支行
134,1135,天津金岸重工
135,1136,天津港
136,1138,用友网络
137,1137,友网络科技股份
138,1140,江苏澄星磷化工
139,1139,澄星
140,1142,东宝实业集团
141,1141,李一奎
142,1144,张园园
143,1143,张燕青
144,1145,浙江富润海茂纺织布艺
145,1146,浙江富润
146,1148,甘肃省农垦房地产开发
147,1147,甘肃省农垦房 产开发
148,1150,嘉兴宜租车 联网科技
149,1149,嘉兴宜租车联网科技
150,1152,方天山农业
151,1151,天山农牧业
152,1153,中远
153,1154,重庆电力
154,1155,国网重庆市电力公司
155,1156,吴丽萍
156,1157,马鞍山山鹰纸业
157,1159,北药
158,1158, 中国华润
159,1161,五
160,1160,蒋衡杰
161,1162, 通策医疗投资
162,1163,通策医疗
163,1164,安盛船务
164,1165,安通物流
165,1166,天安财险
166,1167,陈谋亮
167,1168,江西赣南海欣药业
168,1169,上海浦东发展银行利多
169,1170,杭州上海浦东发展银行分行
170,1171,许望生
171,1173,百联
172,1172,东方商厦
173,1174,南山
174,1175,南山铝业
175,1177,深圳能源集团股份
176,1176,国泰君安
177,1178,中天合创能源有限责任
178,1179,申能
179,1180,吕建明
180,1181,杭州海骏科技
181,1183,南通科技
182,1182,南通科技投资集团股份
183,1184,秦文英
184,1185,美尚生态景观
185,1187,大晟时代文化投资
186,1186,周镇科
187,1188,上海银行浦东 分行
188,1189,上海申达投资
189,1190,王志成
190,1191,兴民智通
191,1193,维力医疗
192,1192,广州维力医疗器械
193,1195,易乘投资
194,1194,张振新
195,1196,东方国兴
196,1197,青鸟华光
197,1199,深圳市中恒泰
198,1198,陈少鞍
199,1201,新潮实业
200,1200,烟台新潮实业
201,1202,西 水
202,1203,深圳基金企业
203,1204,华夏绿色
204,1206,阳泉煤业有限责任
205,1205,天泰
206,1208,浙江金鹰
207,1207,金鹰
208,1209,红 豆网络
209,1210,红豆网络
210,1212,上海奥柏内燃机配件
211,1211,上海崇明奥琰内燃机配件
212,1214,崇明房地产开发
213,1213,上海亚通
214,1216,金桥 B 股
215,1215,上海金桥出口加工区开发
216,1217,甘肃农业科技
217,1218,甘肃天润薯业有限责任
218,1219,永鼎
219,1221,沱牌舍得
220,1220,四川沱牌舍得酒业
221,1222,天堂硅谷
222,1223,天堂硅谷
223,1224,湖北凯乐科技股份
224,1225,凯乐科技
225,1226,甘肃省农垦有限责任
226,1228,瑞华会计师
227,1227,
228,1229,天 安财险
229,1231,苏州天房投资
230,1230,杨杰
231,1233,北京空港科技园区
232,1232,北京天源建筑工程有限责任
233,1234,张德华
234,1236,江苏保千里视像科技集团股份
235,1235,庄敏
236,1237,中国建设银行上海市分行
237,1239,滁州天星
238,1238,合肥天星
239,1240,杨世梁
240,1241,贵州盘江煤层气开发利用有限责任
241,1243,中远集运
242,1242,中散
243,1244,刘觯段
244,1246,东方钢铁电子商务
245,1245,宝钢股份
246,1247,阿波罗
247,1248,秋林
248,1249,1海奥柏内燃机配件
249,1251,桐昆
250,1250,桐昆集团股份 限
251,1252,湖南省分行
252,1253,郴州市城 市建设投资
253,1255,深圳金信诺高新技术
254,1254,黄昌华
255,1256,睿德电子
256,1257,深圳兴飞睿德电子
257,1259,文山电力
258,1258,云南文山电力
259,1261,宋城演艺
260,1260,宁波宋城七弦投资管理
261,1262,蔡鉴蔡
262,1263,李汉华
263,1265,江苏三明新能源
264,1264,三明宿迁新能源浦发银行分行
265,1266,益阳中国农业银行分行
266,1267,中国农业银行
267,1269,李维董
268,1268,萍脊镜姆ǘ
269,1271,海泰
270,1270,伊力特糖业
271,1273,康欣新材
272,1272,康欣新材
273,1274,凯马汽 车
274,1275,山东凯马汽车制造
275,1276,天津振港通信工程
276,1277,重庆润生科技
277,1278,重庆博腾制药科技股份
278,1280,宁夏隆基硅材料
279,1279,李振国
280,1281,中国建设银行
281,1282,北海国发海洋生物产业
282,1283,刘道明
283,1284,美好置业集团股份
284,1285,西水
285,1286,德信担保
286,1287,德润租赁
287,1288,明匠智能
288,1289,川东农场
289,1290,上海农场
290,1292,天津松江
291,1291,松江
292,1293,优材京航
293,1294,中航复材
294,1296,浙江水晶光电科技股份
295,1295,台州星星置业
296,1297,长江财富
297,1298,长江证券
298,1299,孙伟
299,1300,徐潮
300,1302,张洪起
301,1301,鹏翎
302,1303,常州亿晶光电科技
303,1305,齐普 生
304,1304,齐普生
305,1307,江苏法尔胜精细钢绳
306,1306,江苏法尔胜
307,1308,中晶
308,1309,上海投资产经营
309,1310,上海实业
310,1312,上海中建信置业
311,1311,长江精工钢结构
312,1313,阳泉煤业
313,1314,天机械
314,1315,安徽全柴天机械
315,1316,扬州亚星客车
316,1317,亚星客车
317,1318,兰州惠仁
318,1319,陶昀
319,1320,南京医药
320,1321,天业
321,1322,天伟化工
322,1323,河南黄河旋风
323,1324,上海远望谷信息技术
324,1325,顾清
325,1327,白英
326,1326,张福喜
327,1329,长江电力
328,1328,广州集团股份
329,1330,中华人民共和国
330,1332,天津运河城投资
331,1331,刘大庆
332,1333,国核浙核能
333,1335,海能达通信
334,1334,陈清州
335,1336,秋 林
336,1337,深圳市远望谷信息技术
337,1339,上海汽车工业
338,1338,长江养老保险股 份
339,1340,金洲管道
340,1341,北京富贵花开投资管理
341,1343,成都天翔环境
342,1342,杭州欧盛腾水技术
343,1344,华远地产
344,1346,山东矿机集团股份
345,1345,赵华涛
346,1348,福建纳川管材科技股份
347,1347,陈志江
348,1349,桐乡市临杭经济区新市镇开发建设
349,1350,中国电建华东勘测设计研究院公 司
350,1352,吉祥创赢
351,1351,吉发 智盈
352,1353,黄金
353,1354,北京福田戴姆勒汽车
354,1356,沧州 大化
355,1355,沧州 大化
356,1358,德稻资产
357,1357,北京银杏树信息技术服务
358,1359,马平
359,1360,上海皓石资产管理
360,1362,罗顿发
361,1361, 罗顿
362,1363,物产
363,1364,浙江物产
364,1365,天津环球磁卡
365,1366,天津磁卡
366,1367,华北电力科学院有限责任
367,1369,联明
368,1368,上海联明机械
369,1370,江西江中物业有限责任
370,1371,江地产
371,1372,兰州惠仁
372,1373,安徽山 鹰纸业
373,1374,安徽山鹰纸业
374,1375,廊坊银行
375,1377,黄茂如
376,1376,中兆投资管理
377,1379,宁波建乐建筑装潢
378,1378,浙江置华建设
379,1380,陈俊
380,1381,河南黄河旋风股
381,1383,申华东投新能源投资
382,1382,申华东投
383,1385,内蒙古伊利实业集团
384,1384,黑龙江伊利乳业有限责任
385,1386,新华联
386,1387,新华联文化旅游
387,1389,深圳威新
388,1388,深圳威
389,1390,唐球
390,1391,深圳市赢时胜信息技术
391,1393,上海大湖优势投资管理中心
392,1392,福州百 洋海味食品
393,1394,中航 复材
394,1396,飞乐
395,1395,仪电电子
396,1397,中国电子科技海洋信息技术研究院
397,1398,太极计算机
398,1399,苏州市苏地
399,1401,唐山中润
400,1400,开滦财务
401,1403,南方汇通
402,1402,蔡志奇
403,1404,蕴通财富
404,1405,广州交通银行 白云支行
405,1406,黄海造船
406,1407,渤海轮渡
407,1408,桐昆集团股份
408,1409,桐昆控
409,1410,苏州高新创业投资
410,1411,苏州新区高新技术产业
411,1412,安智勇
412,1414,优材京航部
413,1413,优材京航
414,1416,上海德稻集群文化创意产业
415,1415,李维
416,1417,方大锦化化工科技股份
417,1418,方大炭素新材料 科技股份
418,1420,杭州凤侠
419,1419,凤凰数媒
420,1421,汇利丰
421,1422,农业银行
422,1423,西安咸宁中国银行路支行
423,1424,陕西神渭管道运输有限责任
424,1425,佛山电器照明
425,1426,方佑昌灯光器材
426,1427,浙江东日
427,1428,陈星题
428,1429,格林美
429,1431,东海证券
430,1430,天
431,1432,深圳兴飞
432,1434,岳阳林纸
433,1433,恒泰房地产
434,1436,建信 资本管理有限责任
435,1435,建信资本
436,1437,崇明奥琰
437,1439,杭州中恒电气
438,1438,朱国锭
439,1441,台州刚泰黄金饰品
440,1440,赵瑞俊
441,1442,徐贺明
442,1443,唐山中润煤化工
443,1444,宁武榆 树坡煤业
444,1445,华润赛科
445,1446,四川大西洋焊接材料
446,1447,大西洋
447,1448,雅戈尔集团
448,1449,雅戈尔
449,1451,上海大西洋焊接材料有限责任
450,1450,李欣雨
451,1453,王进飞
452,1452,南京奥特佳
453,1454,远东
454,1455,李洁
455,1456, 秋林
456,1457,盘江
457,1458,杭州汇智间
458,1459,吉林敖东药业集团股份
459,1460,哈尔滨秋林集团股份
460,1461,华林证券
461,1463,上海锐珩投资管理
462,1462,上海锐翎投资管理
463,1464,哈尔滨天津银行西青支行
464,1465,伊利
465,1466,张忠公司
466,1468,杨川
467,1467,孟寰
468,1470,上海东浩环保装备
469,1469,东浩
470,1471,株洲市金爽资产有限责任
471,1472,株洲湖南华升雪松
472,1473,德新 景
473,1474,绵世方达
474,1476,浙江星星科技股份
475,1475,叶仙玉
476,1478,涪陵区重庆市峡星电力勘察设计
477,1477,峡星
478,1480,中远集装箱运输
479,1479,中远散货运输
480,1481,陈燕
481,1482,河南羚锐制药
482,1483,双鹿实业
483,1484,陈士良
484,1486,上海申达股 份
485,1485,上海申达
486,1487,上汽
487,1488,德勤华永会计师
488,1490,申华
489,1489,上海申华
490,1492,民盛金科
491,1491,浙江泰晟新材料科技
492,1494,维格娜丝
493,1493, 维格娜丝时装
494,1496,深圳市尚荣医疗
495,1495,梁桂秋
496,1498,广东明珠集团股份
497,1497,广东润房地产投资
498,1500,新疆银龙
499,1499,银龙
500,1501,湖北康欣新材料科技有限责任
501,1502,黎阳装备
502,1503,贵州黎阳装备科技
503,1504,邢舫
504,1505,云图科技
505,1507,杭州浙银汇智资本管理公 司
506,1506,贵州 盘江煤层气开发利用有限责任
507,1509,浙江义乌购电子商务
508,1508,浙江稠 州商业银行
509,1510,邢翰学
510,1511,浙江开尔新材料
511,1512,上海轮胎
512,1513,双钱
513,1514,安徽 区域
514,1515,上海飞乐音响
515,1516,武汉海融
516,1517,北京华联商厦
517,1518,财务
518,1519,陈虹
519,1520,上海 国际
520,1521,上海国际投资
521,1523,上海大众企业管理
522,1522,大众交通
523,1524,安盛
524,1525,榆树坡
525,1526,天然
526,1527,福星
527,1528,湖北福星科技股份
528,1530,徐涛明
529,1529,吉蔚娣
530,1531,郑州煤矿机械集团股份Zhengzhou Coal Mining Machinery Group
531,1532,中铭国际
532,1533,博立信支付
533,1534,钟化
534,1536,上海北特科技股份
535,1535,靳晓堂
536,1537,竞缘咀什
537,1538,山西漳泽电力
538,1539,同煤
539,1541,宏昌电子
540,1540,宏昌电子材料
541,1542,鼎力租赁
542,1544,天津博苑高新材料
543,1543,李春刚
544,1545,连云港亚邦龙涛置业
545,1546,江苏亚邦染料
546,1547,中航高科
547,1548,王仁飞
548,1549,绍兴上虞口腔医院
549,1550,鼎欣房产
550,1551,山东黄金
551,1552,山东黄金矿业
552,1554,天科技
553,1553,江东金具
554,1555,李慧慧
555,1556,浙江济民制药
556,1558,蓝星新材
557,1557,上海中国证券登记结算有限责任分
558,1559,诸暨富润染整
559,1560,陈喜彬
560,1561,上投
561,1562,贺国英
562,1563,华斯
563,1565,万家文化
564,1564,浙江万好万家文化
565,1567,四川路桥
566,1566,铁能电力公司
567,1569,精铸
568,1568,中航租赁
569,1570,山东 黄金
570,1571, 浙电力
571,1572,国家核电技术
572,1574,长江通信
573,1573,武汉长江通信产业集团股份
574,1576,南通耀荣玻璃股份有限
575,1575,南通耀荣玻璃
576,1577,交通银行
577,1579,浙报数字文化集团股份
578,1578,浙报
579,1580,柳州医药
580,1581,广西柳州医药
581,1583,浙江康恩贝制药
582,1582,朱麟
583,1584,烟台大地房地产开发
584,1585,申达
585,1586,上海东洲资产评估
586,1588,浙江东日
587,1587, 现代集团
588,1589,赵笃学
589,1590,王甫
590,1592,唐山航岛海洋重工
591,1591,袁晓纪住
592,1593,长城国融
593,1594,黑化
594,1596,河北衡水老白干酒业
595,1595,河北冀衡化学
596,1598,福建省福能龙安热电
597,1597,黄友星5
598,1599,张耀平
599,1600,内蒙古神舟硅业有限责任
600,1601,邹炳德
601,1602,美康生物科技股份
602,1604,红豆
603,1603,江苏红豆实业
604,1605,中国诚通
605,1606,北京正行通资产评估
606,1608,郑州光大银行纬二路 支行
607,1607,光大银行
608,1610,老百姓药房连锁
609,1609,湖南老百姓医药投资管理
610,1611,罗泾电厂
611,1612,西北格尔木
612,1613,中国电建西北勘测设计研究院 限
613,1614,南京栖霞建设
614,1615,刘健君
615,1616,安徽中威光电材料
616,1618,华能国际电力
617,1617,湖北华能应城热电有限责任
618,1620,江苏阳光云亭热电
619,1619,江阴云亭热力
620,1621,尤志安
621,1622,河南安智勇实业集团
622,1623,甘肃亚盛实业
623,1624,亚盛
624,1625,交通银行 内蒙古自治区分行
625,1626,扬州阿波罗蓄电池
626,1627,沈阳五爱支行
627,1628,中国光大银行
628,1629,石幼文
629,1630,北京工业投资管理
630,1631,山鹰
631,1632,安徽众志会计师
632,1633,浙江省物产
633,1634,浙江物产元通集团股份
634,1635,深圳兴飞所
635,1636,王迅
636,1637,北京长翔新能源投资
637,1638,浙商保险
638,1640,南京康尼精密机械
639,1639,高文明
640,1641,德新景
641,1642,天津松江
642,1644,湖南天润数字娱乐文化传媒
643,1643,广东恒润互兴资产管理
,实体1,实体2
0,1001,1002
1,1005,1006
2,1007,1008
3,1011,1012
4,1017,1018
5,1019,1020
6,1021,1022
7,1027,1028
8,1001,1002
9,1031,1032
10,1036,1037
11,1038,1039
12,1052,1049
13,1055,1054
14,1026,1025
15,1056,1057
16,1060,1061
17,1064,1065
18,1067,1066
19,1067,1066
20,1092,1093
21,1140,1139
22,1152,1151
23,1060,1061
24,1195,1194
25,1229,1166
26,1236,1235
27,1255,1254
28,1283,1284
29,1302,1301
30,1324,1325
31,1346,1345
32,1348,1347
33,1352,1351
34,1386,1387
35,1390,1391
36,1428,1429
37,1439,1438
38,1457,1458
39,1476,1475
40,1251,1484
41,1496,1495
42,1527,1528
43,1010,1009
44,1536,1535
45,1538,1539
46,1562,1563
47,1476,1475
48,1579,1578
49,1601,1602
50,1644,1643
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment