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

news2024/9/29 7:21:01

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.6G 的那个下载了好几次下载不下来(网不行。。),所以下载了下边那个小包(215MB),它下边 index 那个是 215MB 包数据的索引,暂时用不到

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

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

3. 将 bz2 数据包转成 JSON

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

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

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

~ python3
Python 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "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文件

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

  • 说明:其他博客上说 Windows 系统执行可能会报一些错误,解决方法是使用 Ubuntu,或者使用 centOS 等 Linux 操作系统操作,我的是 Mac,一次成功了,所以此处无报错

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 json
import pymysql
import os
import uuid
import random

err = []  # 记录导入失败条目

# 创建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: 79345
revid: 2819163
  url: https://zh.wikipedia.org/wiki?curid=79345
title: 北京胡同列表
 text: 北京胡同有数千条,有「有名兒的胡同三千六,沒名兒的胡同賽牛毛」的说法,以下是按地区的列表:
护国寺.
护国寺东巷
护国寺大院
*************************** 2. row ***************************
 uuid: 00003b92-511b-39f5-b1ba-0b29df4c7370
   id: 100258
revid: 2156442
  url: https://zh.wikipedia.org/wiki?curid=100258
title: 北京天橋
 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()——基于时间戳

  • 由MAC地址、当前时间戳、随机数生成。可以保证全球范围内的唯一性,但MAC的使用同时带来安全性问题,局域网中可以使用IP来代替MAC

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

  • 算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。
    实际中很少用到该方法。

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

  • 通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性,
    和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid。

4、uuid4()——基于随机数

  • 由伪随机数得到,有一定的重复概率,该概率可以计算出来。

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

  • 算法与uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法

综合对比:

  • Python 中没有基于 DCE 的,所以 uuid2 可以忽略
  • uuid4 存在概率性重复,由无映射性,最好不用
  • 若在 Global 的分布式计算环境下,最好用 uuid1
  • 最后,若有名字的唯一性要求,最好用 uuid3 或 uuid5

2. Wikidata 抽取实体执行查询

待补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/503388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在“裸奔”时代保护我们的隐私:网络攻击、数据泄露与隐私侵犯的应对策略与工具

摘要:随着信息技术的普及和发展,个人隐私和数据安全问题日益受到威胁。本文将讨论如何有效应对网络攻击、数据泄露和隐私侵犯,并提供一系列实用的技巧和工具,以帮助我们在“裸奔”时代更好地保护数据安全和隐私。 当今社会&#…

Http知识

一、http协议 目前存在HTTP1.1(当前广泛运用的版本)、HTTP2.0和HTTP3.0协议,有以下的优点和缺点 1. HTTP1.1 优点:默认支持长连接,即在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的…

浅浅地优化下视频流播放体验

作者:唐子玄 这一篇将从如何播放视频开始,接着介绍如何封装播放器,再将视频播放和列表结合形成视频流,然后一步步地优化视频流的播放体验。 播放视频 ExoPlayer 基本使用 这次我选择的是ExoPlayer,添加依赖如下&…

13个UI设计软件,一次满足你的UI设计需求

UI设计师的角色是当今互联网时代非常重要的一部分。许多计算机和移动软件都需要UI设计师的参与,这个过程复杂而乏味。这里将与您分享13个UI设计软件,希望帮助您正确选择UI设计软件,节省工作量,创建更多优秀的UI设计作品。 1.即时…

4.共享模型之管程

4.共享模型之管程 4.1 共享带来的问题 Java的体现 import lombok.extern.slf4j.Slf4j;/*** author xc* date 2023/5/6 13:00*/ Slf4j public class Test14 {static int i 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()…

Android Framework开发前景分析~

Android Framework是Android操作系统中的重要组成部分,它提供了一系列的API(应用程序接口)和服务,方便开发人员创建Android应用程序。随着Android设备的普及和移动互联网市场的快速发展,Android Framework开发有着广泛…

Linux下进程守护Supervisor搭建

简介:Supervisor是在linux上的进程管理员,是一个管理工具。当进程停止的时候Supervisor能够自动启动它,可以运行在各种类unix的机器上,supervisor是使用python开发的一套通用的进程管理工具,能够把普通脚本、命令行进程…

一起Talk Android吧(第五百四十三回:如何实现流水动画)

文章目录 概念介绍实现方法平移动画逐帧动画 经验总结 各位看官们大家好,上一回中咱们说的例子是"无进度值ProgressBar",本章回中介绍的例子是" 如何实现流水动画"。闲话休提,言归正转,让我们一起Talk Android吧&#x…

Linux命令·ss

ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。 当服务器的socket连接数量变得非常…

triton 疑难手册

config.pbtxt 配置参数手册 backend或platform参数用于指示nvidia triton用对应的backend加载模型参数,它的使用示例如下: name: "xxx" platform: "pytorch_libtorch"max_batch_size: 8 input [ {name: "input0"data_ty…

算法加密与解密、字符编码与字符集

加密算法 加密保证数据不会被窃取或者修改 可逆和不可逆加密 区分在于加密后的结果是否可以还原 可逆加密:安全传输数据时使用(如jwt中的数据) AES:流加密 DES:块加密 RSA HS256 不可逆加密:同一个文件或内容每次加密的结果一…

GL绘制自定义线条2_手写曲线应用贝塞尔曲线

上一篇文章的曲线是由触摸点直接生成的,但触摸点并非连续的,而是离散的,而且屏幕触摸点采样的间隔时间其实不短,因此如果单纯只用触摸点生成OpenGL触摸曲线,在高速书写时会导致曲线看起来就像多个线段合起来一样&#…

为何ChatGPT一出现让巨头们都坐不住?

近几个月来,ChatGPT都是当仁不让的舆论话题。 上一次AI在全球范围内引起轰动,还是谷歌的AI机器人AlphaGO下棋战胜围棋世界冠军的时候。 ChatGPT的出现,让国内外几乎所有的科技巨头都坐立不安。 2月1日,谷歌母公司Alphabet首席执…

C++跨平台“点绘机” 代码解读

前言 球球大作战可以自定义皮肤,用画刷绘制。 想着用软件来绘制。 初次尝试,没有达成最终目的,不过也有很大收获。 仓库链接:https://github.com/sixsixQAQ/dolphin 问题 这个半成品,已经有了基本结构了&#xff…

高德地图api 地理编码(地址-->坐标)geocoder.getLocation在官方可以测试出结果,下载代码到本地却用不了 问题解决

问题 高德地图api 地理编码(地址-->坐标)功能,通过输入 地址信息 得到 经纬度信息。geocoder.getLocation在官方可以测试出结果,下载代码到本地却用不了。 官方示例测试,可以从地址得到坐标 下载官方代码本地运行却…

常见注意力机制解析

1.Squeeze-and-Excitation(SE) SE的主要思想是通过对输入特征进行压缩和激励,来提高模型的表现能力。具体来说,SE注意力机制包括两个步骤:Squeeze和Excitation。在Squeeze步骤中,通过全局平均池化操作将输…

【2023年Mathorcup杯数学建模竞赛C题】电商物流网络包裹应急调运与结构优化--完整作品分享

1.问题背景 2.论文摘要 为了应对电商物流网络中物流场地和线路电商物流网络中物流场地和线路上货量波动的情况, 设计合理的物流网络调整方案以保障物流网络的正常运行。本文运用 0-1 整数规划模型,多目标动 态规划模型,给出了问题的结果。 针…

深入讲解eMMC简介

1 eMMC是什么 eMMC是embedded MultiMediaCard的简称,即嵌入式多媒体卡,是一种闪存卡的标准,它定义了基于嵌入式多媒体卡的存储系统的物理架构和访问接口及协议,具体由电子设备工程联合委员会JEDEC订立和发布。它是对MMC的一个拓展&#xff0…

redi缓存使用

1、缓存的特征 第一个特征:在一个层次化的系统中,缓存一定是一个快速子系统,数据存在缓存中时,能避免每次从慢速子系统中存取数据。 第二个特征:缓存系统的容量大小总是小于后端慢速系统的,不可能把所有数…

GAMES101 计算机图形学 | 学习笔记 (上)

目录 环境安装什么是计算机图形学物体上点的坐标变换顺序齐次坐标光栅化如何判定一个点在三角形内光栅化填充三角形示例代码光栅化产生的问题 采样不足(欠采样)导致锯齿抗锯齿滤波算法 环境安装 1. C中安装opencv库 2. C中安装eigen库 3. C中安装open…