该文档涉及的组件

三国演义人物和内容搜索

简介

内容搜索是一个非常常用的功能,搜索一切想搜索的内容。

本文以三国演义小说为例

演示网址: https://app.aboutdata.top/sanguo/#/sanguo_home

小笨羊网址: https://xiaobenyang.com/

如有问题,请联系小笨羊微信:

主要包括下面四个内容,

  • 三国内容搜索


  • 三国人物图谱


  • 三国人物关系

  • 三国演义原文阅读

数据介绍

三国演义原文数据

  • 数据Schema

列名

列类型

说明

chapter_id

Int

章节ID,从1开始

chapter_title

String

章节标题

chapter

String

章节内容

  • 统计分析

可以看出,一共有120章,每章平均长度不到五千字。

三国人物数据

  • 数据Schema

列名

列类型

说明

f00

STRING

姓名

f01

STRING

f02

STRING

f03

STRING

f04

STRING

籍贯郡

f05

STRING

籍贯县

f06

STRING

亲属

f07

STRING

师从

f08

STRING

别称

f09

STRING

县令/长

f10

STRING

太守/相

f11

STRING

刺史/州牧

f12

STRING

都尉

f13

STRING

校尉

f14

STRING

中郎将

f15

STRING

将军

f16

STRING

九卿

f17

STRING

三公

f18

STRING

侍中/尚书

f19

STRING

爵位

f20

STRING

谥号

f21

STRING

来源

  • 统计分析


可以看出,三国任务图谱里有4565任,其中姓张的最多,只有34%的人有字,577人是将军。

三国内容搜索

这里使用AlinkLab "全文搜索" 应用。给定一个或多个关键词,或者表达式,给出最相关的章节,并高亮。

例如搜索 大都督


可以看出,陆逊,曹真,周瑜,吕蒙,司马昭都做过大都督。

我们按照如下几步,介绍如何用AlinkLab做文本搜索。

按照下面的步骤搭建训练模型和部署。如果不想搭建,可以跳过下面步骤,直接查看已搭建好的任务,复制运行。

1. 使用"全文搜索"应用,填写参数配置


参数配置如下:

参数名称

参数内容

说明

文件路径

mylabdata://xiaobengyang.com/name/demo/sanguo.ak

输入数据,包括三国演义的章节名称和内容

文本检索列

["chapter_title", "chapter"]

文本检索列,先分词再按照分词结果检索。

这里选择了两列

chapter_title:章节标题

chapter: 章节内容

原始检索列

["chapter_id"]

原始检索列,部分词直接原文匹配。

这里选择了一列:

chapter_id:章节ID

分词方法

IkAnalysis

分词方法,一般都是用Ik分词

返回数据条数

10

每个搜索请求,最多返回10条结果

检索条件的列名

search_content

预测服务输入的列名

预测服务名称

sanguo/三国搜索A

预测服务名称

是否输出原文

"是": 输出原文 + 高亮段落

"否": 输出高亮段落,不输出原文

2. 导入搭建好的应用

https://xiaobenyang.com/discuss-post?id=142

3. 查看已部署的服务

https://xiaobenyang.com/discuss-post?id=163

4. API调用预测服务

4.1. API参数

参数

名称

说明

predServId

服务ID

在服务页面上查看服务名称对应的ID

search_content

搜索内容

搜索内容,和应用里"检索条件的列名" 一致

4.2. API请求示例
var axios = require('axios')
  
//设置小笨羊API访问URL
axios.defaults.baseURL = 'https://xiaobenyang.com/pred'
  
// 设置访问ApiKey, 在管理页面查询https://xiaobenyang.com/calc?func=LabPage&proc=ListMyApikey
axios.defaults.headers.common['APIKEY'] = '*'

axios.post(null,{
            'predServId': '34',
            'search_content': this.query.words
})
4.3. API 返回格式

返回结果是列表,每个里面包含原文搜索列和高亮列。高亮列会在元列名后加"_highlight"。

4.4. API结果示例
[
  {
    "chapter_highlight": "正文 第六十五回 马超大战葭萌关 <span style='color:red'>刘备</span>自领益州牧\n\n却说阎圃正劝张鲁勿助刘璋,只见马超挺身出曰:“超感主公之恩,无可上报,愿领一军攻取葭萌关,生擒<span style='color:red'>刘备</span>,务要刘璋割二十州奉还主公。”张鲁大喜,先遣黄权",
    "chapter_title_highlight": "马超大战葭萌关 <span style='color:red'>刘备</span>自领益州牧",
    "chapter_id": 65
  },
  {
    "chapter_highlight": ",如何中用,你却与他做保!他若不还时,必须连累足下,主公见罪奈何?”肃闻言,呆了半晌,曰:“恐玄德不负我。”瑜曰:“子敬乃诚实人也。<span style='color:red'>刘备</span>枭雄之辈,诸葛亮奸猾之徒,恐不似先生心地。”肃曰:“若此,如之奈何",
    "chapter_title_highlight": "吴国太佛寺看新郎 刘皇叔洞房续佳偶",
    "chapter_id": 54
  },
  {
    "chapter_highlight": "帛散给侍婢,以买其心,先教孙乾回荆州报喜。自此连日饮酒。国太十分爱敬。\n却说孙权差人来柴桑郡报周瑜,说:“我母亲力主,已将吾妹嫁<span style='color:red'>刘备</span>。不想弄假成真。此事还复如何?”瑜闻大惊,行坐不安,乃思一计,修密书",
    "chapter_title_highlight": "玄德智激孙夫人 孔明二气周公瑾",
    "chapter_id": 55
  },
  {
    "chapter_highlight": "<span style='color:red'>刘备</span>。备惧东吴,必投曹操。若是,则江南何日得安?为今之计,莫若使人赴许都,表<span style='color:red'>刘备</span>为荆州牧。曹操知之,则惧而不敢加兵于东南。且使<span style='color:red'>刘备</span>不恨于主公。然后使心腹用反间之计,令曹、刘相攻,吾乘隙而图之,斯为得耳",
    "chapter_title_highlight": "曹操大宴铜雀台 孔明三气周公瑾",
    "chapter_id": 56
  },
  {
    "chapter_highlight": "正文 第十六回 吕奉先射戟辕门 曹孟德败师淯水\n\n却说杨大将献计欲攻<span style='color:red'>刘备</span>。袁术曰:“计将安出?”大将曰:“刘备屯军小沛,虽然易取,奈吕布虎踞徐州,前次许他金帛粮马,至今未与,恐其助备;今当令人送与",
    "chapter_title_highlight": "吕奉先射戟辕门 曹孟德败师淯水",
    "chapter_id": 16
  },
  {
    "chapter_highlight": "麾军冲击,曹兵大败而退。单福命休追赶,收军自回。却说曹仁输了一阵,方信李典之言;因复请典商议,言:“<span style='color:red'>刘备</span>军中必有能者,吾阵竟为所破。”李典曰:“吾虽在此,甚忧樊城。”曹仁曰:“今晚去劫寨。如得胜,再作",
    "chapter_title_highlight": "玄德用计袭樊城 元直走马荐诸葛",
    "chapter_id": 36
  },
  {
    "chapter_highlight": "正文 第三十七回 司马徽再荐名士 刘玄德三顾草庐\n\n却说徐庶趱程赴许昌。曹操知徐庶已到,遂命荀彧、程昱等一班谋士往迎之。庶入相府拜见曹操。操曰:“公乃高明之士,何故屈身而事<span style='color:red'>刘备</span>乎?”庶曰:“某幼逃难",
    "chapter_title_highlight": "司马徽再荐名士 刘玄德三顾草庐",
    "chapter_id": 37
  },
  {
    "chapter_highlight": "扫清中原,有何盗贼?”松曰:“南有孙权,北有张鲁,西有<span style='color:red'>刘备</span>,至少者亦带甲十余万,岂得为太平耶?”操先见张松人物猥琐,五分不喜;又闻语言冲撞,遂拂袖而起,转入后堂。左右责松曰:“汝为使命,何不知礼,一味",
    "chapter_title_highlight": "张永年反难杨修 庞士元议取西蜀",
    "chapter_id": 60
  },
  {
    "chapter_highlight": " 正文 第六十二回 取涪关杨高授首 攻雒城黄魏争功\n\n却说张昭献计曰:“且休要动兵。若一兴师,曹操必复至。不如修书二封:一封与刘璋,言刘备结连东吴,共取西川,使刘璋心疑而攻<span style='color:red'>刘备</span>;一封与张鲁,教进兵",
    "chapter_title_highlight": "取涪关杨高授首 攻雒城黄魏争功",
    "chapter_id": 62
  },
  {
    "chapter_highlight": ",即皇帝位,名正言顺,以讨国贼。事不宜迟,便请择吉。”玄德大惊曰:“军师之言差矣。<span style='color:red'>刘备</span>虽然汉之宗室,乃臣子也;若为此事,是反汉矣。”孔明曰:“非也。方今天下分崩,英雄并起,各霸一方,四海才德之士,舍死亡",
    "chapter_title_highlight": "玄德进位汉中王 云长攻拔襄阳郡",
    "chapter_id": 73
  }
]

三国人物图谱

三国人物图谱是展示三国滚滚长河中出现的人物

也可以进行关键词搜索,例如搜素"关羽",结果中包含关羽,关羽的儿子和关羽的孙子。



具体步骤如下,

1. 使用 "全文检索"应用,填写参数配置

参数配置如下:

参数名称

参数内容

说明

文件路径

mylabdata://aboutdata.top/sanguo_person.ak

输入数据,包括三国人物信息

文本检索列

["f00", "f01", "f02", "f03", "f04", "f05", "f06", "f07", "f08", "f09", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20"]

文本检索列,先分词再按照分词结果检索。

这里选择了前20列

原始检索列

["chapter_id"]

原始检索列,部分词直接原文匹配。

这里选择了一列:

chapter_id:章节ID

分词方法

IkAnalysis

分词方法,一般都是用Ik分词

返回数据条数

10

每个搜索请求,最多返回10条结果

检索条件的列名

search_content

预测服务输入的列名

预测服务名称

sanguo/三国人物搜索

预测服务名称

是否输出原文

"是": 输出原文 + 高亮段落

"否": 输出高亮段落,不输出原文


2. 查看已搭好的应用

https://aboutdata.top/api/calc?func=LabPage&proc=EditJob&jobId=1779429663180810


3. 查看已部署的服务

https://aboutdata.top/api/calc?func=LabPage&proc=ShowMyLabPrediction&myLabPredictionName=sanguo%2F%E4%BA%BA%E7%89%A9%E6%90%9C%E7%B4%A2A

三国演义原文阅读

这里可以直接阅读三国演义


这里使用了"简单查询" 应用,使用"三国演义原文数据",可以进行简单表达式查询,例输入chapter_id=10, 返回第10章内容。输入chapter>-1, 返回所有章节内容。

  1. 使用"简单查询"应用,填写参数配置
  2. 查看已搭好的应用

https://xiaobenyang.com/discuss-post?id=142

1. 查看已部署的服务

https://xiaobenyang.com/discuss-post?id=163


三国人物关系图谱


三国关系图谱,输入一个三国人物,给出最相关的十个人物。下图是搜索"周瑜"


这里使用"人物关系图谱" 应用,具体步骤如下,

1. 使用 "人物关系图谱" 应用,天下配置参数

参数名称

参数内容

说明

内容表

mylabdata://aboutdata.top/sanguo.ak

输入数据,包括三国演义小说章节内容

人物表

mylabdata://aboutdata.top/sanguo_person.ak

输入数据,包括三国人物信息

自定义分词字典

["曹操", "孔明", "玄德", "刘玄德", "刘备", "关羽", "张飞", "云长", "关公", "赵云", "曹孟德", "诸葛亮", "张郃", "孙权", "张辽", "鲁肃", "仲谋"]"

字符串数组,这里主要是三国人物名称

自定义停用词表

["亦", "曰", "遂", "吾", "已", "去", "二人", "今" ... ...]

字符串数组,这里去掉一些文言文的一些词

自定义同义词词表

["玄德:刘备",

"刘玄德:刘备",

"孔明:诸葛亮",

"诸葛孔明:诸葛亮",

"赵子龙:赵云" ... ... ]

字符串数据,将出现的词替换成后面的词。例如"玄德:刘备",会把"玄德"替换成"刘备"。 这里主要是将一个人的字替换成名称,以及常用说法替换。

Word2Vec参数设置

100

embedding的向量长度

6

最小词频,只有出现6次以上的词参与计算相似度

50

迭代次数

输出人物个数

10

找到关系最紧密的10个人

部署预测服务地址

sanguo/三国人物关系


2. 查看搭建好的应用

https://xiaobenyang.com/discuss-post?id=140

3. 查看已部署的服务

4. API调用预测服务

4.1. API参数

参数

名称

说明

predServId

服务ID

在服务页面上查看服务名称对应的ID

word

搜索的人物名称

搜索内容,和应用里"检索条件的列名" 一致

4.2. API请求示例
var axios = require('axios')
  
//设置小笨羊API访问URL
axios.defaults.baseURL = 'https://xiaobenyang.com/pred'
  
// 设置访问ApiKey, 在管理页面查询https://xiaobenyang.com/calc?func=LabPage&proc=ListMyApikey
axios.defaults.headers.common['APIKEY'] = '*'
  
axios.post(null,
      {
        'predServId': '37',
        'word': this.personText
})
4.3. API 返回格式

返回结果有两项,ID是相似人物列表,METRIC是对应的相似值。

4.4. API结果示例
{
  "ID": "[\"刘备\",\"曹操\",\"关羽\",\"诸葛亮\",\"张飞\",\"吕布\",\"孙权\",\"尹赏\",\"赵云\",\"诸葛均\"]",
  "METRIC": "[2.220446049250313E-16,0.16544457314911365,0.17483780432465534,0.17585142804583687,0.17818276052801407,0.18520283995722442,0.19128323851720297,0.1931246414265776,0.20022031005941043,0.20100044977538278]"
}