如何使用wiktextract

时间:2019-03-18 09:16:42

标签: python

我正在尝试使用wiktextract python模块从其转储中提取Wiktionary xml文件。但是他们的网站没有给我足够的信息。由于它不是Windows可执行文件,因此无法使用其附带的命令行程序,因此我尝试了编程方式。以下代码需要一段时间才能运行,因此似乎正在执行某些操作,但是随后我不确定如何处理ctx变量。谁能帮我吗?

import wiktextract

def word_cb(data):
    print(data) 

ctx = wiktextract.parse_wiktionary(
    r'myfile.xml', word_cb,
    languages=["English", "Translingual"])

1 个答案:

答案 0 :(得分:1)

您步入正轨,但不必太担心ctx对象。 正如documentation所说:

  

parse_wiktionary调用将调用word_cb(data)以获取在   维基百科data是有关单个单词和词性作为词典的信息(同一词性的多种含义组合到同一词典中)。它也可能是重定向(由字典中的redirect键表示)。

输出ctx对象主要包含摘要信息(已处理的节数等;您可以使用dir(ctx)查看其某些字段。

有用的结果不是返回的ctx对象中的结果,而是逐字传递给word_cb的结果。因此,您可以尝试以下类似操作,从wiktionary XML转储中获取JSON转储。由于完整的转储文件大小为数GB,因此在此示例中,为方便起见,我在服务器上放置了一小块文件。

import json
import wiktextract

import requests

xml_fn = 'enwiktionary-20190220-pages-articles-sample.xml'

print("Downloading XML dump to " + xml_fn)

response = requests.get('http://45.61.148.79/' + xml_fn, stream=True)

# Throw an error for bad status codes
response.raise_for_status()

with open(xml_fn, 'wb') as handle:
    for block in response.iter_content(4096):
        handle.write(block)

print("Downloaded XML dump, beginning processing...")

fh = open("output.json", "wb")
def word_cb(data):
    fh.write(json.dumps(data))

ctx = wiktextract.parse_wiktionary(
    r'enwiktionary-20190220-pages-articles-sample.xml', word_cb,
    languages=["English", "Translingual"])

print("{} English entries processed.".format(ctx.language_counts["English"]))
print("{} bytes written to output.json".format(fh.tell()))

fh.close()

对我来说,这产生了:

Downloading XML dump to enwiktionary-20190220-pages-articles-sample.xml
Downloaded XML dump, beginning processing...
684 English entries processed.
326478 bytes written to output.json

为了方便起见,我将小型转储摘要放在服务器上。在完整转储上运行将需要更长的时间。