Wikidata实操

news2025/1/15 17:21:59

1. Wikidata 简介

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/491531.html

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

相关文章

操作系统考试复习—第三章 优先级倒置 死锁问题

当前OS广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象 具体解释为:在原本的调度算法设计中,高优先级进程可以抢占低优先级的CPU资源,先执行高优先级任务。但是存…

【STM32】在使用STM32Cube.IDE时更改时钟频率后代码跳进异常中断

目录 1、前言2、问题与复现办法3、解决的问题的过程 1、前言 这是在项目中无意发现的问题,其实有同样更复杂的工程可以运行,但是后来发现新建一个简单工程反而运行不了了,但是同样更复杂的工程可以运行说明本来同事原来已经不知道在哪里找到…

Vmware安装Kali

需要准备两个东西,kali镜像和VMware软件 下载kali iso 下载界面有三个可选择的 install是安装版,安装使用; Live版可以直接启动运行; netinstaller是网络安装,需要从网络上下载,文件本身只有引导作用&…

Idea Jrebel 报错:Cannot reactivate, offline seat in use ...

Idea Jrebel 报错:Cannot reactivate, offline seat in use ... 一、问题描述 在使用idea Jrebel续期的时候,修改idea激活服务器地址时,遇到报错:Cannot reactivate, offline seat in use. Click Work online in JRebel configura…

基于aspnet个人博客网站dzkf6606程序

系统使用Visual studio.net2010作为系统开发环境,并采用ASP.NET技术,使用C#语言,以SQL Server为后台数据库。 1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和…

探索卡尔曼滤波在位姿估计中的魅力:无人机与自动驾驶的关键技术揭秘

摘要:在本博客中,我们将探讨卡尔曼滤波在位姿估计领域的应用,特别是在无人机和自动驾驶场景中的重要性。我们将详细介绍卡尔曼滤波的原理、优势及其在无人机、自动驾驶等实际案例中的应用。此外,我们还将关注卡尔曼滤波在其他领域…

【服务器数据恢复】同友存储上的虚拟机数据恢复案例

服务器数据恢复环境: 同友存储,底层由数块物理硬盘组建的raid5磁盘阵列,存储池划分若干lun,每个lun下有数台虚拟机。 服务器故障: 未知原因导致存储崩溃,无法启动,虚拟机全部丢失,其…

linux中基础开发工具的使用

1.linux中的软件包管理器 1.1什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很…

软件管理员密码的作用 如何设置软件管理员密码?

在使用夏冰加密软件的过程中,很多软件都是可以设置软件管理员密码的。那么你知道管理员密码有什么用吗?又该如何设置软件管理员密码呢?下面我们来了解一下吧。 软件管理员密码是什么意思? 软件管理员密码就是软件的密码&#xff…

毕业5年,技术越来越好,混的却越来越差...

别人都是越来越好,而我是越来越差! 17年,从一个普通的本科毕业,那个时候的我,很迷茫,简历上的求职岗位都不知道写什么,因为家里是农村的,朴实的父母也帮不上什么忙,关于…

KDBR-IV变压器空负载短路损耗测试仪

一、产品概述 本产品是我公司针对不良电力用户偷逃基本电费、私自增容问题而研发设计的仪器,用于变压器容量、空载、负载等特性参数测量的高精密仪器。本仪器为多功能测量仪器,相当于往常两种测试仪器:即变压器容量测试仪变压器特性参数测试仪…

【因子挖掘】遗传规划概述

在多因子选股的框架下,因子的产生通常有两条途径: 先有逻辑,后有公式:根据经济学逻辑、历史经验、直觉进行人工构造一些因子; 例如:动量(Momentum)因子:当最近的股价呈现…

Cadence Allegro 布局操作Move命令的应用

在布局的时候,常常需要对一些元素去进行移动位置以方便进行设计。 1、执行菜单命令Edit-Move,此时PCB界面的左下角会显示Move,就表示正在执行移动命令,如图1所示。 图1 移动命令 2、在PCB界面右边的Find面板中所选择需要进行移动…

Charles抓包工具使用

一、Charles的安装与激活 安装 官方地址:https://www.charlesproxy.com/ 根据自己系统安装最新版本即可 安装后可直接打开使用 激活 打开Charles -> 【Help】 -> 【Register Charles】 -> 输入 Registered Name : https://zhile.io Lic…

智能座舱的“宏大蓝图”和“残酷现实”

配图来自Canva可画 2023年上海车展各大车企发布新车、新配置和新战略好不热闹,“智能驾驶”、“智能座舱”等关键词频频出现,智能化已然成为车企技术比拼的关键。 Unity中国发布最新智能座舱解决方案,可为车企提供成熟、可量产落地的HMI&…

学系统集成项目管理工程师(中项)系列17b_范围管理(下)

1. 创建工作分解结构WBS 1.1. 自上而下的分解结构 1.2. 把项目可交付成果和项目工作分解成较小的、更易于管理的组件的过程 1.3. 用来确定项目范围的 1.3.1. 包括分包出去的工作 1.3.1.1. 【21上选40】 1.4. 输入 1.4.1. 项目范围管理计划 1.4.2. 项目范围说明书 1.4.…

AI教父变成“吹哨人” 他到底在警觉什么?

“我现在对自己过去的工作感到后悔,我找借口来安慰自己:就算我没做,别人也会做的。”有AI“教父”之称的杰弗里辛顿 (Geoffrey Hinton)在接受媒体采访时透露出悔意。 作为AI深度学习领域的代表性人物,辛顿一生都在该领域深耕&…

随笔-听说你年入百万了

两个月前接到老代的电话,说4月30号结婚,预约一下时间。半个月前接到小付的电话,说5月1号结婚,行吧,值当回趟老家了。 抢票还算顺利,转了一趟车,29号下午到了老家,想着收拾一下&…

集成ES全文检索、Neo4J知识图谱、Activiti工作流的知识库管理系统

一、项目介绍 一款全源码,可二开,可基于云部署、私有部署的企业级知识库云平台,一款让企业知识变为实打实的数字财富的系统,应用在需要进行文档整理、分类、归集、检索、分析的场景。 获取方式q:262086839 为什么建立知识库平台&…

Cell-- 战胜癌症中的耐药性,组合疗法初见成效!

Jerry C. Madukwe在Cell发表了一篇关于癌症耐药性的精选。 癌细胞经历系统化疗、靶向治疗或免疫治疗时对相关药物会逐步产生耐受性。抗癌药物耐药是一种多因素的现象,可通过多种机制产生。原发性肿瘤内的不同遗传组成的癌细胞亚群,对化疗或靶向药物有不同…