如图 正方形ABCD中,点E F,我想把F列的空白格用对应的G列数值填充,并且F列原有数字不可变

ID可变数据教程_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
ID可变数据教程
&&可用于批量做优惠券,工作证
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩17页未读,
定制HR最喜欢的简历
你可能喜欢Excel的F、G、H、I列行中只要有数字,去掉G、H、I列中的空白行后,集中提取_百度知道
Excel的F、G、H、I列行中只要有数字,去掉G、H、I列中的空白行后,集中提取
F、G、H、I列行中只要有数字,去掉G、H、I列中的空白行后,集中提取到J、K、L、M列(如图所示)。我的要求是:不用排序、筛选的方法,请问:用什么函数公式?谢谢!
我有更好的答案
J1输入=INDEX(F:F,SMALL(IF($G$1:$G$16=&&,4^8,ROW($1:$16)),ROW(1:1)))&&&crtl+shift+enter结束公式,向右向下填充
感谢你的正确答案,F、G、H、I列行中数字增加到5000行时,用此数组公式后,增加了CPU运算量,还有什么更好的优化公式方法吗?谢谢!
有现成的筛选你不要用,这个没办法的,因为这是跟你的数据量是息息相关的,必须要每行判断
采纳率:59%
来自团队:
用IF判断,
为您推荐:
其他类似问题
excel的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。数分学长的博客
Workbench可视化工具中提供了菜单化的MySQL数据导入方法,具体步骤如下:
1.在test01数据库中创建emp表空间
# 进入test01数据库
use test01;
# 创建emp表空间
create table emp(
empno int(10),
ename varchar(20),
job varchar(20),
leader int(10),
hiredate datetime(6),
sal float(20),
comm float(20),
deptno int(10)
2.左侧Schemas中选择test01数据库,找到emp表空间
3.右键点击emp表,选择Table Data Import Wizard,弹出Table Data Import界面
4.在Table Data Import界面中,点击Browse选择emp.csv文件并打开
5.点击next后,在use existing table中选择test01.emp
6.点击next后可以看到emp表的数据状态
7.继续点击next直到数据导入成功
8.点击Finsh完成数据导入
9.最后用select语句查看导入的数据表emp,MySQL输入及输出如下
在处理文件时经常需要对文件进行转码,文件编码类型如下表:
多用于英文字母及数字(存储汉字容易报错)
包含:汉字、英文字母、数字及各国通用语言
可变长度的Unicode(最常用)
面向汉字的编码(最少用)
大家可先创建几个ANSI编码类型的测试文件,我们试图将ANSI文件转换为utf-8,相关代码如下:
import pandas as pd
# 最终转换的文件编码格式
coding = 'utf-8'
# 需要修改的文件夹路径
file_dir = 'D:\\test\\'
def run_coding():
for root, dirs, files in os.walk(file_dir, topdown=False):
for i in files:
files_name = os.path.join(root, i)
df1 = pd.read_csv(files_name, encoding='utf-8')
df1 = pd.read_csv(files_name, encoding='gbk')
df1.to_csv(files_name, encoding=coding,index=None)
if __name__ == '__main__':
run_coding()
print("Finish translate")
本文将分别介绍以下几种帆软报表的开发技巧,以达到数分系统能够支持用户交互点击的目的:
1.帆软报表之多页签/自定义布局
2.帆软报表之下钻/筛选功能
· 下钻功能
下钻是指从一级分类切换到二级分类,从概览表切换到明细表的过程。下钻功能展示结果如下:
实现下钻功能步骤如下:
(1)编辑图表选择特效
(2)超级链接中添加JavaScript
(3)在JavaScript脚本中添加代码
var tabPan0=_g().getWidgetByName("tabpane0"); #tabpane0表示要跳转的页签名称
tabPan0.showCardByIndex(1);
var cb_status=_g().getWidgetByName("status"); #status表示需要联动的参数
cb_status.setValue(status);
(4)定义参数status中对应的数据
· 筛选功能
筛选是指依据筛选框内容,图表联动切换。筛选功能展示结果如下:
实现筛选功能步骤如下:
(1)拖动下拉框按钮
(2)设置下拉框控件名称和空间值
(3)创建表格选择数据集时,SQL语句中添加与控件名称一致的参数
由于研发资源紧张,作为产品负责人只有撸起袖子自己做一套可演示的小型数分系统。这时就需要一套报表工具、一个数据库和些许JS基础,博主选择帆软报表作为主要开发工具,基础功能在此不再赘述,大家可以自行注册观看帆软学习教程。
本文将分别介绍以下几种帆软报表的开发技巧,以达到数分系统能够支持用户交互点击的目的:
1.帆软报表之多页签/自定义布局
2.帆软报表之下钻/筛选功能
多页签是指同一张报表中有多个页签可以来回切换。实现多页签的目的主要在于同一个分析主题往往需要多张报表组合而成,因此这些报表需要以页签的方式分布在同一张报表中。多页签展示结果如下:
创建多页签步骤如下:
(1)选择文件-新建决策报表
(2)将tab块拖拽到白色方框内,选择+按钮新增页签
· 自定义布局
自定义布局是指数据图/表及筛选框可以自定义设置大小并安放在不同的位置。创建自定义布局方式如下:
(1)将绝对画布拖拽到白色方框内
(2)点击编辑,在绝对画布中就可以自由的编辑图/表了!
最近分析客户偏好的时候用到了因子分析,感觉是NLP与机器学习一个不错的结合点,遂在此记录一下。
因子分析的主要目的就是为了降维,意思是将多个字段的值按照不同的权重合为一个字段,其前提条件是需要合并的几个字段具有相关性,百度上有很多关于因子分析的计算公式,大家可以自行搜索一下,本文只给出因子分析的python计算程序。
这是借助因子分子做的客户偏好雷达图:
原始数据集下载地址:yinzifenxi.csv
· 因子分析python程序
import csv
import numpy as np
from sklearn.decomposition import FactorAnalysis
# ==== 读取原始数据集 ====
with open("d:\\yinzifenxi.csv","r") as f: # 读取原始CSV文件路径
data1 = np.loadtxt(f,delimiter=",",skiprows=1)
f = open("d:\\yinzifenxi.csv","r")
rows_dict = csv.DictReader(f)
# print(data1) # 打印原文件数据
# ==== 创建空白的CSV文件 ====
fieldnames = ['frequency','avg','coverage','yinzifenxi']
f1 = open("d:\\yinzifenxi1.csv","w",newline='') # 创建一个空白新的CSV文件
writer = csv.DictWriter(f1,fieldnames=fieldnames)
# ==== 因子分析 ====
data = np.array(data1[1:], dtype = np.float64) # 从第二行开始
fa = FactorAnalysis(n_components = 1) # 因子分析参数设置 1表示一维
fa.fit(data) # 因子分子数据输入
tran_data = fa.transform(data)
tran_data1=tran_data[:,0]
# print (tran_data1) # 打印因子分析结果
# ==== 将结果输入到CSV文件 ====
writer.writeheader()
for i,row in enumerate(rows_dict): # 将结果写入CSV
row['yinzifenxi'] = tran_data1[i-1]
writer.writerow(row)
· 因子分析结果
接下来讲一个分组添加序号的问题,场景需求是依据每个文件名分组标识序号,标识以后可以根据序号筛选出每个文件组的前几行,具体形式如下:
上述表格转化为:
想要分组添加序号,需要利用MySQL中@变量功能,具体语句如下:
select * from
(select IF(@file=filename,@rank:=@rank+1,@rank:=1) as topic_rank,
@file:=filename as filename,
from transposition a)
-- 注意:@file变量需要先赋值
transposition数据表创建及导入代码:
-- 创建数据表
create table transposition(
filename varchar(100),
topic varchar(100)
-- 往表中插入数据
insert into transposition values("0849053.txt","临时调额-操作-卡片");
insert into transposition values("0849053.txt","卡片-状态-正常");
insert into transposition values("0849053.txt","卡片-属性-固定额度");
insert into transposition values("0849053.txt","卡片-包含-分期");
insert into transposition values("0849053.txt","卡片-包含-分期");
insert into transposition values("0907432.txt","还款金额-依赖-账单");
insert into transposition values("0907432.txt","账单-条件-正常还款");
insert into transposition values("0907432.txt","账单-条件-全额还款");
insert into transposition values("0907432.txt","账单-条件-全额还款");
insert into transposition values("0907432.txt","账单-依赖-还款");
insert into transposition values("0907432.txt","核实-操作-信息");
insert into transposition values("0907432.txt","卡片-属性-账单分期");
insert into transposition values("0909268.txt","调整-操作-额度");
insert into transposition values("0909268.txt","释放-操作-额度");
insert into transposition values("0909268.txt","额度-依赖-还款");
insert into transposition values("0909268.txt","核实-操作-身份");
insert into transposition values("0909268.txt","账单-依赖-还款");
insert into transposition values("0909268.txt","账单-依赖-还款");
近期在做光大POC项目的时候,遇到了分组转置的问题,场景需求是将每个文件名对应的多行合并到一行,具体形式如下:
上述表格转化为:
想要达到分组转置的效果,需要使用group_concat()函数,具体语句如下:
select filename,
group_concat(topic) as trans_topic
from transpositi
-- 注意:必须使用group by分组
transposition数据表创建及导入代码:
-- 创建数据表
create table transposition(
filename varchar(100),
topic varchar(100)
-- 往表中插入数据
insert into transposition values("0849053.txt","临时调额-操作-卡片");
insert into transposition values("0849053.txt","卡片-状态-正常");
insert into transposition values("0849053.txt","卡片-属性-固定额度");
insert into transposition values("0849053.txt","卡片-包含-分期");
insert into transposition values("0849053.txt","卡片-包含-分期");
insert into transposition values("0907432.txt","还款金额-依赖-账单");
insert into transposition values("0907432.txt","账单-条件-正常还款");
insert into transposition values("0907432.txt","账单-条件-全额还款");
insert into transposition values("0907432.txt","账单-条件-全额还款");
insert into transposition values("0907432.txt","账单-依赖-还款");
insert into transposition values("0907432.txt","核实-操作-信息");
insert into transposition values("0907432.txt","卡片-属性-账单分期");
insert into transposition values("0909268.txt","调整-操作-额度");
insert into transposition values("0909268.txt","释放-操作-额度");
insert into transposition values("0909268.txt","额度-依赖-还款");
insert into transposition values("0909268.txt","核实-操作-身份");
insert into transposition values("0909268.txt","账单-依赖-还款");
insert into transposition values("0909268.txt","账单-依赖-还款");
最近在整理聚类算法的时候偶然发现一个指标——轮廓系数,仔细研究之后发现是一个易于理解的用来评估聚类效果好坏的指标,因此在这里和大家分享一样。轮廓系数的值介于[-1,1]之间,越趋于1代表聚类效果越好,具体计算方法如下:
1. 计算样本i到同簇其他所有样本的平均距离,记为a(i)。a(i)越接近0则表示样本i聚类效果越好。
2. 计算样本i到其他每个簇中所有样本的平均距离,选取平均距离最小的值记为b(i)。b(i)越大则表示样本i聚类效果越好。
3. 计算b(i)与a(i)的极差,除以max{a(i),b(i)},这时就会出现以下3种场景:
4. 判别结果:
若s(i)接近1,则说明样本i聚类合理;
若s(i)接近-1,则样本i更应该分类到另外的簇;
若s(i)接近0,则说明样本i在两个簇的边界上;
注意:轮廓系数相关程序已在Python之 文本聚类中给出,大家可自行研究。
文本聚类/分类算法在自然语言处理中是非常基础但又重要的,其实聚类和分类最大的区别就是需不需要训练样本,因此我们也可以把聚类想象成是一种无监督的分类问题。文本聚类算法相较于结构化数据聚类算法最大的差异就是需要从文本数据中提取关键词,然后将关键词向量化后形成可计算相似度的文本向量矩阵。
语料下载地址:任选部分语料放在D盘yuliao文件夹(新建文件夹)中
Python文本聚类(K-means)程序如下:
import string
import jieba
import logging
import sys
import codecs
import traceback
import pandas as pd
import numpy as np
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans
from collections import Counter
from sklearn import metrics
# ========
数据编码格式转化
def get_text():
base_path = "D:\\yuliao\\"
filelist = os.listdir(base_path) #功能相当于在base_path目录下执行dir命令,返回为list类型
data_dict = {}
f2 = open('D:\\data.txt', 'w',encoding='utf-8')
for files in filelist:
f = open(base_path + files, 'r',encoding='utf-8')
text = f.read().replace('\n', '')
#data_temp = text
# 转换为unicode编码形式
data = ''.join(re.findall(u'[\u4e00-\u9fff]+', text))
# 必须为unicode类型,取出所有中文字符
f2.write(data + '\n')
f2.close()
class TextCluster(object):
# 初始化函数,重写父类函数
def __init__(self):
def seg_words(self, sentence):
seg_list = jieba.cut(sentence)
# 默认是精确模式
return " ".join(seg_list)
# 分词,然后将结果列表形式转换为字符串
# 加载用户词典
def load_userdictfile(self, dict_file):
jieba.load_userdict(dict_file)
def load_processfile(self, process_file):
corpus_list = []
fp = open(process_file, "r",encoding='utf-8')
for line in fp:
conline = line.strip()
corpus_list.append(conline)
return True, corpus_list
logging.error(traceback.format_exc())
return False, "get process file fail"
def output_file(self, out_file, item):
fw = open(out_file, "a")
fw.write('%s' % (item),encoding='utf-8')
fw.close()
logging.error(traceback.format_exc())
return False, "out file fail"
# 释放内存资源
def __del__(self):
def process(self, process_file, tf_ResFileName, tfidf_ResFileName, num_clusters, cluster_ResFileName):
sen_seg_list = []
flag, lines = self.load_processfile(process_file)
if flag == False:
logging.error("load error")
return False, "load error"
for line in lines:
sen_seg_list.append(self.seg_words(line))
# 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
tf_vectorizer = CountVectorizer()
# fit_transform是将文本转为词频矩阵
tf_matrix = tf_vectorizer.fit_transform(sen_seg_list)
tf_weight = tf_matrix.toarray()
# print tf_weight
# 该类会统计每个词语的tf-idf权值
tfidf_transformer = TfidfTransformer()
# fit_transform是计算tf-idf
tfidf_matrix = tfidf_transformer.fit_transform(tf_matrix)
# 获取词袋模型中的所有词语
word_list = tf_vectorizer.get_feature_names()
# 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
tfidf_weight = tfidf_matrix.toarray()
# 打印特征向量文本内容
# print 'Features length: ' + str(len(word_list))
tf_Res = codecs.open(tf_ResFileName, 'w', 'utf-8')
word_list_len = len(word_list)
for num in range(word_list_len):
if num == word_list_len - 1:
tf_Res.write(word_list[num])
tf_Res.write(word_list[num] + '\t')
tf_Res.write('\r\n')
# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(tf_weight)):
# print u"-------这里输出第", i, u"类文本的词语tf-idf权重------"
for j in range(word_list_len):
if j == word_list_len - 1:
tf_Res.write(str(tf_weight[i][j]))
tf_Res.write(str(tf_weight[i][j]) + '\t')
tf_Res.write('\r\n')
tf_Res.close()
# 输出tfidf矩阵
tfidf_Res = codecs.open(tfidf_ResFileName, 'w', 'utf-8')
for num in range(word_list_len):
if num == word_list_len - 1:
tfidf_Res.write(word_list[num])
tfidf_Res.write(word_list[num] + '\t')
tfidf_Res.write('\r\n')
# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(tfidf_weight)):
for j in range(len(word_list)):
if j == word_list_len - 1:
tfidf_Res.write(str(tfidf_weight[i][j]))
tfidf_Res.write(str(tfidf_weight[i][j]) + '\t')
tfidf_Res.write('\r\n')
tfidf_Res.close()
# ========
km = KMeans(n_clusters=num_clusters)
km.fit(tfidf_matrix)
print ("===== 总体轮廓系数 =====")
print (metrics.silhouette_score(tfidf_matrix, km.labels_, metric='euclidean')) #轮廓系数[-1,1]
kas=metrics.silhouette_samples(tfidf_matrix, km.labels_, metric='euclidean') #生成每个文件轮廓系数
print ("===== 每类样本个数 =====")
print (Counter(km.labels_))
# 每类分到多少样本
# print(km.cluster_centers_)
# 每个样本所属的簇
clusterRes = codecs.open(cluster_ResFileName, 'w', 'utf-8')
# 将数据写入文件
a=os.listdir("D:\\yuliao\\")
kas1=kas.tolist()
while count &= len(km.labels_):
clusterRes.write(str(count) +'\t'+a[count-1]+'\t'+str(km.labels_[count - 1])+'\t'+str(kas1[count-1]))
clusterRes.write('\r\n')
count = count + 1
clusterRes.close()
logging.error(traceback.format_exc())
return False, "process fail"
# 输出聚类结果
if __name__ == "__main__":
rootdir = "D:\\"
get_text()
tc = TextCluster()
tc.process(rootdir+"data.txt", rootdir+"tf_Result.txt", rootdir+"tfidf_Result.txt",3, rootdir+"cluster_Result.txt")
# data.txt记录所有数据集,一行是一个文本
# tf_Result.txt记录关键词及对应文本出现频数
# tfidf_Result.txt记录关键词及对应文本重要性
# cluster_Result.txt记录聚类结果文件名+对应类别
程序结果如下:
轮廓系数评估指标可查看:机器学习之聚类评估指标(轮廓系数)
人工智能技术(Artificial Intelligence, AI)的迅猛发展将对我们的生活和工作产生重大影响,许多企业为了在这个快速增长的市场中占有一席之地,不断改变公司发展战略,加大对人工智能技术的投入。尽管现有AI技术仍存在许多不确定性,但关注以下几点企业将会更好地获得盈利:
AI初期盈利暂时受限
第一批AI产品具有共同特点:它们附加在产品功能上,但不直接创造效益。例如一些在线翻译和照片标记服务,或者手机上的数据语音助手,这样的产品功能会增加消费者对于产品的粘性,但不会直接提高或增加收入。未来可能并不是这样,因为更新的收费服务正在进入市场,例如自动汽车,一些消费者可能满足于AI能够实现自动制动的车辆,而另一些消费者则需要更多的功能,例如完全自驾车,即使他们为此必须支付额外的费用。
把重点放在AI成型的行业
政府可以使用AI来扫描监控并识别公共场所的可疑活动,或者使用AI算法来检测潜在的网络攻击。包括无人机在内的许多军事应用也依赖于人工智能。除了安全性之外,AI在交通控制中发挥着重要作用,包括传感器和摄像头,使得光信号根据道路上的汽车数量改变其时间和顺序。与公共部门一样,银行也开始使用AI来检测可疑行为,例如提示洗钱的模式。人工智能算法也可以帮助处理交易和做出决定,通常比人力雇员更为准确。例如,AI算法可能会揭示某些被忽略的特征增加了某个特定交易是欺诈的可能性。在零售方面,人工智能已经在帮助进行盗窃检测,并可能进一步增强自动结账功能。一些零售商正在试行使用照相机和传感器来检测顾客什么时候从商店取货或退货的系统。正如AI价值因行业而异,当供应商计算他们的AI策略时,还是应该把投资集中在哪些愿意成为第一个多米诺骨牌的AI解决方法的潜在消费者身上。
公司需要有端到端的AI解决方案
为了赢得人工智能,企业必须提供跨多个技术层面端到端的解决方案,例如,一家医院宁愿购买一台包含MRI设备和人工智能软件的诊断系统,而不是分别购买这些组件,然后将它们组合在一起工作。除了提高销售额之外,采用端到端解决方案的供应商还可以与客户建立战略立足点,大型硬件和软件公司往往通过收购其他公司来扩大他们的人工智能投资组合,以此完善端到端的解决方案。
AI大部分价值将来自硬件和解决方案
虽然硬件在许多其他领域已经商品化,但这种趋势不会很快达到人工智能,因为在考虑成本的情况下,针对每个AI问题进行优化的硬件将提供更高的性能。例如,针对卷积神经网络优化的加速器对于图像识别是最好的,而针对长短期记忆网络进行优化的加速器更适合语音识别和语言翻译。每个用例的要求稍有不同,都会导致每个用例需要部分定制的硬件。AI解决方案的价值将来自服务,其中包括解决方案和用例。系统集成商通常可以直接访问客户,通过将解决方案集中在所有层次上来获取大部分收益。
特定的硬件体系结构将是云计算和边缘计算的关键区别
随着人工智能的发展,硬件再次被捧上热潮,鉴于数据量的规模,云将继续成为许多应用程序青睐的选择。在云硬件中,客户和供应商在图形处理单元(GPU)上偏好专用集成电路(ASIC)技术,市场可能已然分散。在这方面,ASIC将赢得消费者的青睐,因为它们为许多应用提供了更优质的用户体验,更低的功耗和更高的处理能力。
如果企业延迟两到三年再来建立一套完善的人工智能战略,便很难在这个快速发展的市场中获得一席之地。大多数企业都知道风险的价值,愿意开拓进取,但缺乏强有力的战略。相信以上几个方面将为众多期望进军AI的公司带来全新的视野。
参考文献:
Artificial intelligence: The time to act is now
在清洗数据的时候,经常会遇到剔除多余列/行的问题,行剔除在文本拆分的时候已经教给大家,这里主要来说一下剔除多余列。
原始数据下载地址:t.wav
Python 剔除多余列程序如下:
filepath = "d:/t.wav"
file = open(filepath, "r", encoding="utf-8").readlines()
for line in file:
a = [line.strip().split("\t")[-2:]]
[-2:]表示保留倒数两行,注意加[]形成列表,方便后续遍历
for l in a:
# 修正列表格式
print("\t".join(l))
输出结果如下
要先办不回来十三 坐席
啊那个 客户
账单还有一个因为广发卡还一共是工商的好像可以然后点击一下如果是将那个他他维修刚才那个我们一个月二千股具体到您以后可以高一点是到期还也可以块八的分期给您的然后这个啊这个案子完了小而专一张保单给人对都是暗提升网站了刚办人家有新一百万咱们能改 坐席
嗯嘛这个什么时候的啊 客户
因为因为想要办你帮我点进去还是三个三笔赔到位就行财网在看了 坐席
啊麻烦所以 客户
您因为您这个块钱其他方面的呢 坐席
嗯我想想确认一下这张卡嘛我都这样啊 客户
工作中经常会遇到用split()函数切分字符串的问题,但有时我们会看到一段话中有多种符号用来分隔,例如”字段1,字段2*字段3|字段4”,这时我们就需要借助re正则表达式包来实现多分隔符切割原始数据的方法。
Python 多分隔符切分数据程序如下:
text = "字段1,字段2*字段3|字段4"
list = re.split("[,*|]",text)
print(list)
# 输出结果如下
['字段1', '字段2', '字段3', '字段4']
# 若需要剔除字段1,可直接写
text = "字段1,字段2*字段3|字段4"
list = re.split("[,*|]",text)
print(list[1:4])
# 输出结果如下
['字段2', '字段3', '字段4']
关于摘要抽取共有两种研究方向:抽取式摘要和生成式摘要,现阶段市面上接触到的大多是抽取式摘要,而生成式摘要还属于实验室阶段。因此这里只介绍抽取式摘要的一种算法TextRank,我们之前了解过TextRank基于投票机制可以提取关键词,而这里我们可以想象利用投票机制提取关键句子从而形成摘要。
语料下载地址:textrank_test.txt
Python抽取式摘要(TextRank)程序如下:
textrank4zh import TextRank4Sentence
text = open("d:\\textrank_test.txt","r",encoding="utf-8").read()
sentence = TextRank4Sentence()
sentence.analyze(text,lower = True)
s_list = sentence.get_key_sentences(num = 3,sentence_min_len = 5)
print('====== 抽取式摘要 ======')
for s in s_list:
print(s.sentence,s.weight)
最近受邀去帮广发银行的高层培训NLP相关知识,既定的任务是教会他们如何用Python实现自然语言处理。想着既然要备课,就顺带着将NLP相关的知识梳理一下,放到博客中。
自然语言处理说简单些就是程序员将自然语言(英语、汉语等)编译为程序语言(Python、Java等)最后让机器解析成汇编语言的过程。那么就自然语言本身来看,其中就包括单个词、短语、句子、段落和篇章,不同的切词、提词的方法都会影响到后续句子级以上的处理,而不同句子、段落、篇章的算法也会各有优势和劣势,这里分别列举一些常用算法以帮助期望快速了解NLP的朋友。
关键词提取这里主要列举两种常用的计算方法TF-IDF和TextRank,TF-IDF表示在本文档中经常出现,且在其他文档中很少出现的词,TextRank则是基于图排序的算法(根据投票原理,让每个单词给它相邻的词投赞成票,票的权重取决于词自身的票数)。
Python关键词提取(TF-IDF)程序如下:
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
if __name__ == "__main__":
corpus=["鲜花 多少钱",#第一类文本切词后的结果,词之间以空格隔开
"白百合 多少钱",#第二类文本的切词结果
"水仙花 多少钱",#第三类文本的切词结果
"水果 多少钱"]#第四类文本的切词结果
vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值
tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
word=vectorizer.get_feature_names()#获取词袋模型中的所有词语
weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
print ("-------这里输出第",i,u"类文本的词语tf-idf权重------")
for j in range(len(word)):
print (word[j],weight[i][j])
Python关键词提取(TF-IDF)结果如下:
从结果中可以看出,程序没有问题,但深究文本会发现,我希望提取的关键词是“多少钱”而并非商品名称,因此面对这类文本时TF-IDF算法失效,这时我们可以采用TextRank提取关键词。
from textrank4zh import TextRank4Keyword
text = "鲜花 多少钱 白百合 多少钱 水仙花 多少钱 水果 多少钱"
word = TextRank4Keyword()
word.analyze(text,window = 2,lower = True)
w_list = word.get_keywords(num = 20,word_min_len = 1)
print ('关键词:')
for w in w_list:
print(w.word,w.weight)
Python关键词提取(TF-IDF)结果如下:
经过好几次POC项目发现分类关系图展示内容具有很强的局限性,所以一直在考虑要不要将这种样式发上来。直到最近看Echart官网发现分类关系图的样式已经下架,想着还是留个纪念吧。
分类关系图代码如下所示:
var size = 100;
var size1 = 10;
var yy = 200;
var yy1 = 250;
option = {
text: "分类关系图",
top: "top",
left: "left",
textStyle: {
fontSize: 24,
color: '#464646'
tooltip: {
formatter: '{b}'
backgroundColor: '#FFFCE8',
animationDuration: 1000,
animationEasingUpdate: 'quinticInOut',
// 图底部的图示
legend: [{
formatter: function (name) {
return echarts.format.truncateText(name, 40, '14px Microsoft Yahei', '…');
tooltip: {
show: true
selectedMode: 'false',
textStyle: {
color: '#464646'
data: ['购车咨询', '车贷业务', '费用咨询', '车辆检测', '看车咨询', '售后服务', '车源状态', '还款咨询', '配套服务', '售后服务', '费用咨询业务']
series: [{
name: '知识体系',
type: 'graph',
layout: 'force',
repulsion: 80,
gravity: 0.1,
edgeLength: 30,
layoutAnimation: true,
// 名称及对应位置
"name": " ",
symbol: 'image://../app_themes/assets/img/1.jpg',
"symbolSize": 150,
"draggable": "true"
"name": "购车咨询",
"symbolSize": size,
"category": "购车咨询",
"draggable": "true",
position: 'inside',
fontSize: 14,
color: '#fff',
"name": "费用计算",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true"
"name": "价格优惠",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true"
"name": "购车流程",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
"name": "全款买车",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
"name": "手续办理",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
"name": "合同签订",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
"name": "车辆出险证明",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
"name": "车辆落户",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
"name": "牌照问题",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
"name": "车贷业务",
"symbolSize": size,
"category": "车贷业务",
"draggable": "true",
position: 'inside',
fontSize: 14,
color: '#fff',
"name": "付一半产品",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
"name": "指定险种",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
"name": "尾款支付",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
"name": "信审申请",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
"name": "贷款分期",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
"name": "第三方金融",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
"name": "一车一分期方案",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
"name": "提前还款",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
"name": "费用咨询",
"symbolSize": size,
"category": "费用咨询",
"draggable": "true",
position: 'inside',
fontSize: 14,
color: '#fff',
"name": "GPS费用",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
"name": "定金",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
"name": "其他费用",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
"name": "年费率",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
"name": "违约金",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
"name": "风险保证金",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
"name": "车辆检测",
"symbolSize": size,
"category": "车辆检测",
"draggable": "true",
position: 'inside',
fontSize: 14,
color: '#fff',
"name": "初步检测",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
"name": "检测报告",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
"name": "重大事故排查",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
"name": "158项排查",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
"name": "双重检测",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
"name": "看车咨询",
"symbolSize": size,
"category": "看车咨询",
"draggable": "true",
position: 'inside',
fontSize: 14,
color: '#fff',
"name": "看车费用",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
"name": "异地看车",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
"name": "视频看车",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
"name": "实地看车",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
"name": "预约看车",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
"name": "售后服务",
"symbolSize": size,
"category": "售后服务",
"draggable": "true",
position: 'inside',
fontSize: 14,
color: '#fff',
"name": "一年两万公里保修",
"symbolSize": size1,
"category": "售后服务",
"draggable": "true"
"name": "三十天包退",
"symbolSize": size1,
"category": "售后服务",
"draggable": "true"
"name": "无理由退款",
"symbolSize": size1,
"category": "售后服务",
"draggable": "true"
"name": "预约退款",
"symbolSize": size1,
"category": "售后服务",
"draggable": "true"
"name": "车源状态",
"symbolSize": size,
"category": "车源状态",
"draggable": "true",
position: 'inside',
fontSize: 14,
color: '#fff',
"name": "个人车源",
"symbolSize": size1,
"category": "车源状态",
"draggable": "true"
"name": "确认在售车辆",
"symbolSize": size1,
"category": "车源状态",
"draggable": "true"
"name": "相关业务",
"symbolSize": size,
"category": "相关业务",
"draggable": "true",
position: 'inside',
fontSize: 14,
color: '#fff',
"name": "委托卖车",
"symbolSize": size1,
"category": "相关业务",
"draggable": "true"
"name": "车辆置换",
"symbolSize": size1,
"category": "相关业务",
"draggable": "true"
"name": "到期还车",
"symbolSize": size1,
"category": "相关业务",
"draggable": "true"
// 对应关系
"source": " ",
"target": "购车咨询"
"source": " ",
"target": "车源状态"
"source": " ",
"target": "车贷业务"
"source": " ",
"target": "相关业务"
"source": " ",
"target": "费用咨询"
"source": " ",
"target": "车辆检测"
"source": " ",
"target": "看车咨询"
"source": " ",
"target": "售后服务"
"source": "购车咨询",
"target": "费用计算"
"source": "购车咨询",
"target": "价格优惠"
"source": "购车咨询",
"target": "购车流程"
"source": "购车咨询",
"target": "全款买车"
"source": "购车咨询",
"target": "手续办理"
"source": "购车咨询",
"target": "合同签订"
"source": "购车咨询",
"target": "车辆出险证明"
"source": "购车咨询",
"target": "车辆落户"
"source": "购车咨询",
"target": "牌照问题"
"source": "费用咨询",
"target": "GPS费用"
"source": "车贷业务",
"target": "付一半产品"
"source": "车贷业务",
"target": "指定险种"
"source": "车贷业务",
"target": "尾款支付"
"source": "车贷业务",
"target": "信审申请"
"source": "车贷业务",
"target": "贷款分期"
"source": "车贷业务",
"target": "第三方金融"
"source": "车贷业务",
"target": "一车一分期方案"
"source": "车贷业务",
"target": "提前还款"
"source": "费用咨询",
"target": "定金"
"source": "费用咨询",
"target": "其他费用"
"source": "费用咨询",
"target": "年费率"
"source": "费用咨询",
"target": "违约金"
"source": "费用咨询",
"target": "风险保证金"
"source": "初步检测",
"target": "车辆检测"
"source": "车辆检测",
"target": "检测报告"
"source": "车辆检测",
"target": "重大事故排查"
"source": "车辆检测",
"target": "158项排查"
"source": "车辆检测",
"target": "双重检测"
"source": "看车咨询",
"target": "看车费用"
"source": "看车咨询",
"target": "异地看车"
"source": "看车咨询",
"target": "视频看车"
"source": "看车咨询",
"target": "预约看车"
"source": "看车咨询",
"target": "实地看车"
"source": "售后服务",
"target": "一年两万公里保修"
"source": "售后服务",
"target": "三十天包退"
"source": "售后服务",
"target": "无理由退款"
"source": "售后服务",
"target": "预约退款"
"source": "车源状态",
"target": "个人车源"
"source": "车源状态",
"target": "确认在售车辆"
"source": "相关业务",
"target": "委托卖车"
"source": "相关业务",
"target": "到期还车"
"source": "相关业务",
"target": "车辆置换"
// 大的节点名称
categories: [{
'name': ' '
'name': '购车咨询'
'name': '车源状态'
'name': '车贷业务'
'name': '相关业务'
'name': '费用咨询'
'name': '车辆检测'
'name': '看车咨询'
'name': '售后服务'
focusNodeAdjacency: true,
roam: true,
show: true,
color: 'source',
formatter: '{b}',
fontSize: 13,
fontStyle: '600',
position: 'top',
lineStyle: {
color: 'source',
curveness: 0,
type: "solid"
工程师朋友让我帮忙改一下Python脚本,业务场景是有现有两份csv文件,一张fcsv存放原始数据,一张fcsv_new存放更新数据,现在需要把更新的数据追加到原始表中
Python csv纵向合并程序如下:
import csv
fcsv="d:\\test\\HF.csv" # 定义文件路径
fcsv_new="d:\\test\\HFnew.csv"
reader_new = csv.DictReader(open(fcsv_new,encoding="utf-8")) # 读取fscv_new的数据
reader_new.fieldnames # 读取fscv_new的字段名
with open(fcsv,'a',encoding="utf-8") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=header)
writer.writerows(reader_new) # 将fcsv_new写入fcsv
reader = csv.DictReader(open(fcsv,encoding="utf-8")) #读取合并后的fcsv
for row in reader:
print(row)
WingIDE安装总会遇到各种各样的麻烦,其破解方法也是作为一个Hacker基本应该有的“职业素养”,多说无益动手尝试一下吧!
· WingIDE安装
(1)登陆WingIDE官网选择企业版
(2)选择合适的包,博主用的是Linux32位的系统,WingIDE版本号为5.0.9
(3)选择5.0.9后,需要选择Linux32-bit,然后进入真正的下载页面
(4)下载完成后,会有一个wingide*.deb的包,需要拷贝到Linux虚拟机
(5)执行如下安装语句,会出现依赖包未安装的问题
dpkg -i wingide5_5.0.9-1_i386.deb
(6)手动下载安装依赖包libqt4-webkit,若还有问题可参考百度软文kali linux 安装wingide
(7)将libqt4-webkit*.deb考到linux系统下,并执行如下语句安装
dpkg -i libqt4-webkit_4.8.6+git64-g5dc8b2b+dfsg-3+deb8u1_i386.deb
最近在利用Python研究渗透测试(黑客技术),Kali作为一款非常好用的渗透测试操作系统是值得我们花精力去安装的。在网上搜罗了一篇详细的Kali安装指南,鉴于该博文中文输入法安装不上的问题,博主另外写一篇博文进行修正。
(1)修改Kali源路径 ,并更新系统
切换到root用户(一般我们都是root用户登录,基本可忽略),在终端输入打开sources.list文件
leafpad /etc/apt/sources.list
在sources.list文件中添加(虽然也有其他的kali-rolling版本,但感觉中科大的最好用)
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
修改完成后,更新系统
apt-get update && apt-get upgrade
(2)安装google拼音
apt-get install fcitx-googlepinyin
如果安装过程中提示依赖关系有问题:
apt-get install -f
(3)重启后,Ctrl+空格 切换输入法
参考博文:kali国内更新源+中文输入法安装+SSH
现今数据分析岗位已不像从前那么火热,最大的一个原因便是越来越多的公司发现数据团队缺乏变现能力。如果数分师一直在循环往复的进行数据抽取、数据清洗、数据建模等工作,那么数分岗就成了一个服务型的岗位,专门为公司提供数据日志及报表。虽然偶尔能发现数据异常,但这些数据问题也只存在于报告的形式,无法进一步转化为公司产品价值。因此作为一名数据分析师,我们不仅需要对算法技术游刃有余,更需要学会产品思维,能够将数据问题(输入)转化为产品价值(输出)。
博主最近听了套名为《梁宁·产品思维30讲》的课程,感觉有必要站在一个数据分析师的角度,针对产品思维的相关概念进行整合
问题1:产品能力是什么?
回答1:产品能力是人生的一个底层能力,它能够让人有一种脚踩在地上的踏实感。
问题2:如何判断一个人的产品能力?
回答2:判断信息、抓住要点、整合有限资源,把所有价值打包成一个产品向世界交付。
问题3:作为一个产品人的信念?
回答3:用户驱动
问题4:如何让用户驱动产品?
回答4:记住草地与羊群的产品设计思路:如果有一片草地(产品),就在草地上养羊(用户),首先要有第一只羊,如果这只羊在草地上玩的很好则引入更多的羊。一方面,羊多了就需要有头羊(淘宝商家、社区版主等网络效应),只要有头羊,羊群就可以聚集。另一方面,羊多了就会有狼(供应商等),狼多了就把羊圈起来向狼收费。
问题5:如何划分羊群?
回答5:记住大明、笨笨、小闲的用户画像
明确需求,比价格
百度精确定位
大概需求,找灵感
“逛”淘宝
打发闲暇时间
问题6:如何用产品思维框架看一只羊?
回答6:依据1-5逐层递进
产品思维层次
外在特征:身材、相貌等
职业特征:律师严谨、艺术开放
内在价值:财富、人脉、精神等
拓展能力:健身、学习、挣钱
自身定义:存在感
问题7:如何深度理解这只羊?
回答7:用户无法像产品经理一样分层说出他的体验,却能展示用户情绪。生物性情绪包括:愉悦与不爽、愤怒与恐惧,因此一款成功的产品必须解决以下任意一点:让人愉悦到爆爽;帮人抵御恐惧。
问题8:产品设计中为什么要有数据分析?
回答8:潜意识分析!人们会基于自身所处的场景进行角色化交流,交流时人拥有意识,伴随而生的是一种防御机制。好的销售会攻破防御机制,但好的产品经理需要了解用户毫无防御机制时的想法。那么人们在独处时被记录的数据,是无压力状况下潜意识流露而做出的自然选择。因此数据分析能看到的是用户潜意识的行为,而一个产品要做的就是能够迎合用户的潜意识,让他们产生熟悉的感觉。
经典语句摘要:
1.后天学习是理性知识,理性是把人往回拉的力量,而驱动一个人的是他内在的感受和情绪。
2.去“角色化”来研究真是的用户,而不是用一堆“应该”来臆测用户行为。
3.用户调研是清空自己,接纳别人的过程。
4.你的样子里,有你爱过的人,走过的路,看过的风景,读过的书。
5.悲催的人生是在常态的面上做个勤奋的点。———《智能商业20讲》曾鸣
最近有位同学提出了这样一个业务需求:期望能够通过检索参与人员名称、会议讨论内容等能够从大量语料中找出相关的会议议题。本文提供一种检索文本内容的方式,程序设计思路如下:
(1)读取文件夹下所有文本信息;
(2)将文件名(会议议题)和文件内容(会议内容)按照字典格式存储;
(3)利用正则表达式检索文件内容(会议内容);
(4)若匹配成功,则输出文件名(会议议题);
数据配置要求:在D盘下创建test文件夹,将全部会议数据.txt放在test文件夹下
Python程序设计如下:
# ==== 读取原始语料txt文件 ====
rootdir='d:\\test\\'
txt_list = []
# 定义一个列表用于存储所有文件内容
for root, dirs, files in os.walk(rootdir):
# 遍历指定目录
for filename in files:
# 遍历目录下所有文件
fullname = root + filename
# 拼接完整的文件名,parent是父目录
one_file = open(fullname,'r', encoding='utf-8').read()
# 存储K-value 文件名:文件内容
one_txt = dict()
one_txt[filename] = one_file
txt_list.append(one_txt)
# ==== 正则表达式遍历检索 ====
pattern = re.compile("黄立鹏") #填写需要查找的人名或会议内容
result_content=''
for txt in txt_list: # 遍历txt文件
for txt_key in txt.keys(): # txt_key标题,txt[txt_key]内容
match = pattern.search(txt[txt_key])
result_content += os.path.join('会议议题:'+txt_key+'\n')
print(result_content)
最近发现不少同学在实际业务场景中对数据类型的选择有诸多困惑,遂写下该博文,期望能够帮助同学进一步加深对数据类型的理解。MySQL中数据类型主要包括三大类:数值型、字符型和日期型,本章将详细描述不同数据类型的名称、适用场景以及如何选择数据类型。
数值型数据类型主要用来存储数字,MySQL中可以把数值型数据分为两类:整数型和小数点型。整数型包括:tinyint、smallint、mediumint、int、bigint,小数点型包括:float、double、decimal(M,D),具体请见下表:
MySQL中整数类型
非常小的整数
较小的整数
中等大小的整数
普通大小的整数
较大的整数
MySQL中小数点类型
单精度浮点数
双精度浮点数
decimal(M,D)
定点数(M数值总位数,D小数点后位数)
1.如果业务不需要小数部分,使用整数来保存数据,通常情况下我们会使用int整数类型,否则使用浮点数来保存数据,通常情况下我们会使用float浮点数类型;
2.浮点数float、double与定点数decimal,在长度一定的情况下,使用浮点数能表示更大的数据范围,但如果对数据精确度要求较高时,建议使用定点数来存储;
字符型数据类型用来存储字符串数据,MySQL支持两种字符型数据存储:文本字符串和二进制字符串,文本字符串包括:char、varchar、text、enum、set,二进制字符串包括:bit、binary、varbinary、tinyblob、blob、mediumblob、longblob,具体请见下表:
MySQL中文本字符串类型
固定长度的字符串
M个字节,1&=M&=255
可变长度的字符串
L+1个字节,L&=M且1&=M&=255
非常小的字符串
L+1个字节,L&2^8
较小的字符串
L+2个字节,L&2^16
mediumtext
中等大小的字符串
L+3个字节,L&2^24
较大的字符串
L+3个字节,L&2^32
字符串对象,可以有零或多个值
MySQL中二进制字符串类型
位字段类型
约M+7个字节
固定长度二进制字符串
可变长度二进制字符串
非常小的BLOB
L+1个字节,L&2^8
较小的BLOB
L+2个字节,L&2^16
mediumblob
中等大小的BLOB
L+3个字节,L&2^24
较大的BLOB
L+4个字节,L&2^32
1.文本字符串和二进制字符串本质区别在于数据存储方式不同,前者多以文本的ASCII码形式存储在计算机中,后者以文本的二进制形式存储在计算机中;
2.char与varchar,char是固定长度、自动删除插入数据的尾部空格,varchar是可变长度、不会删除尾部空格,char的优势在于处理数据更快,varchar的优势在于节省存储空间;
当我们还没意识到自己在使用人工智能之前,AI就已经渗透于诸多智能产品和商业服务之中,小到我们常用的智能手机,大到我们接触的智能客服。随着AI技术的不断发展,越来越多的人开始关注人工智能的自动化对于我们工作场所、就业和社会的影响。简单来说,人工智能的挑战和局限性给领导者创造了一个“移动目标”的问题:很难在AI浪潮中一直保持领先的优势。每当AI技术试图应用到现实世界但受到障碍时,投资者便会采取观望的态度。为了保持AI技术的先进性,一个有用的方法便是追踪深度学习的最新进展。
深度学习相较于传统的有监督学习的“特征工程”,使用了大规模的神经网络,它可以包含数百万个模拟的“神经元”分层结构,这些神经网络通过训练数据和反向传播算法来学习。虽然深度学习推进了人工智能的发展,但人工智能的实现还有诸多的局限,例如AI方法、业务问题和数据可用性相适应的问题。由于AI系统是经过“训练”而不是建成的,所以各个过程通常需要大量的标记数据来精确地执行复杂的任务,此外,很难分辨一个由深度学习训练的数学模型是如何达到特定的预测或分类。让我们从以下五个方面来探索人工职能的挑战和局限性:
· 数据标签
目前大多数人工智能模型都是通过“监督式学习”进行训练的。这意味着我们必须手工对基础数据进行标注和分类,这是一个相当庞大且容易出错的杂事。例如,开发自驾车技术的公司正在雇佣数百人手动注释来自原型车辆的视频,以帮助更好的训练这些系统。与此同时,如流式监督的新技术也在不断涌现,这种技术能够在数据自然使用过程中被贴上标签,这种半监督的方法减少了需要大量标记的数据集,有可能将大量劳力成本从繁琐的数据标注中解放出来。
· 获得大量的训练数据集
研究表明,使用线性模型的简单的AI技术在某些情况下可以接近医学和其他领域的专家的能力。然而,目前机器学习需要的训练数据集不仅要求被标记,且要求足够大、足够全面。一次性学习是一种新的技术,可以减少大型数据集的需求,允许AI模型在给予少量样本的同时,精确地识别出一个类别的多个实例。由此可以减少AI建模时需要大量训练数据集的问题。
· 可解释性问题
可解释性并不是人工智能系统的一个新问题,随着深度学习的成功和采用,促进了更多样化和先进应用的同时也生成了更多的不透明性。更大、更复杂的模型使人们很难解释为什么达成某个决定,但随着AI应用范围的不断扩大,监管要求也可能导致需要更多可解释的人工智能模型。此时我们采用LIME方法可能更好的提高模型透明度,其目的是试图确定一个训练好的模型依赖最多的输入数据的哪个部分来开发可解释模型的预测。这种技术一次考虑某些数据段,观察预测结果的变化,对代理模型进行微调,并形成更精确的解释。
· 学习的普遍性
与人类学习的方式不同,人工智能模型难以将他们的经验从一种情况转移到另一种情况。实际上,对于一个给定的用例来说,无论是哪一个模型,都只能适用于这个用例。因此,即使在用例非常相似的情况下,公司也必须多次投入资源来训练另一个模型。对这一挑战的一个有希望的回应是转移学习。在这种方法中,人工智能模型被训练完成某个任务,然后迅速将这个学习应用于一个类似但不同的活动。 DeepMind的研究人员在实验中也发现了转移学习的有希望的成果,随着转换学习和其他通用方法的成熟,他们可以帮助组织更快速地构建新的应用程序,并为现有的应用程序提供更多不同的功能。例如,在创建虚拟个人助理时,转移学习可以将用户在一个区域(例如音乐)中的偏好推广到其他人(书籍)。
· 数据和算法中的偏差
随着我们在新的领域部署机器学习和人工智能算法,可能会有更多的实例将这些潜在的偏见问题无意识的融入到数据集和算法。这种偏见倾向于保持嵌入,因此承认这些偏见并采用措施解决这些偏见需要深入掌握数据科学技术以及对现有业务情况更多元的理解。
人工智能是强大的,但实现人工智能所需的技术、工具和流程条件还没有完全达到。但我们需要有足够的信心去相信,随着研究人员和AI开拓者不断的去挑战一些当今棘手的问题,AI终有一天会有全新的突破。
知识图谱简单来说就是具有语义理解与信息互联互通能力的知识库。它作为人工智能技术的重要组成部分,主要应用在搜索引擎、话术追踪、人机交流等多个领域。本文提供一种构建知识图谱的概念,其本质上来说还算不上真正的知识图谱,构建方式如下:
(1)从样例文本或FAQ中提取不同的对话场景;
(2)将不同的对话场景编译为正则表达式的形式;
(3)人工对每个正则表达式配上相应的业务知识点;
(4)根据正则表达式回扫所有文本并打上对应的业务知识点标签;
具体操作步骤如下:
(1)将已构建好的正则及知识点整合文档reg.excel放在D盘下;
(2)在D盘下创建test文件夹,将原始语料*.txt放入文件夹中;
Python程序设计如下:
import xlrd # Excel读取包
# ==== 读取reg.excel文件
datadir='d:\\reg.xlsx'
data = xlrd.open_workbook(datadir)
table = data.sheets()[0] # 0表示读取第1张表
nrows = table.nrows # 获取行数
reg_list = []
for i in range(1,nrows): # 第一行为表头,range从第二行到第nrows行
row = table.row_values(i) # 按行读取数据,row[0]第一列 row[1]第二列
if row: # 存储k-value值,row[0]正则为key,row[1]标签为value
one_reg = dict() # 创建一个字典对象
one_reg[row[0]] = row[1]
reg_list.append(one_reg)
# ==== 读取原始语料txt文件 ====
rootdir='d:\\test\\'
txt_list = []
# 定义一个列表用于存储所有文件内容
for root, dirs, files in os.walk(rootdir):
# 遍历指定目录
for filename in files:
# 遍历目录下所有文件
fullname = root + filename
# 拼接完整的文件名,parent是父目录
one_file = open(fullname,'r', encoding='utf-8').read()
# 存储K-value 文件名:文件内容
one_txt = dict()
one_txt[fullname] = one_file
txt_list.append(one_txt)
# ==== 依据正则对文本进行打标 ====
result_content = ''
for reg in reg_list: # 遍历Excel文件
for reg_key in reg.keys(): # value值:reg[reg_key]
pattern = re.compile(reg_key)
for txt in txt_list: # 遍历txt文件
for txt_key in txt.keys():
match = pattern.search(txt[txt_key])
if match: # 如果Match不为空
turn = match.group(0) # group(0)返回整理,返回对应文本内容
# 输出"文件名\知识点\正则表达式"
result_content += os.path.join(txt_key + '|'+ reg[reg_key] + '|'+ reg_key + '|' + turn + '\n')
print((result_content),file=open('d:\\test01.txt','w',encoding='utf-8')) # 将结果打印到txt中
最后再看一下文本剔除,该业务需求是我们手上有一份文件名单,希望从数据集中将对应名单的文本提取出来,换句话说就是将数据集中不匹配的文本剔除。具体步骤如下:将文件名单name.txt放在D盘下,并在D盘新建一个文件夹test,将原始语料a1.txt,a2.txt,a3.txt,a4.txt放入test文件夹中
Python文本剔除程序如下:
rootdir = "d:\\test\\"
_files = []
for l in open("d:\\name.txt","r",encoding="utf-8").readlines():
_files.append(l.strip())
for root ,dirs, files in os.walk(rootdir):
for _file in files:
filepath = root + _file
if _file not in _files:
os.remove(filepath)
最近发现许多同学对日期数据(YYYY-MM-DD hh:mm:ss)比较陌生,导致在表存储和表查询阶段出现了诸多问题,遂写下该博文,期望能够帮助同学掌握日期数据的常见处理方法。
日期数据有其固定的数据存储格式为datetime,但有时我们为了便捷会直接将其存成char字符型的数据,注意不要将日期数据存为数值型,由此我们分别建立两张test表,相关程序如下:
· 日期数据存储方法
-- 创建test01表,为datetime型
create table test01(
user_id int(10),
birthday datetime #datetime最大宽度为6,默认不填
insert into test01 values(1-01-05"),(1-02-05");
-- 创建test02表,为char型
create table test02(
user_id int(10),
birthday char(20)
insert into test02 values(1-01-05"),(1-02-05");
· 日期数据查询方法
-- 其中test01替换成test02结果相同
-- 查询年、月、日
select year(birthday) 年份,month(birthday) 月份,day(birthday) 日期 from test01;
-- 增加一年、添加一月、减少一月
select date_add(birthday,interval 1 day) as 日期加一天,
date_add(birthday,interval 1 month) as 日期加一月,
date_add(birthday,interval -1 month) as 日期减一月
from test01;
-- 查询当前时间
-- 对应输出为"YYYY-MM-DD hh:mm:ss","YYYY-MM-DD","hh:mm:ss"
select now(),CURDATE(),CURTIME();
-- 计算当前日期与生日相差天数
select DATEDIFF(CURDATE(),birthday) 相差天数 from test01;
在我们日常技术交流过程中,往往需要对原始数据进行脱敏处理,例如公司名称、个人身份证号等敏感信息。由此本文介绍2种字符串替换的方法,帮助大家更好的解决数据脱敏的相关问题。具体步骤如下:在D盘新建文件夹test,并在test文件夹中放入原始语料a1.txt,a2.txt,a3.txt
Python文本数据脱敏程序如下:
# 字符串替换 replace()
infile = open("d:\\test\\a1.txt","r",encoding="utf-8").read()
new_infile = infile.replace("坐席","AAA") # replace函数替换
# 新建同名的空白文档覆盖原始文档
outfile = open("d:\\test\\a1.txt","w",encoding="utf-8")
# 将替换后的数据写入空白文档,注意str()
outfile.write(str(new_infile))
outfile.close()
# 正则表达式替换 import re
infile = open("d:\\test\\a1.txt","r",encoding="utf-8").read()
words = re.compile("坐席") # 关键词定位
new_infile = words.sub("AAA",infile) # 关键词替换
outfile = open("d:\\test\\a2.txt","w",encoding="utf-8")
outfile.write(str(new_infile))
outfile.close()
# 注意:正则表达式适用于复杂的业务替换场景,一般利用replace函数就能达到数据脱敏的需求
# 批量字符串替换 replace(),后续可自行尝试批量正则替换
rootdir = "d:\\test\\"
for root, dirs, files in os.walk(rootdir):
for i in files:
i = root + i
infile = open(i,"r",encoding="utf-8").read()
new_infile = infile.replace("座席","AAA").replace("客户","BBB") # 同时替换“坐席”与“客户”
outfile = open(i,"w",encoding="utf-8")
outfile.write(str(new_infile))
outfile.close()
模型评估一直是数据建模中不可或缺的一环,评估指标的好坏直接关系到模型上线运用的情况。本文期望以最直观的方式告诉大家模型评估的相关指标,并手动绘制令诸多同学疑惑的ROC曲线。在此希望大家注意:模型评估指标只能作为参考依据,在真正的项目实施过程中,还是需要针对具体业务具体分析。
分类模型(贝叶斯、决策树、SVM等)评估指标:
sklearn对应函数
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
Confusion Matrix
from sklearn.metrics import confusion_matrix
from sklearn.metrics import roc
ROC曲线下的面积
from sklearn.metrics import auc
回归模型(线性回归、非线性回归等)评估指标:
sklearn对应函数
Mean Square Error(MSE/RMSE)
from sklearn.metrics import mean_squared_error
Absolute Error(MAE/RAE)
from sklearn.metrics import mean_absolute_error, median_absolute_error
R-Squared(R^2)
from sklearn.metrics import r2_score
· 混淆矩阵、ROC曲线与AUC面积
问题1:混淆矩阵是什么?
回答1:混淆矩阵说简单一点就是预测的正例/反例与真实值之间的比例关系,该矩阵包括4个方面:
True Positive(TP)
False Positive(FP)
True Negative(TN)
False Negative(FN)
混淆矩阵图如下:
由此计算:
True Positive Rate真实的正例中,被预测正确的比例:TPR = TP/(TP+FN)
False Positive Rate真实的反例中,被预测正确的比例:FPR = FP/(FP+TN)
问题2:混淆矩阵、ROC曲线与AUC面积之间的关系?
回答2:ROC曲线(Receiver Operating Characteristic)主要用于评估二分类模型的优劣,其绘图时X轴和Y轴分别对应混淆矩阵中FPR和TPR,其下方包围的面积为AUC(Area Under the Curve)。
问题3:ROC曲线如何绘制?
回答3:一条曲线的绘制必须是多个点的连线,那么我们就需要在坐标轴上描出多个点,以此来绘制ROC曲线,具体步骤如下:
(1)假设我们有一个100行的数据集,按照9:1划分为训练集和测试集;
(2)接下来我们建立二分类模型并预测结果,这时10行的测试集中每个观测都应该有一个对应的原始分类和预测概率;
(4)这时我们依次将10个预测概率作为阈值threshold,当准确度大于或等于这个值的时候,预测结果为P,否则为N,例如,预测概率值为0.6,那么测试集结果为:
由此绘制混淆矩阵:
计算TPR与FPR:
TPR = TP/(TP+FN) = 0.3/(0.3+0.3) = 0.5
FPR = FP/(FP+TN) = 0.3/(0.1+0.3) = 0.75
据此,我们每更换一次阈值threshold,就能计算出一组TPR与FPR,那么这个数据集就应该能计算出10组TPR与FPR(其余9组请同学自行推算,不再写出具体计算过程)
(5)由此,我们以FPR为横坐标,TPR为纵坐标,描出所有的坐标点并连线,最终汇出ROC曲线,这里给出ROC曲线样例如下:
接下来,我们学习如何对文本进行拆分,即存在一个大数据集文本,我们如何将其切分成单个小的数据集。文本拆分适用于在自然语言处理过程中,需要对每通文本进行遍历打标的情况。具体步骤如下:将原始文本merge.txt放在D盘下,并在D盘中新建空白文件夹test
文本拆分的难点具体包括如下几个部分:
(1)原始文本如何按既定规则进行切片;
(2)切片后每个新文件的文件名如何写入;
(3)如何保证每个新文件中文本的完整性;
注:建议本节与Python文本预处理(文本合并)一同学习
Python文本拆分程序如下:
rootdir = 'd:\\test\\'
# 难点:对数据进行切片
p=re.compile('\/data\/voice\/',re.S) # 输入正则表达式切片的规则
fileContent=open('d:\\merge.txt','r',encoding='utf-8').read() # 读文件内容
paraList=p.split(fileContent) # 根据正则对文本进行切片
for i in range(len(paraList)): # 遍历切片后的文本列表
fileWriter=open(rootdir+str(i)+'.txt','w',encoding='utf-8')
fileWriter.write(paraList[i]) # 将文本写入
fileWriter.close()
for root, dirs, files in os.walk(rootdir):
for l in files:
l = root + l
line = open(l, 'r+', encoding='utf-8').readlines() # 文件按行读取
# 难点:剔除每个文件第一行数据
infile = ''.join(line[1:]) # 从每个文件第二行开始读取
outfile = open(str(l),'w',encoding='utf-8').write(infile)
# 难点:修改文件名
modname = ''.join(line[:1]) # 读取每个文件第一行
newurl = root + modname.strip() # strip移除字符串首尾字符(/n)
if newurl == root:
os.remove(l) # 删除多余文件
elif newurl != root:
os.rename(l,newurl) # 修改文件名
在自然语言处理过程中,我们经常会遇到大量的文本文件,往往我们需要对这些文本进行预处理后才能使用,因此这里教大家针对文本文件的三种常见场景及预处理方法(文本合并、文本拆分和文本剔除)。
第一种方法是文件合并,即存在多个文本文件,如何将这些文件合成一个,便于后续知识标注人员对文本进行批量检测等。具体步骤如下:在D盘新建两个空白文件夹test和test01,并在test文件夹中放入原始语料a1.txt,a2.txt,a3.txt
Python文本合并程序如下:
# 文件合并(方法1)
#输入每个文件的绝对路径
list = ["D:\\test\\a1.txt","D:\\test\\a2.txt","D:\\test\\a3.txt"]
# 新建一个空白的txt文件,作为读入框
ofile = open("D:\\test01\\merge.txt","w")
for i in list:
ofile.write( i + "\n") # 每个文本开头输入文件名
for txt in open(i,"r",encoding="utf-8"):
ofile.write(txt) # 将文本合并到新的空白文件中
ofile.close()
# 由于方法1需要输入每个文件的绝对路径,我们需要更智能的方法,
# 遍历某个文件夹中所有的文本,然后进行合并
# 文件合并(方法2)
rootdir = 'D:\\test' #输入文件的路径
list = os.listdir(rootdir) #遍历test文件夹所有文件
ofile = open("D:\\test01\\d.txt","w")
for i in list:
ofile.write( i + "\n")
i = rootdir+ os.path.sep + i #目录名+ 路径切割符+ 文件名
for txt in open(i,"r",encoding = "utf-8"):
ofile.write(txt)
ofile.close()
# 利用os包的时候,比较高级的方法是用os.walk
# 文件合并(方法3)
rootdir = 'D:\\test'
ofile = open("D:\\test01\\e.txt","w")
#root表示文件夹路径,dirs次级目录路径,files文件名
for root, dirs, files in os.walk(rootdir):
for i in files:
ofile.write(i + "\n")
i = root + os.path.sep + i
for txt in open(i,"r",encoding = "utf-8"):
ofile.write(txt)
ofile.close()
桑基图也称为能量分流图,是一种特定类型的流程图,图中分支的宽度对应数据量的大小,一般用来描述多分类数据之间的量级关系。
上图是Echarts官网原始的桑基图,下图是修改后的桑基图
桑基图修改点如下:
(1) 修改分类数据对应关系;
(2) 修改分类数据量大小;
注:为缩小篇幅,后续代码块全部为联网读写方式,大家可以试着将其修改成本地读写方式。
修改后桑基图代码如下所示:
var data1 = "{\"nodes\":[{\"node\":0,\"name\":\"质量保证\"},{\"node\":1,\"name\":\"车源状态\"},{\"node\":2,\"name\":\"售后服务\"},{\"node\":3,\"name\":\"车况查询\"},{\"node\":4,\"name\":\"车辆检测\"},{\"node\":5,\"name\":\"车辆来源\"},{\"node\":6,\"name\":\"确认在售车辆\"},{\"node\":7,\"name\":\"购车发票\"},{\"node\":8,\"name\":\"退款问题\"},{\"node\":9,\"name\":\"车况咨询-年检到期日\"},{\"node\":10,\"name\":\"车况咨询-保险到期日\"},{\"node\":11,\"name\":\"车况咨询-维修保养记录\"},{\"node\":12,\"name\":\"车辆检测-一次检测\"},{\"node\":13,\"name\":\"车辆检测-二次检测\"},{\"node\":14,\"name\":\"车辆检测-检测报告\"},{\"node\":15,\"name\":\"车辆检测-重大事故排查\"},{\"node\":16,\"name\":\"车源状态-车辆来源\"},{\"node\":17,\"name\":\"车源状态-个人车源\"},{\"node\":18,\"name\":\"车源状态-车辆下架\"},{\"node\":19,\"name\":\"车源状态-确认在售车辆\"},{\"node\":20,\"name\":\"售后服务-购车发票\"},{\"node\":21,\"name\":\"售后服务-三十天包退\"},{\"node\":22,\"name\":\"售后服务-无理由退款\"},{\"node\":23,\"name\":\"售后服务-预约退款\"}],\"links\":[{\"source\":0,\"target\":3,\"value\":1000},{\"source\":0,\"target\":4,\"value\":2000},{\"source\":1,\"target\":5,\"value\":1000},{\"source\":1,\"target\":6,\"value\":2000},{\"source\":2,\"target\":7,\"value\":500},{\"source\":2,\"target\":8,\"value\":2000},{\"source\":3,\"target\":9,\"value\":500},{\"source\":3,\"target\":10,\"value\":400},{\"source\":3,\"target\":11,\"value\":450},{\"source\":4,\"target\":12,\"value\":500},{\"source\":4,\"target\":13,\"value\":150},{\"source\":4,\"target\":14,\"value\":500},{\"source\":4,\"target\":15,\"value\":500},{\"source\":5,\"target\":16,\"value\":500},{\"source\":5,\"target\":17,\"value\":350},{\"source\":6,\"target\":18,\"value\":750},{\"source\":6,\"target\":19,\"value\":1000},{\"source\":7,\"target\":20,\"value\":400},{\"source\":8,\"target\":21,\"value\":700},{\"source\":8,\"target\":22,\"value\":400},{\"source\":8,\"target\":23,\"value\":600}]}";
var data=eval('(' + data1 + ')');
myChart.setOption(option = {
backgroundColor: '#FFFFFF',
text: 'Sankey Diagram'
tooltip: {
trigger: 'item',
triggerOn: 'mousemove'
type: 'sankey',
layout: 'none',
data: data.nodes,
links: data.links,
'#30588C',
'#77C3F2',
itemStyle: {
borderWidth: 1,
borderColor: '#aaa'
lineStyle: {
color: 'source',
curveness: 0.7
1.在数据库中创建emp表空间
# 注意:emp表所有字段的数据类型必须为字符型
create table emp(
empno char(100),
ename char(100),
job char(100),
leader char(100),
hiredate char(100),
sal char(100),
comm char(100),
deptno char(100)
2.将emp表中内容粘贴到Notepad编辑器上,粘贴完成后如下图所示
3.利用Notepad正则表达式批量替换文本中内容
注意:Notepad查找/替换快捷键”Ctrl+F”;下述(1)-(3)查找模式为正则、(4)为普通
(1)替换开头列
-- ^ 正则表达式中代表开头
insert into emp values\("
-- 注意"\("代表转译符
(2)替换结尾列
-- $ 正则表达式中代表结尾
-- 注意"\)"代表转译符
(3)替换空格列
-- 注意前后单引号
(4)将空值替换成null
4.将替换好的代码全部复制到数据库中运行
5.查看emp表
现阶段自然语言处理NLP领域,最常见的问题莫过于获取用户心声,即用户在交流内容过程中,他们应答的一些关键词或者短句。这些相互关联的信息点可以映射出整段文本客户的应答内容,但这些信息点之间往往具有多条连接属性,因此需要绘制网状的关联图进行描述。
上图是Echarts官网原始的网状关联图,下图是修改后的网状关联图
网状关联图修改点如下:
(1) 修改圆圈颜色和大小;
(2) 在连接线上添加概率值;
注:为缩小篇幅,后续代码块全部为联网读写方式,大家可以试着将其修改成本地读写方式。
修改后关联图代码如下所示:
option = {
text: '网状关联图'
tooltip: {
formatter: function(x) {
return x.data.
series: [{
type: 'graph',
layout: 'force',
symbolSize: 80,
roam: true,
edgeSymbol: ['circle', 'arrow'],
edgeSymbolSize: [4, 10],
edgeLabel: {
textStyle: {
fontSize: 20
repulsion: 2500,
edgeLength: [10, 50]
draggable: true,
itemStyle: {
color: '#4b565b'
lineStyle: {
color: '#4b565b'
edgeLabel: {
show: true,
formatter: function(x) {
return x.data.
show: true,
textStyle: {}
name: '少送',
symbolSize: 90,
itemStyle: {
color: '#ffa07a'
name: '投诉',
symbolSize: 70,
itemStyle: {
color: '#ffa07a'
name: '退款',
symbolSize: 70,
itemStyle: {
color: '#ffa07a'
name: '补上',
symbolSize: 50,
itemStyle: {
color: '#ffa07a'
name: '联系不上',
symbolSize: 70,
itemStyle: {
color: '#ffa07a'
name: '未送达',
symbolSize: 90,
itemStyle: {
color: '#ffa07a'
name: '骑手',
symbolSize: 50,
itemStyle: {
color: '#ffa07a'
name: '商家',
symbolSize: 50,
itemStyle: {
color: '#ffa07a'
name: '催餐',
symbolSize: 70,
itemStyle: {
color: '#ffa07a'
name: '补偿',
symbolSize: 50,
itemStyle: {
color: '#ffa07a'
name: '预计送达',
symbolSize: 50,
itemStyle: {
color: '#ffa07a'
name: '态度不好',
symbolSize: 70,
itemStyle: {
color: '#ffa07a'
source: '少送',
target: '投诉',
name: '14.83%',
source: '未送达',
target: '催餐',
name: '40.44%',
source: '催餐',
target: '准时保',
name: '1.64%',
source: '催餐',
target: '退款',
name: '20.51%',
source: '催餐',
target: '投诉',
name: '23.58%',
source: '少送',
target: '退款',
name: '50.44%',
source: '少送',
target: '补上',
name: '1.14%',
source: '少送',
target: '联系不上',
name: '1.52%',
source: '少送',
target: '态度不好',
name: '1.26%',
source: '投诉',
target: '态度不好',
name: '31.33%',
source: '态度不好',
target: '退款',
name: '1.32%',
source: '态度不好',
target: '商家',
name: '30.54%',
source: '态度不好',
target: '骑手',
name: '60.32%',
source: '联系不上',
target: '商家',
name: '25.33%',
source: '联系不上',
target: '骑手',
name: '62.32%',
source: '催餐',
target: '退款',
name: '12.32%',
source: '退款',
target: '补偿',
name: '3.74%',
source: '未送达',
target: '预计送达',
name: '6.83%',
source: '少送',
target: '未送达',
最近经常遇到同学询问协同过滤的算法,但协同过滤的结果出来后大家有想过如何进行展示么?这时,我们便可以用到环形关联图。
上图是Echarts官网原始的环形关联图,下图是修改后的环形关联图
环形关联图修改点如下:
(1) 修改组别颜色;
(2) 修改不同类别间对应关系及概率值;
注:为缩小篇幅,后续代码块全部为联网读写方式,大家可以试着将其修改成本地读写方式。
修改后关联图代码如下所示:
var option = {
animationDurationUpdate: 1500,
animationEasingUpdate: 'quinticInOut',
series: [{
type: 'graph',
tooltip: {},
ribbonType: true,
layout: 'circular',
circular: {
rotateLabel: true
symbolSize: 30,
roam: true,
focusNodeAdjacency: true,
position: 'center',
fontWeight: 'bold',
formatter: '{b}',
textStyle: {
fontFamily: '宋体'
edgeSymbol: ['circle'],
edgeSymbolSize: [4, 10],
edgeLabel: {
textStyle: {
fontSize: 13,
fontWeight: 'bold',
fontFamily: '宋体'
// 外部字体样式设置
itemStyle: {
rotate: true,
show: true,
textStyle: {
color: '#333',
fontWeight: 'bold'
color: ["#393f51", "#393f51", "#393f51", "#393f51", "#393f51", "#393f51", "#393f51", "#85d6f7",
"#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7"]
emphasis: {
show: true
// 类别定义,保证类别没有相同的名称
name: '购车咨询-车辆购置城市', //类别名称
itemStyle: {
color: '#0099cc' //类别颜色
name: '购车咨询-意向车辆确认',
itemStyle: {
color: '#0099cc'
name: '购车咨询-关注车型',
itemStyle: {
color: '#0099cc'
name: '购车咨询-关注品牌',
itemStyle: {
color: '#0099cc'
name: '购车咨询-价格优惠',
itemStyle: {
color: '#00ffcc'
name: '购车咨询-车辆过户',
itemStyle: {
color: '#00ffcc'
name: '购车咨询-牌照问题',
itemStyle: {
color: '#00ffcc'
name: '购车咨询-提车流程',
itemStyle: {
color: '#00ffcc'
name: '车贷业务-首付款',
itemStyle: {
color: '#009933'
name: '车贷业务-贷款分期',
itemStyle: {
color: '#009933'
name: '看车咨询-预约看车',
itemStyle: {
color: '#ffcc00'
name: '看车咨询-视频看车',
itemStyle: {
color: '#ffcc00'
name: '看车咨询-实地看车',
itemStyle: {
color: '#ffcc00'
name: '车辆检测-质量保证',
itemStyle: {
color: '#ff3300'
name: '车辆检测-检测报告',
itemStyle: {
color: '#ff3300'
name: '车源状态-确认在售车辆',
itemStyle: {
color: '#000099'
name: '购车咨询-全国直购',
itemStyle: {
color: '#0099cc'
// 类别关联对应,保证关联的类别在上述模块中定义过
source: '购车咨询-车辆购置城市', // 基础点
target: '购车咨询-意向车辆确认', // 关联点
name: '2.38%', // 关联概率值
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
// 关联线样式设置
lineStyle: {
width: 1, // 线的粗细
curveness: 0.2, // 线的弧度
color: '#0099cc', // 线的颜色
source: '购车咨询-车辆购置城市',
target: '购车咨询-全国直购',
name: '2.38%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#0099cc'
source: '购车咨询-车辆购置城市',
target: '购车咨询-关注品牌',
name: '0.40%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#0099cc'
source: '购车咨询-车辆购置城市',
target: '购车咨询-价格优惠',
name: '0.66%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#0099cc'
source: '购车咨询-车辆购置城市',
target: '车贷业务-贷款分期',
name: '0.66%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#0099cc'
source: '车贷业务-贷款分期',
target: '看车咨询-预约看车',
name: '0.53%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#009933'
source: '车贷业务-贷款分期',
target: '购车咨询-车辆过户',
name: '0.53%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#009933'
source: '车贷业务-贷款分期',
target: '车源状态-确认在售车辆',
name: '0.40%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#009933'
source: '车贷业务-贷款分期',
target: '看车咨询-预约看车',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#009933'
source: '车贷业务-贷款分期',
target: '购车咨询-牌照问题',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#009933'
source: '购车咨询-意向车辆确认',
target: '看车咨询-预约看车',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#0099cc'
source: '购车咨询-车辆购置城市',
target: '购车咨询-意向车辆确认',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#0099cc'
source: '购车咨询-意向车辆确认',
target: '看车咨询-实地看车',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#0099cc'
source: '购车咨询-意向车辆确认',
target: '车源状态-确认在售车辆',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#0099cc'
source: '车辆检测-检测报告',
target: '车辆检测-质量保证',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
symbolSize: [5, 20],
formatter: function(params, ticket, callback) {
params.name = params.data.
return params.
show: true
lineStyle: {
curveness: 0.2,
color: '#ff3300'
source: '购车咨询-全国直购',
target: '购车咨询-提车流程',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.
s

我要回帖

更多关于 如图,已知∠A=∠F 的文章

 

随机推荐