首先感谢 :

1.https://blog.csdn.net/qq_39023569/article/details/88556301

2.https://www.cnblogs.com/CherishFX/p/5280259.html

3.https://www.cs.bgu.ac.il/~elhadad/nlp12/jwpl/wikification.html

4.https://blog.csdn.net/Icy233333/article/details/80383336

一。中文维基数据准备。

  https://dumps.wikimedia.org/zhwiki/latest/

  选择:

  LANGCODE]wiki-[DATE]-pages-articles.xml.bz2
  [LANGCODE]wiki-[DATE]-pagelinks.sql.gz
  [LANGCODE]wiki-[DATE]-categorylinks.sql.gz

  注:维基服务器限流,并且时不时会中断。可以直接使用linux 的 wget -c   https://xxxxxxxxxxxxxxxxxxxx 方式实现可断点续接的下载。

  下载完后放在一个文件夹下。 我放在 F:\zhwiki2019\~  下。

二。下载JWPL DataMachine jar包解析数据文件

    直接去maven库中下载整个jar-with-dependencies.jar。下载地址:http://search.maven.org/#search|ga|1|tudarmstadt.ukp

  搜索de.tudarmstadt.ukp.wikipedia.datamachine对应的jar-with-dependencies.jar 文件下载。

  下载后和数据放在同一目录下。

三。打开cmd,cd到zhwiki2019目录下,输入以下命令解析。

  java -cp jar-with-dependencies.jar de.tudarmstadt.ukp.wikipedia.datamachine.domain.JWPLDataMachine [LANGUAGE] [MAIN_CATEGORY_NAME] [DISAMBIGUATION_CATEGORY_NAME] [SOURCE_DIRECTORY]

  其中,

    LANGUAGE: 指jwpl支持的语言,选择一个你下载的wikipedia语言,比如english, chinese
    MAIN_CATEGORY_NAME: 填写一个Wikipedia类别层次上属于顶层的类别,比如:Contents
    DISAMBIGUATION_CATEGORY_NAME: 填写一个有消歧类别的类别名,比如:Disambiguation_pages
    SOURCE_DIRECTORY: 上面三个wikipedia文件的目录,比如: ~/En2019
  我的命令:

  java -Dfile.encoding=utf8  -cp de.tudarmstadt.ukp.wikipedia.datamachine-0.9.1-jar-with-dependencies.jar de.tudarmstadt.ukp.wikipedia.datamachine.domain.JWPLDataMachine chinese Contents Disambiguation_pages ~/zhwiki2019

  如果你的系统默认编码不是utf-8(比如windows), 可能需要再加一个参数:-Dfile.encoding=utf8;

  解析的时间看数据量的大小和你的cpu。之后会在output下生成11个txt.这11个txt就是之后要导入mysql的11个表。

  这些文件的解释:

 category --> 类别信息
pageId:类别ID,唯一
name:类别名 category_inlinks --> 指向类别的链接信息
id:类别ID,不唯一
inLinks:该类别父类ID,也就是指向该类别的类别ID category_outlinks --> 类别指向的链接信息
id:类别ID,不唯一
outLinks:该类别子类ID,也就是该类别指向的那些类别的ID category_pages --> 页面与类别的关系表
id:类别ID,不唯一
pages:属于该类别ID的页面ID metadata --> 该wikipedia的一些元信息,只有一条记录
language:语言
disambiguationCategory:运行DataMachine填写的消歧类别
mainCategory:运行DataMachine填写的顶层类别
nrofPages:页面个数
nrofRedirects:重定向个数
nrofDisambiguationPages:消歧页面个数
nrofCategories:类别个数
version page --> 页面信息
pageId:页面ID
name:名字
text:全文,包含wikimeida的标记信息
isDisambiguation:是否是消岐页面 page_categories --> 页面与类别的关系表与category_pages信息重复 page_inlinks --> 指向页面的页面信息
id:页面ID,不唯一
inLinks:指向该页面ID的页面ID page_outlinks
id:页面ID,不唯一
outlinks:该页面ID指向的页面ID page_redirects
id:页面ID,不唯一
redirects:重定向到该页面ID的所有页面ID pagemapline --> 所有页面的title信息,处理重定向等有用处
id:该页面ID
name:页面title名字
pageID:页面ID,如果该页面是重定向页面,该pageID是其指向的那个包含信息的页面ID
stem:***暂无信息
lemma:***暂无信息

  

四。mysql 创建 库。(必须要mysql5.x版本。。我就是8.0.12失败找了原因重新下载了5.7.27版本的(错误:java.sql.SQLException: java.lang.ClassCastException: class java.math.BigInteger cannot be cast to ....)。jwpl通过C3P0来获得datasource.是获取datasource的阶段失败。)

  1.  创建数据库命令(数据库名DB_NAME可以自行设定):注意要保证创建的数据库的编码是utf-8

CREATE DATABASE [DB_NAME] DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

    我的DB_NAME是zhwiki.

  2.创建所有的表,下载包含所有表结构的sql脚本:jwpl_tables.sql脚本,在mysql命令下执行改脚本:

mysql> use [DB_NAME];
mysql> source jwpl_tables.sql; #注意jwpl_tables.sql所在的路径(可以cd 到jwpl_tables.sql的目录下直接输入这个命令。)

  3.因为我们的数据上传到数据库是存在mysql data目录下的,可以通过命令

    mysql>show global variables like "%datadir%"
    来查看你的数据库文件存放目录,我这里是在C盘,空间不够,所以需要修改data路径,将数据库data移到其他空间足够的盘,具体可以参考https://blog.csdn.net/wangyan_z/article/details/81089211

  ,来修改你的data路径,这里不过多说明。
  4,导入数据到mysql中

  一个表一个表的导入,进入之前创建的用户的数据库

  load data infile 'F:/zhwiki2019/output/Category.txt' into table category;

 load data infile 'F:/zhwiki2019/output/Category.txt' into table category;

 load data infile 'F:/zhwiki2019/output/category_inlinks.txt' into table category_inlinks;

 load data infile 'F:/zhwiki2019/output/category_outlinks.txt' into table category_outlinks;

 load data infile 'F:/zhwiki2019/output/category_pages.txt' into table category_pages;

 load data infile 'F:/zhwiki2019/output/MetaData.txt' into table MetaData;

 load data infile 'F:/zhwiki2019/output/Page.txt' into table Page;

 load data infile 'F:/zhwiki2019/output/page_categories.txt' into table page_categories;

 load data infile 'F:/zhwiki2019/output/page_inlinks.txt' into table page_inlinks;

 load data infile 'F:/zhwiki2019/output/page_outlinks.txt' into table page_outlinks;

 load data infile 'F:/zhwiki2019/output/page_redirects.txt' into table page_redirects;

 load data infile 'F:/zhwiki2019/output/PageMapLine.txt' into table PageMapLine;

  这里可能遇到mysql secure_file_priv问题。参考 https://blog.csdn.net/qq_35246620/article/details/78148505

  解决完后,因为我处理的是中文维基的数据。mysql会报错utf8转义的问题。我查了我的系统编码和mysql的编码(参考https://bbs.csdn.net/topics/392478961),没有问题,只可能是数据的问题。打开后发现存在这样的数据:  B\'z  ,因为B‘z是一个组合。所以去掉 \  就没问题了。自己可以写个小程序去掉。(或者去修改数据库的编码,通过navicat去编辑zhwiki的属性,然后选择utfmmd64)

五。使用JWPL jar包去访问维基百科数据

  1.直接去maven库中下载整个jar-with-dependencies.jar。下载地址:http://search.maven.org/#search|ga|1|tudarmstadt.ukp
搜索de.tudarmstadt.ukp.wikipedia.api对应的 jar-with-dependencies.jar 文件,下载。

  2.之后就是编码了。( jwpl论文:https://www.researchgate.net/publication/220745815_Extracting_Lexical_Semantic_Knowledge_from_Wikipedia_and_Wiktionary?ev=auth_pub

  论文中,说了工具主要以三个对象展开。直接给出代码。就可以看懂。

page对象:

 import de.tudarmstadt.ukp.wikipedia.api.Category;
import de.tudarmstadt.ukp.wikipedia.api.DatabaseConfiguration;
import de.tudarmstadt.ukp.wikipedia.api.Page;
import de.tudarmstadt.ukp.wikipedia.api.Title;
import de.tudarmstadt.ukp.wikipedia.api.WikiConstants.Language;
import de.tudarmstadt.ukp.wikipedia.api.Wikipedia; import static de.tudarmstadt.ukp.wikipedia.api.WikiConstants.LF; public class ShowPageInfo { public static void main(String[] args) throws Exception {
// 数据库连接参数配置
DatabaseConfiguration dbConfig = new DatabaseConfiguration();
dbConfig.setHost("localhost"); //主机名
dbConfig.setDatabase("wikidb"); //数据库名
dbConfig.setUser("root"); //访问数据库的用户名
dbConfig.setPassword("root"); //访问数据库的密码
dbConfig.setLanguage(Language.english);
// 创建Wikipedia处理对象
Wikipedia wiki = new Wikipedia(dbConfig);
String title = "Fruit";
Page page = wiki.getPage(title);
// wikipedia页面的title
System.out.println("Queried string : " + title);
System.out.println("Title : " + page.getTitle());
// 是否是消歧页面
System.out.println("IsDisambiguationPage : " + page.isDisambiguation());
// 是否是重定向页面
System.out.println("redirect page query : " + page.isRedirect());
// 有多少个页面指向该页面
System.out.println("# of ingoing links : " + page.getNumberOfInlinks());
// 该页面指向了多少个页面
System.out.println("# of outgoing links : " + page.getNumberOfOutlinks());
// 该页面属于多少个类别
System.out.println("# of categories : " + page.getNumberOfCategories());
StringBuilder sb = new StringBuilder();
// 页面的所有重定向页面
sb.append("Redirects" + LF);
for (String redirect : page.getRedirects()) {
sb.append(" " + new Title(redirect).getPlainTitle() + LF);
}
sb.append(LF);
// 页面的所述的所有类别
sb.append("Categories" + LF);
for (Category category : page.getCategories()) {
sb.append(" " + category.getTitle() + LF);
}
sb.append(LF);
// 指向该页面的所有页面
sb.append("In-Links" + LF);
for (Page inLinkPage : page.getInlinks()) {
sb.append(" " + inLinkPage.getTitle() + LF);
}
sb.append(LF);
// 该页面指向的所有页面
sb.append("Out-Links" + LF);
for (Page outLinkPage : page.getOutlinks()) {
sb.append(" " + outLinkPage.getTitle() + LF);
}
System.out.println(sb);
}
}

运行的部分结果:

 Queried string       : Fruit
Title : Fruit
IsDisambiguationPage : false
redirect page query : false
# of ingoing links : 4454
# of outgoing links : 811
# of categories : 10

category对象:

 import de.tudarmstadt.ukp.wikipedia.api.Category;
import de.tudarmstadt.ukp.wikipedia.api.DatabaseConfiguration;
import de.tudarmstadt.ukp.wikipedia.api.Page;
import de.tudarmstadt.ukp.wikipedia.api.WikiConstants.Language;
import de.tudarmstadt.ukp.wikipedia.api.Wikipedia;
import static de.tudarmstadt.ukp.wikipedia.api.WikiConstants.LF; public class ShowCategoryInfo {
public static void main(String[] args) throws Exception {
//连接数据库的配置
DatabaseConfiguration dbConfig = new DatabaseConfiguration();
dbConfig.setHost("localhost");
dbConfig.setDatabase("wikidb");
dbConfig.setUser("root");
dbConfig.setPassword("root");
dbConfig.setLanguage(Language.english);
// 创建Wikipedia处理对象
Wikipedia wiki = new Wikipedia(dbConfig);
String title = "Towns in Germany";
// 创建类对象
Category cat = wiki.getCategory(title);
StringBuilder sb = new StringBuilder();
// 类别名
sb.append("Title : " + cat.getTitle() + LF);
sb.append(LF);
// 类别的父类信息
sb.append("# super categories : " + cat.getParents().size() + LF);
for (Category parent : cat.getParents()) {
sb.append(" " + parent.getTitle() + LF);
}
sb.append(LF);
// 类别的子类信息
sb.append("# sub categories : " + cat.getChildren().size() + LF);
for (Category child : cat.getChildren()) {
sb.append(" " + child.getTitle() + LF);
}
sb.append(LF);
// 类别下的所有页面
sb.append("# pages : " + cat.getArticles().size() + LF);
for (Page page : cat.getArticles()) {
sb.append(" " + page.getTitle() + LF);
}
System.out.println(sb);
}
}
运行结果:
 Title : Towns in Germany

 # super categories : 4
Towns by country
Commons category with local link same as on Wikidata
Populated places in Germany
Municipalities of Germany # sub categories : 16
Towns in Rhineland-Palatinate
Towns in Lower Saxony
Towns in Saxony
Towns in Mecklenburg-Vorpommern
Towns in Saxony-Anhalt
University towns in Germany
Towns in Schleswig-Holstein
Seaside resorts in Germany
Towns in Baden-Württemberg
Towns in Thuringia
Towns in Hesse
Towns in Saarland
Towns in North Rhine-Westphalia
Towns in Brandenburg
Spa towns in Germany
Towns in Bavaria # pages : 2
Oberreichenbach
Urfeld am Walchensee

其中,

Wikipedia 对象就是另一个主要的对象。page和categorty都要对这个对象进行访问,可以通过“单例模式”进行wikipedia的实例化。来节约资源,避免重复造轮子。

代码给出:

 public class WikipediaUtil {
private static Wikipedia wiki = null; public static Wikipedia getWikipedia() {
if (wiki == null) {
synchronized (wiki) {
if (wiki == null) {
try {
DatabaseConfiguration dbconfig = new DatabaseConfiguration();
URL resource = WikipediaUtil.class.getClassLoader().getResource("zhwiki.properties");
String file = resource.getFile();
InputStream fileInputStream = new FileInputStream(file);
Properties properties = new Properties();
properties.load(fileInputStream);
dbconfig.setHost(properties.getProperty("host"));
dbconfig.setDatabase(properties.getProperty("db"));
dbconfig.setUser(properties.getProperty("user"));
dbconfig.setPassword(properties.getProperty("password"));
dbconfig.setLanguage(WikiConstants.Language.chinese);
wiki = new Wikipedia(dbconfig);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return wiki;
}
}

剩下的探索吧...欢迎评论一起进步。

中文维基百科分类提取(jwpl)--构建知识图谱数据获取的更多相关文章

  1. Windows下基于python3使用word2vec训练中文维基百科语料(二)

    在上一篇对中文维基百科语料处理将其转换成.txt的文本文档的基础上,我们要将为文本转换成向量,首先都要对文本进行预处理 步骤四:由于得到的中文维基百科中有许多繁体字,所以我们现在就是将繁体字转换成简体 ...

  2. 使用word2vec对中文维基百科数据进行处理

    一.下载中文维基百科数据https://dumps.wikimedia.org/zhwiki/并使用gensim中的wikicorpus解析提取xml中的内容 二.利用opencc繁体转简体 三.利用 ...

  3. Windows下基于python3使用word2vec训练中文维基百科语料(一)

    在进行自然语言处理之前,首先需要一个语料,这里选择维基百科中文语料,由于维基百科是 .xml.bz2文件,所以要将其转换成.txt文件,下面就是相关步骤: 步骤一:下载维基百科中文语料 https:/ ...

  4. springboot2.0+Neo4j+d3.js构建知识图谱

    Welcome to the Neo4j wiki! 初衷这是一个知识图谱构建工具,最开始是对产品和领导为了做ppt临时要求配合做图谱展示的不厌其烦,做着做着就抽出一个目前看着还算通用的小工具 技术栈 ...

  5. Redis闲谈(1):构建知识图谱

    场景:Redis面试 (图片来源于网络) 面试官: 我看到你的简历上说你熟练使用Redis,那么你讲一下Redis是干嘛用的? 小明: (心中窃喜,Redis不就是缓存吗?)Redis主要用作缓存,通 ...

  6. Windows下基于python3使用word2vec训练中文维基百科语料(三)

    对前两篇获取到的词向量模型进行使用: 代码如下: import gensim model = gensim.models.Word2Vec.load('wiki.zh.text.model') fla ...

  7. JWPL工具处理维基百科wikipedia数据用于NLP

    JWPL处理维基百科数据用于NLP 处理zhwiki JWPL是一个Wikipedia处理工具,主要功能是将Wikipedia dump的文件经过处理.优化导入mysql数据库,用于NLP过程.以下以 ...

  8. wikipedia 维基百科 语料 获取 与 提取 处理 by python3.5

    英文维基百科 https://dumps.wikimedia.org/enwiki/ 中文维基百科 https://dumps.wikimedia.org/zhwiki/ 全部语言的列表 https: ...

  9. 使用JWPL (Java Wikipedia Library)操作维基百科数据

    使用JWPL (Java Wikipedia Library)操作维基百科数据 1. JWPL介绍 JWPL(Java Wikipedia Library)是一个开源的访问wikipeida数据的Ja ...

随机推荐

  1. Asp.Net Core 学习教程1、初始.Net Core与VS Code 第一个web程序

    1..Net Core介绍 .NET Core是.NET Framework的新一代版本, 是微软开发的第一个具有跨平台(Windows.Macosx.Linux) 能力的应用程序开发框架,未来也将会 ...

  2. 优化webpack构建时间的小技巧

    在之前工作的地方,我们一直使用webpck去构建.但是,经过长达四年的更新迭代,每个人都在同一个项目中做了不同的操作和更新,这导致我们生产构建时间达到了惊人的一分半,watch模式的rebuild也达 ...

  3. Task 线程重用导致等待!

    测试代码: ; i < ; i++) { var d = DateTime.Now; Task.Run(() => { Console.WriteLine($"{Thread.C ...

  4. python 学习爬虫教程~

    思路:: (本文没有用xpath定位,xpath需要导入第三方库   from lxml import etree) 1.首先通过urllib类获取到网页的所有内容 2.通过partition获取其中 ...

  5. python scoket

    一.简介 scoket(套结字)在python就是模块 二.分类 基于文件型(不用) 基于网络型 名字:AF_INET AF_INET6 三.scoket应用 1.基于tcp 长连接:基于tcp的Se ...

  6. 源码详解系列(七) ------ 全面讲解logback的使用和源码

    什么是logback logback 用于日志记录,可以将日志输出到控制台.文件.数据库和邮件等,相比其它所有的日志系统,logback 更快并且更小,包含了许多独特并且有用的特性. logback ...

  7. GC原理---垃圾收集器

    垃圾收集器 如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现 Serial收集器 串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收.新生代.老 ...

  8. Spring JSTL 获取后端数据失败。

    显示的jsp页面仍是${XXX}的形式. 解决方法一: 这是因为我们在web.xml中使用的是jsp1.2版本的DTD,在此版本JSTL默认不打开,我们需要手动打开,打开方法: 在相应的JSP头部加入 ...

  9. springboot mybatis 多数据源配置支持切换以及一些坑

    一 添加每个数据源的config配置,单个直接默认,多个需要显示写出来 @Configuration @MapperScan(basePackages ="com.zhuzher.*.map ...

  10. Paper慢慢读 - AB实验人群定向 Double Machine Learning

    Hetergeneous Treatment Effect旨在量化实验对不同人群的差异影响,进而通过人群定向/数值策略的方式进行差异化实验,或者对实验进行调整.Double Machine Learn ...