菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
25
0

史上规模最大的中文知识图谱以及估值两个亿的 AI 核心代码

原创
05/13 14:22
阅读数 503

—— 大声告诉我,怎样才能可以让你变得更强?

—— 充钱

—— ???

—— 都什么玩意?还有啥子咧?

—— 充更多钱

执迷不悟,无可救药了。

所以,正确答案应该是什么呢?

答:是知识。

反正,说这些就是为了切入「知识」这个话题。

知识是什么?比如:姚明的身高是 226cm,这就是一个知识。

那么问题来了,世界上错综复杂的事物这么多,我们上哪里去学这么多知识啊?怎么快速把有意义的数据收集下来呢?

爬虫?可以,去爬吧,维基百科,百度百科,爬个全站,然后分析下,是能得到不少知识,可你得花多少钱多少时间才能搞下来啊。

不过,今天你看到了这篇文章,那就不用费这些功夫了。

史上规模最大的中文知识图谱

今天逛 GitHub 发现了一个开源项目,叫做 KnowledgeGraphData,号称是史上规模最大的中文知识图谱,有 1.4 亿条数据。

这个时代,想必大家或多或少也听人吹嘘过「知识图谱」这个词,好像每个公司也在自己建各种各样的知识图谱,想必大家不知道知识图谱的也知道个差不多这是干嘛的了。

知识就是力量,知识图谱是人工智能新时代的产物,简单地说知识图谱就是通过关联关系将知识组成网状的结构,然后我们的人工智能可以通过这个图谱来认识其代表的这一个现实事件,这个事件可以是现实,也可以是虚构的。

就像上面的图一样,每个实体(比如一个人、一家公司、一件事),它都会作为一个节点出现在知识图谱里面,实体和实体之间又有各种关联关系,每一个实体又有各种属性,每个属性都有其对应的属性值。

比如「姚明」的妻子是「叶莉」,他们之间就构成了夫妻关系,这就是实体和实体之间的关联。「姚明」的身高是 226cm,「身高」就是一个属性,「226cm」就是属性值。

就是这样,一个个的实体和属性就构成了一个庞大的知识库,把它构建成图(Graph)的形式就成了知识图谱,就是这么回事。

那么一条知识一般怎么来表示呢?

很常见的形式就是三元组,比如:

姚明,身高,226cm

这里以逗号分隔了,第一个字段就代表实体,第二个字段代表其属性,第三个字段代表其属性值。

嗯,那今天介绍的这个开源知识图谱也是这样的形式,它是一个 csv 文件,包含了 1.4 亿条数据。

先放 GitHub 地址:https://github.com/ownthink/KnowledgeGraphData,详情大家可以直接过去看。

下载之后解压得到一个 csv 文件,看看文本行数:

wc -l ownthink_v2.csv 
140919781 ownthink_v2.csv

确实是 1.4 亿。

看看里面的格式是怎样的:

$ head ownthink_v2.csv
实体,属性,值
胶饴,描述,别名: 饴糖、畅糖、畅、软糖。
词条,描述,词条(拼音:cí tiáo)也叫词目,是辞书学用语,指收列的词语及其释文。
词条,标签,文化
红色食品,描述,红色食品是指食品为红色、橙红色或棕红色的食品。
红色食品,中文名,红色食品
红色食品,是否含防腐剂,否
红色食品,主要食用功效,预防感冒,缓解疲劳
红色食品,适宜人群,全部人群
红色食品,用途,增强表皮细胞再生和防止皮肤衰老
$ head ownthink_v2.csv
实体,属性,值
胶饴,描述,别名: 饴糖、畅糖、畅、软糖。
词条,描述,词条(拼音:cí tiáo)也叫词目,是辞书学用语,指收列的词语及其释文。
词条,标签,文化
红色食品,描述,红色食品是指食品为红色、橙红色或棕红色的食品。
红色食品,中文名,红色食品
红色食品,是否含防腐剂,否
红色食品,主要食用功效,预防感冒,缓解疲劳
红色食品,适宜人群,全部人群
红色食品,用途,增强表皮细胞再生和防止皮肤衰老

我们可以用 Python 来输出一部分看看:

import sys
import csv

with open('ownthink_v2.csv', 'r', encoding='utf8') as fin:
  reader = csv.reader(fin)
  for index, read in enumerate(reader):
    print(read)
    if index > 10:
      sys.exit(0)

运行结果:

['实体', '属性', '值']
['胶饴', '描述', '别名: 饴糖、畅糖、畅、软糖。']
['词条', '描述', '词条(拼音:cí tiáo)也叫词目,是辞书学用语,指收列的词语及其释文。']
['词条', '标签', '文化']
['红色食品', '描述', '红色食品是指食品为红色、橙红色或棕红色的食品。']
['红色食品', '中文名', '红色食品']
['红色食品', '是否含防腐剂', '否']
['红色食品', '主要食用功效', '预防感冒,缓解疲劳']
['红色食品', '适宜人群', '全部人群']
['红色食品', '用途', '增强表皮细胞再生和防止皮肤衰老']
['红色食品', '标签', '非科学']
['红色食品', '标签', '生活']

可以看到,输出结果就是一个三元组的形式,三元组个数一共是 1.4 亿个。

可以说是相当丰富了。

用法

这个知识图谱是来自于「思知 OwnThink」的,利用知识图谱我们可以做非常多的事情,比如做对话机器人、语义理解、知识推荐等等。

翻了翻「思知 OwnThink」的官方文档,发现他们已经在这个知识图谱的基础上搭建了很多服务了,比如对话机器人、微信机器人、语义理解等等相关的服务,并封装了相应的 API。

详情可以见:https://www.ownthink.com/docs/。

就拿知识图谱来说吧:https://www.ownthink.com/docs/kg/,这里封装了一些 API,比如获取歧义关系、获取实体知识、获取属性值等等。

例如获取属性值,我们可以用两种方式来获取。

GET

我们可以使用 GET 请求直接获取,请求的 URL 是 https://api.ownthink.com/kg/eav?entity=entity_name&attribute=attribute_name,这里就传入实体名称和属性即可。

例如直接访问:https://api.ownthink.com/kg/eav?entity=苹果&attribute=颜色 就可以获取 JSON 格式的结果了。

POST

同样也可以以 POST 形式来获取,Python 示例代码:

import requests

url = 'https://api.ownthink.com/kg/eav'
data = {
    'entity': '苹果',
    'attribute': '颜色'
}
response = requests.post(url, data=data)
print(response.json())

返回结果:

{'message': 'success', 'data': {'entity': '苹果', 'attribute': '颜色', 'value': ['红色粉色金黄色绿色白色']}}

这里不知咋回事,结果的 list 没有逗号分隔,但官方文档那边是有的,应该是出了一点问题。

其他的一些调用也可以参考它的官方文档:https://www.ownthink.com/docs/kg/,

另外也可以关注下它们的自然语言处理工具、语义理解工具,看起来还是值得一用的。

AI 核心代码

想必之前大家又被一个号称估值一个亿的 AI 核心代码刷过屏,那么首先看看人家的估值一个亿的 AI 核心代码是怎样的:

while True:
    print(input().replace('你', '我').replace('吗', '').replace('?', '!'))

运行结果如下:

在吗?
在!
你能听懂中文吗?
我能听懂中文!
你是世界上最强的AI吗?
我是世界上最强的AI!

看起来已经相当牛逼了!但还不够!

有了这个图谱的加持,我们可以把它的估值做到两个亿!

首先有了图谱,我们就可以让这个 AI 来学习知识了,比如让它学习到「姚明」的「身高」是「226cm」这样的知识,只要它会,那就有问必答,要是不会,你告诉它了,它就能学习,再问一遍就可以能答对,具有超强的学习和记忆能力!

怎么样碉堡了有没有?

那就放出代码来吧!

from collections import defaultdict

data = defaultdict(dict)
file = 'ownthink_v2.csv'
total = 10000000


def learn(total=None):
    count = 0
    fin = open(file, encoding='utf-8')
    while total is None or count < total:
        line = fin.readline().strip()
        print(line)
        count += 1
        groups = line.split(',')
        if len(groups) == 3:
            data[groups[0]][groups[1]] = groups[2]


learn(total)
print(f'我学习了{total}条知识,来问我问题吧!')
while True:
    question = input('你问我个问题?')
    name, attribute = question.split('的')
    if name in data and attribute in data[name]:
        print(f'{name}的{attribute}是{data[name][attribute]}!')
    else:
        answer = input('我不知道啊,你告诉我呗!')
        data[name][attribute] = answer

其实吧哈哈,就是随便玩玩写了个玩具代码,主要是想看看里面的知识全不全。

在这里定义了 total 这个变量,随便给它指定多少,他就学 CSV 里面多少条知识,设定为 None 就会全部学习。

在这里我们使用了 defaultdict 来存储三元组信息,然后最后根据问的问题来回答,如果它回答不上来,可以告诉它,下次再问它就会了。

我们来试试这个估值两个亿的 AI 代码吧:

我学习了100000000条知识,来问我问题吧!
你问我个问题?
老挝的首都
老挝的首都是万象!
你问我个问题?
郭艾伦的身高
郭艾伦的身高是1米92!
你问我个问题?
郭艾伦的外号
我不知道啊,你告诉我呗!
郭一分
你问我个问题?
郭艾伦的外号
郭艾伦的外号是郭一分!

碉堡了有木有?哈哈哈。你看它既知道好多知识,又能回答问题,又能自学习,是不是远超那一个亿的核心代码了?想必估值两个亿不在话下了。

好了,玩归玩,闹归闹,别拿艾伦开玩笑。

大家如果感兴趣可以去 GitHub 主页(https://github.com/ownthink/KnowledgeGraphData)下载这个知识图谱。

发表评论

0/200
25 点赞
0 评论
收藏
为你推荐 换一批