Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

中文维基百科分类提取--构建知识图谱

dhName 2019-07-20 14:21:00 阅读数:175 评论数:0 点赞数:0 收藏数:0

首先感谢 :

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:***暂无信息
View Code

  

四。mysql 创建 库。

  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所在的路径

   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;

  这里可能遇到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是一个组合。所以去掉 \  就没问题了。自己可以写个小程序去掉。

 

五。使用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);
     }
 }
View Code

运行的部分结果:

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

 

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); 
     }
 }
View Code
运行结果:
 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
View Code

 其中,

 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;
     }
 }
View Code

 

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

 

版权声明
本文为[dhName]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/dhName/p/11217606.html