精华内容
下载资源
问答
  • 机器学习AI算法工程 公众号:datayx小型金融知识图谱构流程示范存储方式基于RDF的存储基于图数据库的存储 知识图谱构建代码 链接获取:关注微信公众号 datayx 然后回复 知识图谱 即可获取。AI项目体验地址 ...

    82aa280901aa8ad9103e83b595daa9ad2da.gif

    向AI转型的程序员都关注了这个号👇👇👇

    机器学习AI算法工程 公众号:datayx

    小型金融知识图谱构流程示范

    存储方式

    基于RDF的存储

    基于图数据库的存储

    dedd481804dc4ee48d407d4bc5e9fb75c31.png

    知识图谱构建代码 链接获取:

    关注微信公众号 datayx 然后回复 知识图谱 即可获取。

    AI项目体验地址 https://loveai.tech

    知识图谱构建流程

    1.数据获取

    (1)股票基本信息

    (2)股票Top10股东信息

    (3)股票概念信息

    (4)股票公告信息

    (5)财经新闻信息(该数据集已获取但需进一步处理,未存入图数据库)

    (6)概念信息

    (7)股票价格信息

    2.数据预处理

    (1)基本信息存在空值

    (2)股东信息存在重复数据

    (3)CSV文件格式更改为UTF-8格式

    (4)计算股票对数收益

    (5)保留股票价格交易日为242(众数)&计算皮尔逊相关系数

    3.数据存储

    (1)明确实体&关系

    (2)使用py2neo交互neo4j创建节点和关系

    4.数据可视化查询

    (1)基于Crypher语言

    5.相关应用

    (1)中心度算法(Centralities)

    (2)社区检测算法(Community detection)

    (3)路径搜索算法(Path finding)

    (4)相似性算法(Similarity)

    (5)链接预测(Link Prediction)

    数据获取

    c248b6a81220be206e71663c2ba359bf5b1.png

    301c36cfa7692cc1e22b712262d56d2c147.png

    数据预处理

    7fab2868ddf33ded2f2b0d2b38c74636d1e.png

    711358c1628a827915ee1d7339f06aca5af.png

    2321136db98bdacbe3d7df70f10ad43e9ce.png

    数据交互(Sample)

    57e0ed161947ac1ce7bea063b4e95605c6c.png

    dcdef877310bcafed9d369cd0c9af76aab4.png

    b0c22843c488d1021c934d9d3bf8396b859.png

    数据可视化查询

    查询与“平安银行”相关信息(所属概念板块、发布公告、属于深股通/沪股通、股东信息)

    765c0134b1634061857255a14d072c8f64e.png

    插入股票间相关系数之后,显示与“平安银行”所有相关信息

    6620073ccd34488e031fab03adb1ad31a2c.png

    查询“平安银行”与“万科A”的对数收益的相关系数

    41b7982e91018011b3e3c0d07699bdae3e8.png

    导入已开源的图算法(仅简单的统计算法)

    (1)下载graph-algorithms-algo-3.5.4.0.jar复制到对应数据库的plugin文件夹下

    (2)修改数据库目录下的conf中neo4j.conf,添加dbms.security.procedures.unrestricted=algo.*

    链路预测算法

    使用neo4j附带的图算法,其中链路预测部分主要基于判断相邻的两个节点之间的亲密程度作为评判标准

    c300f691bc431a8e009b60da2485134eece.png

    7689f3d3f3ecf506b66fbcedb689e062562.png

    09ec3adaf0347c9c8560db5aa87bb26fb59.png

    其他算法

    中心度算法(Centralities):

    (1)PageRank (页面排名)

    (2)ArticleRank

    (3)Betweenness Centrality (中介中心度)

    (4)Closeness Centrality (接近中心度)

    (5)Harmonic Centrality

    社区检测算法(Community detection):

    (1)Louvain (鲁汶算法)

    (2)Label Propagation (标签传播)

    (3)Connected Components (连通组件)

    (4)Strongly Connected Components (强连通组件)

    (5)Triangle Counting / Clustering Coefficient (三角计数/聚类系数)

    路径搜索算法(Path finding):

    (1)Minimum Weight Spanning Tree (最小权重生成树)

    (2)Shortest Path (最短路径)

    (3)Single Source Shortest Path (单源最短路径)

    (4)All Pairs Shortest Path (全顶点对最短路径)

    (5)A*

    (6)Yen’s K-shortest paths

    (7)Random Walk (随机漫步)

    相似性算法(Similarity):

    (1)Jaccard Similarity (Jaccard相似度)

    (2)Cosine Similarity (余弦相似度)

    (3)Pearson Similarity (Pearson相似度)

    (4)Euclidean Distance (欧氏距离)

    (5)Overlap Similarity (重叠相似度)

    链接预测(Link Prediction):

    (1)Adamic Adar

    (2)Common Neighbors

    (3)Preferential Attachment

    (4)Resource Allocation

    (5)Same Community

    (6)Total Neighbors

    预处理算法(Preprocessing):

    (1)One Hot Encoding

    阅读过本文的人还看了以下文章:

    不断更新资源

    深度学习、机器学习、数据分析、python

    搜索公众号添加:datayx

    4e7c674bfcb3eceb5c9c4617d35d178defe.jpg

    QQ群

    333972581

    dab5ba2194f50da6832d9cbf7597799c2c6.jpg

    展开全文
  • 小型金融知识图谱构建流程 小型金融知识图谱构流程示范 小型金融知识图谱构流程示范 1 知识图谱存储方式 2 图数据库neo4j 2.1 下载 2.2 启动 2.2.1 打开 http://localhost:7474 2.2.2 初始账户和密码均为neo4j...
  • Zincbase 一个知识图谱构建工具包
  • 大家如果对python操作Neo4j导入CSV并不是很熟悉的话...这是本次构建知识图谱的CSV格式的数据源,这是在上次数据的基础上截取了一小部分并且对数据的内容进行了一定的修改便于大家看的更加明显(图中数据信息均为乱改 不

    大家如果对python操作Neo4j导入CSV并不是很熟悉的话,可以先看看这篇文章有个大概的操作基础。传送门

    大家看过上篇文章应该知道,我们最后构建出来的知识如下图所示,但很明显可以看出来华南师范大学这个节点应该只有一个,应该让所有属于华南师范大学的人物都连接在唯一的节点上而不是每个人物都有属于它自己的节点。这样才会使得我们的图谱更加的紧凑。
    在这里插入图片描述
    数据源
    这是本次构建知识图谱的CSV格式的数据源,这是在上次数据的基础上截取了一小部分并且对数据的内容进行了一定的修改便于大家看的更加明显(图中数据信息均为乱改 不做实际参考)
    在这里插入图片描述
    我们导入CSV格式的文件数据和上次讲的一样,直接读取数据并构建其节点。

    with open('D:\\Python\\neo4j-community-4.1.1\\import\\data.csv', 'r',encoding='utf-8') as f:
        reader = csv.reader(f)
        data = list(reader)
    for i  in  range(1,len(data)):
        node = Node('person',name = data[i][1],level= data[i][2],major = data[i][4],univer = data[i][3])
        relation = Node('major',name = data[i][4])
        relation1 = Node('univer',name = data[i][3])
        relation2 = Node('level',name = data[i][2])
        graph.create(node)
        graph.create(relation)
        graph.create(relation1)
        graph.create(relation2)
    

    这样构建出来的节点肯定有重复的,比如level这一列我们构建了十个节点但是不重复的节点只有三个,所以我们要把重复的节点都给删除掉。

    graph.run('MATCH (n:level) WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count WHERE count > 1 CALL apoc.refactor.mergeNodes(nodelist) YIELD node RETURN node')
    

    运行这行程序就可以把level中重复的节点删除掉。其他有重复的也是如此(graph.run()里面的代码也可以在neo4j中运行防止因为python代码出错而显示不出来)
    当我们把重复的节点删除以后我们就可以根据关系把节点联系在一起

    graph.run('MATCH (entity1:person) , (entity2:major{name:entity1.major}) CREATE (entity1)-[:研究]->(entity2)')
    graph.run('MATCH (entity1:person) , (entity2:univer{name:entity1.univer}) CREATE (entity1)-[:学校]->(entity2)')
    graph.run('MATCH (entity1:person) , (entity2:level{name:entity1.level}) CREATE (entity1)-[:学位]->(entity2)')
    

    最后运行出来 结果如下:
    在这里插入图片描述
    基于python的Django框架和Neo4j的知识图谱可视化

    展开全文
  • 编译 | Arno来源 | github【磐创AI导读】:本系列文章为大家介绍了如何使用特定领域的文档构建知识图谱。想要获取更多的机器学习、深度学习资源,欢迎大家点击上方蓝字关注我们的公众号:磐创AI。在任何业务中,word...

    编译 | Arno

    来源 | github

    【磐创AI导读】:本系列文章为大家介绍了如何使用特定领域的文档构建知识图谱。想要获取更多的机器学习、深度学习资源,欢迎大家点击上方蓝字关注我们的公众号:磐创AI。

    在任何业务中,word文档都是很常见的,它们以原始文本、表格和图像的形式包含信息,所有这些都包含重要的事实。此代码模式[1]中使用的数据来自维基百科的两篇文章。第一个摘自肿瘤学家Suresh H. Advani的维基百科页面,第二个摘自关于肿瘤学的维基百科页面。这些文件被压缩为archive.zip文件[2]。

    在下面的图中,有一个关于肿瘤学家Suresh H. Advani的文本信息出现在word文档中,还有一个表格包括他曾获多个机构颁发的奖项。

    在这个代码模式中,我们解决了从word文档中的文本和表格中提取知识的问题。然后从提取的知识中构建知识图谱,使知识具有可查询性。

    而从word文档中提取知识过程中的遇到一些挑战主要为以下两个方面:自然语言处理(NLP)工具无法访问word文档中的文本。word文档需要转换为纯文本文件。

    业务和领域专家能够了解文档中出现的关键字和实体,但是训练NLP工具来提取领域特定的关键字和实体是一项很大的工作。此外,在许多场景中,找到足够数量的文档来训练NLP工具来处理文本是不切实际的。

    在此模式中我们采用以下方法克服遇到的这些挑战:使用基于python的mammoth库将.docx文件转化为html文件(半结构化格式)

    Watson Natural Language Understanding(Watson NLU)用于提取常见的实体。

    使用基于规则的方法来扩展Watson NLU的输出(这种方法的解释参见代码模式Extend Watson text Classification [3])。基于规则的方法不需要训练文档或训练工作。算法将配置文件作为输入,而此文件需要由领域专家配置。

    使用Watson NLU提取实体之间的关系。

    使用基于规则的方法来扩展Watson NLU的输出(这种方法的解释参见代码模式Watson Document Correlation[4])。基于规则的方法不需要训练文档或训练工作。算法将配置文件作为输入,而此文件需要由领域专家配置。

    两全其美的方法--同时使用基于训练和规则的方法从文档中提取知识。

    在这个模式中,我们将演示:从包含自由浮动的文本和表格文本的文档中提取信息。

    清理数据[3]模式以从文档中提取实体

    使用Watson Document Correlation[4]模式提取实体之间的关系

    从提取的知识中建立一个知识图谱。

    是什么让这个代码模式具有价值:处理docx文件中的表格和自由浮动文本的能力。

    以及将Watson NLU的实时分析结果与主题专家或领域专家定义的规则的结果相结合的策略。

    此代码模式旨在帮助开发人员、数据科学家为非结构化数据提供结构。这可以显著地帮助他们进行分析,并将数据用于进一步处理以获得更好的见解。

    流程需要分析和关联的docx文件 (html表格和自由浮动文本) 中的非结构化文本数据使用python代码从文档中提取。

    使用代码模式 Extend Watson text classification[3],文本使用Watson NLU进行分类,并进行标记。

    使用代码模式Correlate documents[5],将文本与其他文本关联

    使用python代码过滤结果。

    构建了知识图谱。

    此外,你可以通过视频[6]观看知识图谱的构建过程.

    所包含的组件IBM Watson Studio: 使用RStudio、Jupyter和Python在一个配置好的协作环境中分析数据,其中包括IBM的value-adds,比如managed Spark。

    -Watson Natural Language Understanding: 一种IBM云服务,可以使用自然语言理解分析文本,从概念、实体、关键字、类别、情感、关系、语义角色等内容中提取元数据。

    Jupyter Notebooks: 一个开源的web应用程序,允许你创建和共享包含实时代码、方程式、可视化和解释性文本的文档。

    构建步骤

    按照以下步骤设置和运行此代码模式,下面将详细描述这些步骤。创建IBM云服务

    使用IBM Watson Studio中的Jupyter Notebooks运行代码

    分析结果

    1. 创建IBM云服务

    创建IBM云服务[7]并将其命名为wdc-NLU-service。

    2. 使用IBM Watson Studio中的Jupyter Notebooks运行代码创建一个新的Watson Studio项目

    创建notebook

    运行notebook

    上传数据

    保存和分享2.1 创建一个新的Watson Studio项目登录到IBM的 Watson Studio,登录后,你将看到仪表板。

    通过点击New project并选择Data Science创建一个新项目。为项目起一个名称并点击Create。

    注意: 通过在Watson Studio中创建一个项目,一个免费的Object Storage服务和Watson Machine Learning服务将在你的IBM Cloud帐户中创建。选择免费存储类型以避免收费。2.2 创建notebook在新建项目Overview面板中,点击右上角的Add to project并选择Notebook资源类型。填写以下信息:

    选择From URL选项卡。(步骤1)

    输入notebook的名称和可选项描述。(步骤2)

    在Notebook URL下提供以下URL: https://raw.githubusercontent.com/IBM/build-knowledge-base-with-domain-specific-documents/master/notebooks/knowledge_graph.ipynb。(步骤3)

    对于Runtime运行环境,选择Python 3.5。(步骤4)点击Create按钮。

    提示: 一旦成功导入,notebook应该出现在Assets选项卡的Notebook部分。2.3 运行notebook选择下拉菜单 Cell > Run All运行notebook,或者使用play按钮自顶向下一次运行单元格。

    当单元格运行时,观察输出结果或错误。一个正在运行的单元格将有一个类似于In[*]的标签。一个完成的单元格将有一个运行序列号,而不是星号。2.4 上传数据

    将数据和配置上传到notebook上:notebook使用data[2]中的数据,将数据上传到我们的项目中

    在新项目的Overview面板中,单击右上角的Add to project并选择Data资源类型。屏幕右侧出现的面板将指导你如何上传数据,按照下图中编号的步骤操作。

    确保你在Load选项卡上。(步骤1)

    单击browse选项。在你的机器上定位到archive.zip、config_relations.txt和config_classification.txt文件的位置,并将它们上传。(没有标记步骤)

    上传后,转到Files选项卡。(步骤2)

    确保文件出现图中的位置。(步骤3)注意:可以使用你自己的数据和配置文件。如果使用自己的配置文件,请确保符合config_classification.txt文件中给出的JSON结构。

    3. 分析结果

    当我们浏览notebook时,我们首先要做的是:配置文件(config_classification.txt和config_relations.txt)已经被加载进来

    使用python包mammoth提取非结构化的信息,Mammoth将.docx文件转换为.html,并分析表格中的文本和自由浮动文本

    使用配置文件分析和扩展Watson Natural Language Understanding的结果。

    实体使用config_classification.txt文件进行扩展,关系使用config_relationships.txt文件进行扩展。

    然后对结果进行过滤和格式化,以获取相关关系并丢弃不相关的关系。

    将过滤后的关系发送到notebook中的绘制图形函数,构建知识图谱。

    相关链接:

    [1]: https://github.com/IBM/build-knowledge-base-with-domain-specific-documents

    [2]: https://github.com/IBM/build-knowledge-base-with-domain-specific-documents/tree/master/data

    [3]: https://developer.ibm.com/patterns/extend-watson-text-classification/

    [4]: https://developer.ibm.com/code/patterns/watson-document-correlation/

    [5]: https://github.com/IBM/watson-document-co-relation

    [6]: https://www.youtube.com/watch?v=lC2-h2ac_Jg&feature=youtu.be

    [7]: https://cloud.ibm.com/catalog/services/natural-language-understanding

    展开全文
  • 针对豆瓣TOP250电影知识图谱构建Python+neo4j)

    万次阅读 多人点赞 2020-01-22 12:01:52
    1. 首先对网页数据进行分析,进而确定节点和关系 我们直接分析电影点进去的详细页面,页面如下:(由于豆瓣在没有登录的情况下频繁对网站进行请求会被认为恶意攻击,导致自己的ip无法访问该网站,所以最好先下载...

    数据爬取网站: https://movie.douban .com/top250?start=0.

    代码下载地址:https://download.csdn.net/download/fufu_good/12117620.

    1. 首先对网页数据进行分析,进而确定节点和关系

    在这里插入图片描述
    我们直接分析电影点进去的详细页面,页面如下:(由于豆瓣在没有登录的情况下频繁对网站进行请求会被认为恶意攻击,导致自己的ip无法访问该网站,所以最好先下载下来)
    在这里插入图片描述
    通过上图,我们选择4个结点和4种关系

    4个结点分别为:

    • 电影名称(film_name)
    • 导演(director)
    • 演员(actor)
    • 类型(type)

    4种关系分别为:

    • acted_in(电影——>演员)
    • directed(电影——>导演)
    • belong_to(电影——>类型)
    • cooperation(导演——>演员)

    2. 下载分析页面

    点击鼠标右键查看源代码,知道链接的模式之后我们可以采用正则表达式进行匹配,然后获取链接对应页面,最终将获取的页面保存在文件中,为我们后面分析提供数据。
    在这里插入图片描述
    分析后,我们采用后面那包含class属性的链接(其实和上面一种一样,只是为了防止多次访问同样页面),最终我们采用如下正则表达式:

    <a href="https://movie.douban.com/subject/\d*?/" class="">
    

    最终形成的获取分析页面代码如下(最终我存放在代码目录下的contents目录下)(1_getPage.py):

    import requests
    import re
    import time
    
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
    }
    
    x = range(0, 250, 25)
    
    for i in x:
        # 请求排行榜页面
        html = requests.get("https://movie.douban.com/top250?start=" + str(i), headers=headers)
        # 防止请求过于频繁
        time.sleep(0.01)
        # 将获取的内容采用utf8解码
        cont = html.content.decode('utf8')
        # 使用正则表达式获取电影的详细页面链接
        urlList = re.findall('<a href="https://movie.douban.com/subject/\d*?/" class="">', cont)
        # 排行榜每一页都有25个电影,于是匹配到了25个链接,逐个对访问进行请求
        for j in range(len(urlList)):
            # 获取啊、标签中的url
            url = urlList[j].replace('<a href="', "").replace('" class="">', "")
            # 将获取的内容采用utf8解码
            content = requests.get(url, headers=headers).content.decode('utf8')
            # 采用数字作为文件名
            film_name = i + j
            # 写入文件
            with open('contents/' + str(film_name) + '.txt', mode='w', encoding='utf8') as f:
                f.write(content)
    

    3. 数据爬取

    3.1 结点数据爬取

    3.1.1 电影名称结点获取

    在这里插入图片描述
    首先分析页面数据,发现电影名称使用title标签框住,于是可以采用如下正则表达式对电影名称(film_name)进行提取:

    <title>.*?/title>
    

    3.1.2 导演结点获取

    接着分析导演(director)结点数据的提取:在这里插入图片描述
    通过分析源代码中的脚本,我们可以使用如下正则表达式对数据进行提取:

    "director":.*?]
    "name": ".*?"
    

    3.1.3 演员结点获取

    同理分析下面数据,提取演员(actor)结点数据:
    在这里插入图片描述
    我们可以使用如下正则表达式进行actor的提取:

    "actor":.*?]
    "name": ".*?"
    

    3.1.4 类型结点获取

    最后分析电影类别(type):
    在这里插入图片描述
    于是我们可以使用如下正则表达式进行数据提取:

    <span property="v:genre">.*?</span>
    

    3.1.5 综上,现在列出获取所有结点数据并且保存在csv中的代码(2_getNode.py):

    import re
    import pandas
    
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
    }
    
    
    def node_save(attrCont, tag, attr, label):
        ID = []
        for i in range(len(attrCont)):
            ID.append(tag * 10000 + i)
        data = {'ID': ID, attr: attrCont, 'LABEL': label}
        dataframe = pandas.DataFrame(data)
        dataframe.to_csv('details/' + attr + '.csv', index=False, sep=',', encoding="utf_8_sig")
    
    
    def save(contents):
        # save movie nodes
        film_name = re.findall('<title>.*?/title>', contents)[0]
        film_name = film_name.lstrip("<title>").rstrip("(豆瓣)</title>").replace(" ", "")
        film_names.append(film_name)
    
        # save director nodes
        director_cont = re.findall('"director":.*?]', contents)[0]
        director_cont = re.findall('"name": ".*?"', director_cont)
        for i in range(len(director_cont)):
            directors.append(director_cont[i].lstrip('"name": "').rstrip('"'))
    
        # save actors nodes
        actor_cont = re.findall('"actor":.*?]', contents)[0]
        actor_cont = re.findall('"name": ".*?"', actor_cont)
        for i in range(len(actor_cont)):
            actors.append(actor_cont[i].lstrip('"name": "').rstrip('"'))
    
        # save type
        type_cont = re.findall('<span property="v:genre">.*?</span>', contents)
        for i in range(len(type_cont)):
            types.append(type_cont[i].lstrip('<span property="v:genre">').rstrip('</span>'))
    
    
    film_names = []
    actors = []
    directors = []
    types = []
    for i in range(250):
        with open('contents/' + str(i) + '.txt', mode='r', encoding='utf8') as f:
            contents = f.read()
        save(contents.replace("\n", ""))  # 这里需要把读出来的数据换行符去掉
    
    # 去重
    actors = list(set(actors))
    directors = list(set(directors))
    types = list(set(types))
    # 保存
    node_save(film_names, 0, 'film_name', 'movie')
    node_save(directors, 1, 'director', 'person')
    node_save(actors, 2, 'actor', 'person')
    node_save(types, 3, "type", "type")
    print('ok1')
    
    

    3.2 结点关系数据爬取

    3.2.1 考虑acted_in关系

    我们分别对每个电影详细页面进行分析,提取电影名称(fillm_name)和演员列表(actor),将它们分别加入列表中,分析250个电影详细页面文件后最终进行保存,代码如下:

    def save_acted_in(content):
        # 获取当前电影对应ID
        film_name = re.findall('<title>.*?/title>', content)[0]
        film_name = film_name.lstrip("<title>").rstrip("(豆瓣)</title>").replace(" ", "")  # 电影名字每页只有一个
        filmNameID = getID('film_name', film_name)
    
        # 获取当前电影的演员和对应ID
        actor_cont = re.findall('"actor":.*?]', content)[0]
        actor_cont = re.findall('"name": ".*?"', actor_cont)
        for i in range(len(actor_cont)):  # 演员每页可能多个(通常都多个)
            actor = actor_cont[i].lstrip('name": "').rstrip('"')
            start_id.append(filmNameID)
            end_id.append(getID('actor', actor))  # 查找演员名字对应ID
    

    3.2.2 考虑directed关系

    接下来,我们还是分别对每个电影详细页面进行分析,提取电影名称(fillm_name)和导演列表(director),将它们分别加入列表中,分析250个电影详细页面文件后最终进行保存,代码如下:

    def save_directed(contnet):
        # 获取当前电影对应ID
        film_name = re.findall('<title>.*?/title>', content)[0]
        film_name = film_name.lstrip("<title>").rstrip("(豆瓣)</title>").replace(" ", "")
        filmNameID = getID('film_name', film_name)
    
        #
        director_cont = re.findall('"director":.*?]', content)[0]
        director_cont = re.findall('"name": ".*?"', director_cont)
        for i in range(len(director_cont)):
            director = director_cont[i].lstrip('"name": "').rstrip('"')
            start_id.append(filmNameID)
            end_id.append(getID('director', director))
    

    3.2.3 考虑belong_to关系

    接下来,我们还是分别对每个电影详细页面进行分析,提取电影名称(fillm_name)和类型列表(type),将它们分别加入列表中,分析250个电影详细页面文件后最终进行保存,代码如下:

    def save_belongto(content):
        # 获取当前电影对应ID
        film_name = re.findall('<title>.*?/title>', content)[0]
        film_name = film_name.lstrip("<title>").rstrip("(豆瓣)</title>").replace(" ", "")
        filmNameID = getID('film_name', film_name)
    
        #
        type_cont = re.findall('<span property="v:genre">.*?</span>', content)
        for i in range(len(type_cont)):
            type = type_cont[i].lstrip('<span property="v:genre">').rstrip('</span>')
            start_id.append(filmNameID)
            end_id.append(getID('type', type))
    

    3.2.4 考虑cooperation关系

    最后,我们还是分别对每个电影详细页面进行分析,提取演员列表(actor)和导演列表(director),将它们分别加入列表中,分析250个电影详细页面文件后最终进行保存,代码如下:

    def save_cooperation(content):
        # 获取当前电影的演员和对应ID
        actor_cont = re.findall('"actor":.*?]', content)[0]
        actor_cont = re.findall('"name": ".*?"', actor_cont)
    
        #
        director_cont = re.findall('"director":.*?]', content)[0]
        director_cont = re.findall('"name": ".*?"', director_cont)
    
        for i in range(len(actor_cont)):
            actor = actor_cont[i].lstrip('name": "').rstrip('"')
            for j in range(len(director_cont)):
                director = director_cont[j].lstrip('"name": "').rstrip('"')
                start_id.append(getID('actor', actor))
                end_id.append(getID('director', director))
    

    以上对保存每种关系分别定义了相应的函数进行关系对应,采用2个列表进行存储,一 一对应。

    3.2.5 下面贴出获取所以关系的整个代码(3_getRelations.py):

    (下面代码执行可能运行时间比较久、、、、、、、、、、、、、、、、、、)

    import re
    import pandas
    
    
    def getID(name, nameValue):
        df = pandas.read_csv('details/' + name + '.csv')
        for j in range(len(df[name])):
            if nameValue == df[name][j]:
                return df['ID'][j]
    
    
    acted_in_data = pandas.DataFrame()
    directed_data = pandas.DataFrame()
    cooperation_data = pandas.DataFrame()
    belong_to_data = pandas.DataFrame()
    
    
    def save_relation(start_id, end_id, relation):
        dataframe = pandas.DataFrame({':START_ID': start_id, ':END_ID': end_id, ':relation': relation, ':TYPE': relation})
        dataframe.to_csv('details/' + relation + '.csv', index=False, sep=',', encoding="utf_8_sig")
    
    
    def save_acted_in(content):
        # 获取当前电影对应ID
        film_name = re.findall('<title>.*?/title>', content)[0]
        film_name = film_name.lstrip("<title>").rstrip("(豆瓣)</title>").replace(" ", "")  # 电影名字每页只有一个
        filmNameID = getID('film_name', film_name)
    
        # 获取当前电影的演员和对应ID
        actor_cont = re.findall('"actor":.*?]', content)[0]
        actor_cont = re.findall('"name": ".*?"', actor_cont)
        for i in range(len(actor_cont)):  # 演员每页可能多个(通常都多个)
            actor = actor_cont[i].lstrip('name": "').rstrip('"')
            start_id.append(filmNameID)
            end_id.append(getID('actor', actor))  # 查找演员名字对应ID
    
    
    def save_directed(contnet):
        # 获取当前电影对应ID
        film_name = re.findall('<title>.*?/title>', content)[0]
        film_name = film_name.lstrip("<title>").rstrip("(豆瓣)</title>").replace(" ", "")
        filmNameID = getID('film_name', film_name)
    
        #
        director_cont = re.findall('"director":.*?]', content)[0]
        director_cont = re.findall('"name": ".*?"', director_cont)
        for i in range(len(director_cont)):
            director = director_cont[i].lstrip('"name": "').rstrip('"')
            start_id.append(filmNameID)
            end_id.append(getID('director', director))
    
    
    def save_belongto(content):
        # 获取当前电影对应ID
        film_name = re.findall('<title>.*?/title>', content)[0]
        film_name = film_name.lstrip("<title>").rstrip("(豆瓣)</title>").replace(" ", "")
        filmNameID = getID('film_name', film_name)
    
        #
        type_cont = re.findall('<span property="v:genre">.*?</span>', content)
        for i in range(len(type_cont)):
            type = type_cont[i].lstrip('<span property="v:genre">').rstrip('</span>')
            start_id.append(filmNameID)
            end_id.append(getID('type', type))
    
    
    def save_cooperation(content):
        # 获取当前电影的演员和对应ID
        actor_cont = re.findall('"actor":.*?]', content)[0]
        actor_cont = re.findall('"name": ".*?"', actor_cont)
    
        #
        director_cont = re.findall('"director":.*?]', content)[0]
        director_cont = re.findall('"name": ".*?"', director_cont)
    
        for i in range(len(actor_cont)):
            actor = actor_cont[i].lstrip('name": "').rstrip('"')
            for j in range(len(director_cont)):
                director = director_cont[j].lstrip('"name": "').rstrip('"')
                start_id.append(getID('actor', actor))
                end_id.append(getID('director', director))
    
    
    # 用来存放关系节点ID的列表
    start_id = []
    end_id = []
    
    # 循环查找每个页面(即contents文件夹中下载下来的页面),找出对应关系(acted_in)
    for i in range(250):
        with open('contents/' + str(i) + '.txt', mode='r', encoding='utf8') as f:
            content = f.read().replace('\n', "")  # 要去掉换行符
        save_acted_in(content)
    save_relation(start_id, end_id, 'acted_in')
    print('[+] save acted_in finished!!!!!!!!!!!!!!!!!')
    
    start_id.clear()
    end_id.clear()
    # 循环查找每个页面(即contents文件夹中下载下来的页面),找出对应关系(directed)
    for i in range(250):
        with open('contents/' + str(i) + '.txt', mode='r', encoding='utf8') as f:
            content = f.read().replace('\n', "")  # 要去掉换行符
        save_directed(content)
    save_relation(start_id, end_id, 'directed')
    print('[+] save directed finished!!!!!!!!!!!!!!!!!')
    
    start_id.clear()
    end_id.clear()
    # 循环查找每个页面(即contents文件夹中下载下来的页面),找出对应关系(belong_to)
    for i in range(250):
        with open('contents/' + str(i) + '.txt', mode='r', encoding='utf8') as f:
            content = f.read().replace('\n', "")  # 要去掉换行符
        save_belongto(content)
    save_relation(start_id, end_id, 'belong_to')
    print('[+] save belong_to finished!!!!!!!!!!!!!!!!!')
    
    start_id.clear()
    end_id.clear()
    # 循环查找每个页面(即contents文件夹中下载下来的页面),找出对应关系(cooperation)
    for i in range(250):
        with open('contents/' + str(i) + '.txt', mode='r', encoding='utf8') as f:
            content = f.read().replace('\n', "")  # 要去掉换行符
        save_cooperation(content)
    save_relation(start_id, end_id, 'cooperation')
    print('[+] save cooperation finished!!!!!!!!!!!!!!!!!')
    
    

    4. 使用neo4j创建知识图谱

    我将neo4j安装在kail(Linux)上,WIndows下类似,使用如下命令导入我们爬取的csv文件,包括结点(使用–nodes)和关系(使用–relationships)

    ./neo4j-admin import --mode=csv --database=movies.db --nodes /usr/local/demo/actor.csv --nodes /usr/local/demo/director.csv --nodes /usr/local/demo/film_name.csv --nodes /usr/local/demo/type.csv --relationships /usr/local/demo/acted_in.csv --relationships /usr/local/demo/directed.csv --relationships /usr/local/demo/belong_to.csv --relationships /usr/local/demo/cooperation.csv
    

    命令说明如下:(需要在neo4j文件夹下的bin目录才能这样执行)
    ./neo4j-admin:是导入的脚本
    import :导入操作
    –mode=csv:导入csv格式文件
    –database=movies.db:导入的数据库(默认graph.db),若写成movies.db需要修改配置文件(在neo4j文件夹下的conf/neo4j.conf
    在这里插入图片描述
    -nodes /usr/local/demo/actor.csv --nodes /usr/local/demo/director.csv:导入结点,后面为结点文件路径
    –relationships /usr/local/demo/belong_to.csv --relationships /usr/local/demo/cooperation.csv:导入关系,后面为关系文件路径


    插入结果图如下:
    在这里插入图片描述
    在这里插入图片描述


    neo4j部分结果图如下:
    在这里插入图片描述

    展开全文
  • 本训练营将以射雕三部曲为例,从 0 构建起一个可以实际应用的知识图谱知识图谱技术是人工智能技术的组成部分,其强大的语义处理和互联组织能力,为智能化信息应用提供了基础。知识图谱旨在描述现实世界中存在的...
  • 基于python+neo4j的豆瓣电影知识图谱,与cypher查询语句相关,主要是爬虫代码及数据,有意向者可下载
  • [python案例]金融知识图谱构建流程

    千次阅读 2020-04-24 08:30:00
    向AI转型的程序员都关注了这个号????????????机器学习AI算法工程 公众号:datayx小型金融知识图谱构流程示范存储方式基于RDF的存储基于图数据库的存储知识图谱构建代码...
  • neo4j-python-pandas-py2neo-v3 利用pandas将excel中数据...Neo4j知识图谱构建 1.运行环境: python3.6.5 windows10 具体包依赖可以参考文件requirements.txt pip install -r requirements.txt 2.Pandas抽取excel...
  • 知识图谱构建技术综述
  • 分类号密级 编号 庫 肀 矸 靛 九 考 硕 士 学位 论 文 中学 课程知识 图谱构 建又 应 用 免 斫 学 申请人姓名 黄 健 位 请 位 生...导 师 文 教 頌 士 学 位论文 硕士学位论文 中 程 识 应 学 课 知 图谱构建及 用研 究
  • 本训练营将以射雕三部曲为例,从 0 构建起一个可以实际应用的知识图谱知识图谱技术是人工智能技术的组成部分,其强大的语义处理和互联组织能力,为智能化信息应用提供了基础。知识图谱旨在描述现实世界中存在的...
  • neo4j+python知识图谱构建(基于豆瓣TOP250电影)

    万次阅读 多人点赞 2018-11-15 11:34:34
    爬取内容网站: ... 第一步:明确节点nodes和关系relations。 针对本文,有4个节点,4个关系。一个节点就相当于一个实体...知识存储-cypher查询语句基础: https://blog.csdn.net/amao1998/article/details/80999423
  • 知识图谱构建

    2019-01-22 15:54:49
    知识图谱构建 1.知识图谱 知识图谱的定义 知识图谱最先由Google提出,是用于增强其搜索引擎功能的知识库。本质上, 知识图谱旨在描述真实世界中存在的各种实体或概念及其关系,其构成一张巨大的语义网络图,节点表示...
  • 中文人物关系知识图谱项目,内容包括中文人物关系图谱构建,基于知识库的数据回标,基于远程监督与bootstrapping方法的人物关系抽取,基于知识图谱的知识问答等应用.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,542
精华内容 2,216
关键字:

知识图谱构建python

python 订阅