作者:达摩院-咏江
内容
近期在读金庸先生的天龙八部,心念念在金庸先生作品中,偏爱哪位人物,喜欢哪个武功招式,偏向哪个武侠组织。正临云栖大会modelscope发布,了解modelscope里上线了40多个信息抽取的模型,不仅仅包括新闻、简历、微博、医疗、金融等行业,还覆盖中、英、饿、西、法等语种模型,甚至包括不同规格(base、large、lstm)模型。经过一番尝试,发现小说这个行业模型比较适合,拿来把玩一下,全部的实体抽取模型可以通过这个链接访问 https://modelscope.cn/models?page=1&tasks=named-entity-recognition
从网上下载了天龙八部新修版,一共百万余字,按行分别使用modelscope进行文本解析。按照 武侠人物、组织、招式、地点、头衔、武器分别进行分析,发现有些有趣的现象。
武侠人物云图
本来,我以为最top的是乔峰,但没想到金老爷子偏爱的是段誉。而且,屡战屡败的鸠摩智竟然名列前茅。
招式云图
《天龙八部》招式出现次数最多的是凌波微步。。打不过可以跑呀。
此外,还看到了降龙二十八掌,一开始以为是文本错误,经过一番查询,才知道是金老爷子在新版本把十八掌改成了二十八掌,与之同时,结局也改了下,段誉与王语嫣最终没能携手。。。。给众多读者留下了不少遗憾。
武侠组织图
丐帮,果然还是第一大帮,而且关于丐帮的故事在整个小说里也占据很大比重。
头衔云图
头衔其实就是外号或者昵称,出乎意料的是南海鳄神是出现最多的。不过看过天龙八部的都知道,南海鳄神十分在乎别人对自己的称呼,逢人必自报家门,且非常抗拒岳老三这个称呼,每次都要纠正自己是南海鳄神岳老二。
武器云图
六脉神剑,段家绝学,运转六脉剑气。段誉在少林寺、曼陀山庄,两度凭借此神功打败慕容复,为慕容博称赞为“天下第一剑”。
地点云图
天龙八部小说合计五册,基本每册都会有一个新的舞台。从这些热门地点我们基本就能还原出天龙八部的故事梗概:
第一章:段誉在无量山-大理国-天龙寺的神奇经历
第二章:段誉乔峰在姑苏结为兄弟,乔峰被指契丹人逐出丐帮
第三章:虚竹巧破珍珑棋局,成为缥缈峰灵鹫宫主人
第四章:少林寺大战,三兄弟聚义
第五章:收尾,西夏招婿,段誉继位,雁门关大战,萧峰自戕
附加代码
我们可以选择通过modelscope的notebook或本地安装,如是在本地安装,先通过一行命令下载安装modelscope
pip install "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
先通过以下命令下载模型,试用模型的pipeline能力
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
ner_pipeline = pipeline('named-entity-recognition', 'damo/nlp_raner_named-entity-recognition_chinese-base-book')
ner_pipeline('风族最强大的存在,风帝,为当世顶尖强者之一。')
调用上面的代码后,输出如下:
[
{
"end": 2,
"span": "风族",
"start": 0,
"type": "ORG"
},
{
"end": 11,
"span": "风帝",
"start": 9,
"type": "TIT"
}
]
再通过以下代码开始处理《天龙八部》,可以从网上找了个txt,保持成"天龙八部.txt", 接下来通过以下代码将不同类型对应的实体保存到词典里
import codecs
per_map = {}
org_map = {}
loc_map = {}
kun_map = {}
tit_map = {}
wea_map = {}
def find_typemap(v):
if v['type'] == 'PER':
return per_map
if v['type'] == 'ORG':
return org_map
if v['type'] == 'LOC':
return loc_map
if v['type'] == 'KUN':
return kun_map
if v['type'] == 'TIT':
return tit_map
if v['type'] == 'WEA':
return wea_map
def proc(js):
for v in js['output']:
entity = v['span']
m = find_typemap(v)
if entity in m:
m[entity] += 1
else:
m[entity] = 1
lines = codecs.open('天龙八部.txt', encoding='gb18030', errors='replace').readlines()
for line in lines:
result = ner_pipeline(line)
proc(result)
打印下六组类型对应的实体词,获得词云数据,通过微词云平台获取词云图片。