文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Wikidata 数据包下载+格式转换+入库MySQL

2023-10-25 11:59

关注

1. Wikidata 简介

维基数据是一个自由的协作式的多语言辅助数据库,用于收集结构化的数据,旨在支援维基百科、维基共享资源以及其他维基媒体运动中的项目,也支援世界上的每一个人。

官网:https://www.wikidata.org/wiki/Wikidata:Main_Page

全量数据包下载:https://www.wikidata.org/wiki/Wikidata:Database_download/zh

2. Wikidata 数据处理 demo

需求:下载 Wikidata JSON 数据包,转为 JSON 格式,MySQL 创建表,将数据导入 MySQL 中

1. 下载 Wikidata 语料库

说明:此处为演示 demo,由于 all 数据包过大,因此此处下载小的语料库进行处理
下载地址为:https://dumps.wikimedia.org/zhwiki/20230501/
在这里插入图片描述

2. 下载数据处理工具 wikiextractor-master

下载地址:https://github.com/attardi/wikiextractor
在这里插入图片描述

3. 将 bz2 数据包转成 JSON

说明:下载的 Wikidata 数据包格式是 bz2 的,使用 wikiextractor-master 将其转储为 JSON 格式

1. 将 wikiextractor-master 解压后,在解压后的文件夹中打开终端窗口

2. 在终端窗口中进入 Python 交互并执行安装

~ python3Python 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) [Clang 6.0 (clang-600.0.57)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> python setup.py install# 等待安装完成

3. 安装完后,执行数据格式转换

WikiExtractor -o [output] --process 2 -b 1024K --json [input]

参数说明:

-o:该参数表示输出的目录–process:表示进程数-b:表示生成的单个文件的大小(默认值为1M)–json:表示生成文件的格式,不使用该参数的话,生成的文件格式是xml

具体执行:

>>> wikiextractor -o ../zhwiki-20230501 --process 2 -b 512K --json ../zhwiki-20230501-pages-articles-multistream-index1.txt-p1p187712.bz2# zhwiki-20230501 是新建的文件夹,用于存放转换后的JSON文件

执行完后即可看到生成的相关文件:
在这里插入图片描述

4. 查看数据
使用 UltraEdit 编辑器打开某几个文件,查看数据为 JSON 格式,每条数据都包含 id、revid、url、title、text 五个字段。
注意:下载的这些文件数据中没有字段嵌套的情况,只是简单的一个文件中有 N 条数据,每条数据都有 5 个字段而已
在这里插入图片描述

4. MySQL 建库表并导入数据

由前面可知数据文件中包含 id、revid、url、title、text 五个字段,每个字段都是 string 类型

考虑到直接使用文件中的 id 作为主键的话会有重复的,为了方便后续操作,可以引入 uuid 作为主键

经对比,使用 uuid3 作为主键字段,其语法:uuid3(namespace, name)

1. 进入 MySQL 建库表

create database wiki charset=utf8;create table wiki.demo (  `uuid` varchar(36) NOT NULL comment '主键',  `id` varchar(16) NOT NULL comment 'ID',  `revid` varchar(32) NOT NULL comment 'revid',  `url` varchar(255) DEFAULT NULL comment '地址',  `title` varchar(32) DEFAULT NULL comment '主题',  `text` MEDIUMTEXT DEFAULT NULL comment '描述',  PRIMARY KEY (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 编写 Python 代码文件导入数据

import jsonimport pymysqlimport osimport uuidimport randomerr = []  # 记录导入失败条目# 创建MySQL库连接和游标conn = pymysql.connect(host='hadoop0', user='root', password='111111', port=3306, db='wiki')cursor = conn.cursor()''' 单个 json 文件导入 ''''''with open("wiki_00.json", 'r', encoding='utf-8') as f:    for line in f.readlines():        data = json.loads(line)        # 编写SQL执行即可'''base_file = '/Users/jason93/Desktop/Coder/BigData/Wikidata/zhwiki-20230501'for root, dirs, files in os.walk(base_file):    for file in files:        path = os.path.join(root, file)        # 打印path发现有 AA/.DS_Store 文件,因此做判断进行过滤        if '.' not in path:            with open(path, 'r', encoding='utf-8') as f:                for line in f.readlines():                    data = json.loads(line)                    uid = uuid.uuid3(uuid.NAMESPACE_DNS, str(random.random()))                    try:                        sql = "insert into demo (uuid, id, revid, url, title, text) values (%s, %s, %s, %s, %s, %s)"                        cursor.execute(sql, (uid, data['id'], data['revid'], data['url'], data['title'], data['text']))                    except Exception as e:                        # print(e)                        err.append(data)print(err[0])  # 失败条目 263,一共 69025 条数据# 提交事务conn.commit()# 关闭游标和库连接cursor.close()conn.close()

3. 执行查询

代码中执行:

qry_sql = "select id, revid, url, title from demo"cursor.execute(qry_sql)# print(cursor.fetchone())  # 获取一条# print(cursor.fetchall())  # 获取全部print(cursor.fetchmany(5))  # 获取指定条数的(('79345', '2819163', 'https://zh.wikipedia.org/wiki?curid=79345', '北京胡同列表'), ('100258', '2156442', 'https://zh.wikipedia.org/wiki?curid=100258', '北京天橋'), ('2292', '3253671', 'https://zh.wikipedia.org/wiki?curid=2292', '冬季奥林匹克运动会'), ('39314', '899028', 'https://zh.wikipedia.org/wiki?curid=39314', '限制海军军备条约'), ('5741', '3279586', 'https://zh.wikipedia.org/wiki?curid=5741', '外层空间'))

MySQL 中查询:

mysql> select count(*) from demo;+----------+| count(*) |+----------+|    68762 |+----------+1 row in set (0.15 sec)mysql> select * from demo limit 2\G*************************** 1. row *************************** uuid: 00002da5-3868-39b8-80b1-4d8fd8ce34fe   id: 79345revid: 2819163  url: https://zh.wikipedia.org/wiki?curid=79345title: 北京胡同列表 text: 北京胡同有数千条,有「有名兒的胡同三千六,沒名兒的胡同賽牛毛」的说法,以下是按地区的列表:护国寺.护国寺东巷护国寺大院*************************** 2. row *************************** uuid: 00003b92-511b-39f5-b1ba-0b29df4c7370   id: 100258revid: 2156442  url: https://zh.wikipedia.org/wiki?curid=100258title: 北京天橋 text: 2 rows in set (0.00 sec)

Tip:uuid

UUID是128位的全局唯一标识符,通常由32字节的字符串表示。它可以保证时间和空间的唯一性,也称为GUID,全称为:
UUID —— Universally Unique IDentifier Python 中叫 UUID
GUID —— Globally Unique IDentifier C# 中叫 GUID

它通过 MAC 地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性。
UUID主要有五个算法,也就是五种方法来实现:
1、uuid1()——基于时间戳

uuid2()——基于分布式计算环境DCE(Python中没有这个函数)

uuid3()——基于名字的MD5散列值

uuid4()——基于随机数

uuid5()——基于名字的SHA-1散列值

综合对比:

2. Wikidata 抽取实体执行查询

待补充

来源地址:https://blog.csdn.net/weixin_45579026/article/details/130498644

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯