项目一:体系结构化推理场景:
苟利国家生死以,岂因祸福避趋之。本算法适用于一切体系结构推理。重点,一切!!!!这就是个例子。
需求分析及数据集构建
在参加地学口的项目中,最令人头大的不是算法构建,也不需求分析(这句话是违心的,通常他们也不知道需求是什么),最令人头大的是没有数据集。现在深度学习能做吗,当然能做,好做吗,不好做。为啥?没有数据集呗,所以搞定数据集,让数据集可用,才是项目的第一奥义。别人只会给你认为可能有用的,但是不会给你觉得有用的,所以诸君且行且珍惜。
好了,言归正传当需求给出给砂岩体系结构时候,输入任意个砂岩名称,需要正确返回最大可能性的次父类节点到父类节点。节点是层级是明确的,那如何依次寻找最大可能性成为了问题,这里面分为三种情况,第一种,全部名称都是存在节点,且节点都在一条父子链路上,那样就很简单。第二种,有些名称在兄弟节点或者,最大可能性父类节点上的兄弟节点。第三种存在干扰名称,这些名称不存在与节点中。
根据项目要求需要将数据集存入知识图谱(这个在下一章知道图谱构建和国产Neo4j中也有案例详细涉及),我们可以将知识图谱简单的认为是Mysql。构建完成效果如下:
推理思想解析:
这时候一定有很多想法,比如用决策树,用哈希树等等, 而我那时候拿到该小案例项目时候,想到的解决策略是用占比的思想,简单来说,就是有的都有,没有的都没有,如果输入错误或构建中构建节点错误,那么查的时候整体比重将不会改变,所有什么用占比来构建,那下一步就是聚类算法,聚类算法字面意思是玩的来的就聚成一类,玩不来的就滚,莫挨老子。所以当输入一堆名称时候,我们先不急着一个个推出所有路径,我们先看这一堆词占哪些父类下的子类节点,那就是先把这些父类加入提取出来,同时把占比量提取出来。如此一下,再把父类提取一下,看一下,父类占父类的父类占比,这样就能一层层推出来,最后一定是那唯一一个最大总父类节点。这样这个项目就简单了很多,而不是不知道该干什么。
这样我们将图谱转换为一层层,层级关系,这边我们轻举例子,这是简单罗列三道四层。
这一篇已经将数据删除,意思是table.add_document(“F”, [“A r,…”]) 其中“F”是父类,[“A r,…,…,…,…”]是F所包含的父类,以此类推
“”
0就是代表最大父类节点的一个分支,之后一层类推
# 0
table.add_document("F", ["A r,....."])
# 1
table.add_document("A r", ["A c"])
# 1
table.add_document("B r", ["B b"])
# 1 4
table.add_document("C r", ["B s"])
# 2
table.add_document("A c", ["A m"])
解决方案:
提示:这里填写该问题的具体解决方案:
当构建好层级关系后,最后一步就是选一个聚类算法,这里我用的是tf-idf为什么呢,因为我搞自然语言处理,我觉得整个命名体识别,全靠一个Tf-Idf和词性标注撑着(这个后面博客会陆续更新)。所以很熟悉这个算法原理,这样就变的很简单了起来,用于一个Tf-Idf然后稍微改一下下,在加上结构化需求,给每一层最大可能性排序,然后根据最大可能性往下连接最大可能性,排序就用python里面sort函数就行,为什么不用什么算法排序呢,求求了不要装了,代码写的简洁大家看得懂就好了。别问我Tf-Idf怎么实现的,这个也太弱了吧,网上很多帖子,查一下就可以了,甚至只要知道它是个聚类算法,代码能看懂,找到在哪改就好了。最后还需要加一个如果都不是的情况下案例输出,代码案例如下
from tfidf import TfIdf
table = TfIdf()
# 0
table.add_document("F F", ["A r"])
# 1
# 3
table.add_document("B b", ["G"])
inplist = []
char =input()
while char!="":
inplist.append