Wiktextract
这是一个从维基词典提取数据的实用程序和Python包。
2024-04-24: Kaikki.org原始下载文件中包含换行分隔的json对象数据,将来会改用后缀.jsonl
以提高清晰度。这将导致下载链接失效,请注意。关于.jsonl
的更多信息,请参见https://jsonlines.org/
2024-06-24: 上述更改已经提交,如果kaikki.org的html生成过程成功,我们应该很快就能看到变化。
请在GitHub上报告问题,我们会尽快处理。
当前提取的版本可在以下网址浏览和下载:https://kaikki.org/dictionary/。我计划在此位置维护一个自动更新的数据版本。对大多数人来说,获取提取的维基词典数据的首选方式是直接从网站获取。
注意:从英语维基词典中提取所有语言的所有数据可能需要一个小时到几天的时间,具体取决于您的计算机。展开Lua模块的代价不小,但它能够实现更高质量的提取和更好的可维护性!您可能想查看预先展开的下载内容,而不是自己运行。
概述
这是一个用于从英语维基词典(enwiktionary)数据转储中提取信息的Python包和工具。请注意,英语维基词典包含许多语言的广泛词典和屈折信息,而不仅仅是英语。只有其释义和内部标记是英文的。
这个工具与我所知的任何系统的一个区别在于,它展开了维基词典中的模板和Lua宏。这使得更准确地呈现和提取释义、词义、屈折形式和发音成为可能。它还使系统更容易维护。所有这些都导致了更高的提取质量和准确性。
这个工具提取释义、词性、可用时的变格/变位信息、所有语言的翻译(如果有)、发音(包括音频文件链接)、限定词(包括用法说明)、词形、单词之间的链接(包括上位词、下位词、整体词、部分词、相关词、衍生词、复合词、替代形式等)。还提取了维基百科页面链接、维基数据标识符和其他此类数据(如果可用)。对于许多类别的单词,词义会被注释特定信息,如它是哪个词的形式、它代表的颜色的RGB值、数字的数值、它代表的SI单位等。
这个工具提取英语维基词典中所有有数据的语言的信息。它还提取跨语言数据和关于字符的信息(任何在维基词典中有条目的内容)。
这个工具读取enwiktionary-<date>-pages-articles.xml.bz2
转储文件,并输出包含维基词典中大部分信息的JSON格式词典。转储文件可以从https://dumps.wikimedia.org下载。
这个实用程序对许多自然语言处理、语义解析、机器翻译和语言生成应用程序都很有用,无论是在研究还是工业领域。
该工具可用于提取机器翻译词典、语言理解词典、语义注释词典和带有变格/变位信息的形态词典(如果目标语言有这些信息)。enwiktionary
中有数十种语言拥有广泛的词汇,数千种语言有部分覆盖。
wiktwords
脚本使得无需编写一行代码即可轻松提取信息供其他工具使用。它提取命令选项指定的信息,用于命令行指定的语言,并以JSON格式将提取的数据写入文件或标准输出,以供其他工具处理。
虽然目前没有支持解析非英语维基词典的积极计划,但我正在考虑。现在它基于wikitextprocessor构建并展开模板和Lua宏,为其他语言构建支持也相当简单 - 甚至可以使提取过程可配置,这样只需要为处理新语言的维基词典创建一个配置文件即可。
据我们所知,截至2020年12月,这是最全面的可用于从维基词典提取信息的工具。
如果您发现这个工具和/或预先提取的数据有帮助,请在GitHub上给它一个星!
预提取数据
对大多数人来说,直接下载预先展开的数据可能最简单。请参阅https://kaikki.org/dictionary/rawdata.html。原始wiktextract数据、提取的分类树、提取的模板和模块,以及用于发音的音频文件的批量下载(包括.ogg
和.mp3
格式)都可以获得。
每个页面底部都有下载链接,还有一个按钮可以查看为每个页面生成的JSON。您可以下载所有数据、特定语言的数据、仅单个单词的数据,或相关单词列表的数据(例如,特定词性或与特定主题相关或具有特定屈折形式的单词)。所有下载都采用JSON Lines格式(每行是一个单独的JSON对象)。较大的下载也提供压缩格式。
一些人要求将全部数据作为单个JSON对象(而不是当前的每行一个JSON对象格式)。我决定保持每行一个JSON对象的格式,因为将所有数据加载到Python中需要约120 GB的内存。逐行处理数据要容易得多,特别是如果您只对部分信息感兴趣。您可以使用以下代码轻松读取文件:
import json
with open("filename.json", encoding="utf-8") as f:
for line in f:
data = json.loads(line)
... 解析此记录中的数据
如果您想将所有数据收集到一个列表中,可以使用以下方法将文件读入列表:
import json
lst = []
with open("filename.json", encoding="utf-8") as f:
for line in f:
data = json.loads(line)
lst.append(data)
您还可以使用以下方法轻松地将数据美化打印成更易读的形式:
print(json.dumps(data, indent=2, sort_keys=True, ensure_ascii=False))
以下是单词thrill
作为英语动词的提取词条示例(这里只显示一个词性):
{
"categories": [
"情感"
],
"derived": [
{
"word": "enthrill"
}
],
"forms": [
{
"form": "thrills",
"tags": [
"现在时",
"简单式",
"单数",
"第三人称"
]
},
{
"form": "thrilling",
"tags": [
"现在时"
]
},
{
"form": "thrilled",
"tags": [
"分词",
"过去式",
"简单式"
]
}
],
"head_templates": [
{
"args": {},
"expansion": "thrill (第三人称单数现在时简单式 thrills, 现在分词 thrilling, 简单过去式和过去分词 thrilled)",
"name": "en-verb"
}
],
"lang": "英语",
"lang_code": "en",
"pos": "动词",
"senses": [
{
"glosses": [
"突然使某人兴奋,或给某人带来巨大愉悦;使激动;体验这种感觉。"
],
"tags": [
"作格动词",
"比喻"
]
},
{
"glosses": [
"(使某物)颤抖或震动。"
],
"tags": [
"作格动词"
]
},
{
"glosses": [
"用尖锐的工具刺穿;钻孔;贯穿;钻。"
],
"tags": [
"过时"
]
},
{
"glosses": [
"投掷;抛;扔。"
],
"tags": [
"过时"
]
}
],
"sounds": [
{
"ipa": "/θɹɪl/"
},
{
"ipa": "[θɾ̥͋ɪɫ]",
"tags": [
"英国",
"美国"
]
},
{
"ipa": "[θɾ̥͋ɪəl]",
"tags": [
"爱尔兰"
]
},
{
"ipa": "[t̥ɾ̥͋ɪəl]",
"tags": [
"爱尔兰"
]
},
{
"rhymes": "-ɪl"
},
{
"audio": "en-us-thrill.ogg",
"mp3_url": "https://upload.wikimedia.org/wikipedia/commons/transcoded/d/db/En-us-thrill.ogg/En-us-thrill.ogg.mp3",
"ogg_url": "https://upload.wikimedia.org/wikipedia/commons/d/db/En-us-thrill.ogg",
"tags": [
"美国"
],
"text": "音频 (美国)"
}
],
"translations": [
{
"code": "nl",
"lang": "荷兰语",
"sense": "突然使某人兴奋,或给某人带来巨大愉悦;使激动",
"word": "opwinden"
},
{
"code": "fi",
"lang": "芬兰语",
"sense": "突然使某人兴奋,或给某人带来巨大愉悦;使激动",
"word": "sykähdyttää"
},
{
"code": "fi",
"lang": "芬兰语",
"sense": "突然使某人兴奋,或给某人带来巨大愉悦;使激动",
"word": "riemastuttaa"
},
...
{
"code": "tr",
"lang": "土耳其语",
"sense": "伴随心脏杂音的轻微心跳",
"word": "çarpıntı"
}
],
"wikipedia": [
"thrill"
],
"word": "thrill"
}
入门指南
安装
使用容器:
$ podman run -it --rm ghcr.io/tatuylonen/wiktextract --help
从源代码安装:
在 Linux 上(以 Ubuntu 20.04 为例),你可能需要先使用 apt update && apt install build-essential python3-dev python3-pip lbzip2
安装 build-essential
和 python3-dev
包。
git clone https://github.com/tatuylonen/wiktextract.git
cd wiktextract
python -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install -e .
如果你想通过 git pull
更新两个包的代码,请使用 pip install 命令的 --force-reinstall
和 -e
选项,以可编辑模式从源代码重新安装 wikitextprocessor 包。
运行测试
该包包含使用 unittest
框架编写的测试。
可以使用以下命令安装测试依赖项:
python -m pip install -e .[dev]
。
要运行测试,请在顶级目录中使用以下命令:
make test
(不幸的是,wiktextract
的测试套件目前还不是很全面。底层的低级工具包 wikitextprocessor
有更广泛的测试覆盖率。)
预期性能
从英语维基词典中提取所有语言的所有数据大约需要 1.25 小时,在一个 128 核双 AMD EPYC 7702 系统上。性能预计与处理器核心数量成线性关系,前提是你有足够的内存(建议每核心约 10GB 或每超线程约 5GB)。
你可以使用 --num-processes
选项控制要使用的并行进程数;默认使用可用的核心/超线程数。
你可以从 kaikki.org 下载完整的预提取数据。预提取数据会定期使用最新的维基词典转储进行更新。除非你有特殊需求或想修改代码,否则使用预提取数据可能是最简单的选择。
使用命令行工具
wiktwords
脚本是从维基词典中提取数据的最简单方法。只需从 dumps.wikimedia.org 下载数据转储文件并运行该脚本。正确的转储文件名为 enwiktionary-<date>-pages-articles.xml.bz2
。
提取所有数据的典型调用示例如下:
wiktwords --all --all-languages --out data.json enwiktionary-20230801-pages-articles.xml.bz2
如果你想修改代码或测试处理单个页面,以下内容也可能有用:
- 传递一个路径来保存数据库文件,你可以用它来快速处理单个页面:
wiktwords --db-path en_20230801.db enwiktionary-20230801-pages-articles.xml.bz2
- 处理单个页面并生成人类可读的输出文件以进行调试:
wiktwords --db-path en_20230801.db --all --all-languages --out outfile --page page_title
可以使用以下命令行选项来控制其操作:
- --out FILE: 指定要写入的文件名(指定"-"作为文件写入 stdout)
- --all-languages: 提取所有可用语言的单词
- --language-code LANGUAGE_CODE: 提取给定语言(此选项可多次指定;默认为转储文件语言代码和
mul
(多语言)) - --language-name LANGUAGE_NAME: 与
--language-code
类似,但此选项接受语言名称 - --dump-file-language-code LANGUAGE_CODE: 指定转储文件所属的维基词典版本的语言代码(默认为"en";支持"zh",其他正在添加中)
- --all: 捕获所选语言的所有数据
- --translations: 捕获翻译
- --pronunciation: 捕获发音信息
- --linkages: 捕获链接(同义词等)
- --examples: 捕获使用示例
- --etymologies: 捕获词源信息
- --descendants: 捕获派生词信息
- --inflections: 捕获变位表
- --redirects: 提取重定向
- --pages-dir DIR: 将所有维基词典页面保存在此目录下(主要用于调试)
- --db-path PATH: 从此路径保存/使用数据库(用于调试)
- --page FILE or TITLE: 从文件或数据库读取页面,可多次指定(第一行必须是"TITLE: pagetitle";文件应使用 UTF-8 编码)
- --num-processes PROCESSES: 使用这么多并行进程(每个进程需要 4GB)
- --human-readable: 打印带缩进的人类可读 JSON(不再机器可读)
- --override PATH: 用此目录中的文件覆盖页面(文件的第一行必须是 TITLE: pagetitle)
- --templates-file: 将模板命名空间提取到此 tar 文件
- --modules-file: 将模块命名空间提取到此 tar 文件
- --categories-file: 将维基词典类别树提取到此文件作为 JSON(见下面的描述)
- --inflection_tables_file: 将表格提取并展开到此文件作为 wikitext;用于创建测试
- --help: 显示帮助文本(包含此处未列出的更多选项)
调用库
虽然这个包主要是为了使用 wiktwords
命令而设计的,但也可以作为库调用。在底层,它使用了 wikitextprocessor
模块。有关更多使用示例,请阅读 wiktwords.py 和 wiktionary.py 文件。
可以从应用程序中调用此代码,如下所示:
from wiktextract import (
WiktextractContext,
WiktionaryConfig,
parse_wiktionary,
)
from wikitextprocessor import Wtp
config = WiktionaryConfig(
dump_file_lang_code="en",
capture_language_codes=["en", "mul"],
capture_translations=True,
capture_pronunciation=True,
capture_linkages=True,
capture_compounds=True,
capture_redirects=True,
capture_examples=True,
capture_etymologies=True,
capture_descendants=True,
capture_inflections=True,
)
wxr = WiktextractContext(Wtp(), config)
RECOGNIZED_NAMESPACE_NAMES = [
"Main",
"Category",
"Appendix",
"Project",
"Thesaurus",
"Module",
"Template",
"Reconstruction"
]
namespace_ids = {
wxr.wtp.NAMESPACE_DATA.get(name, {}).get("id")
for name in RECOGNIZED_NAMESPACE_NAMES
}
with open("output.json", "w", encoding="utf-8") as f:
parse_wiktionary(wxr, dump_path, None, False, namespace_ids, f)
捕获参数默认为"True",因此只有在某些值不需要被捕获时才需要设置(请注意,"wiktwords"程序将它们设置为"False",除非使用"--all"或特定的捕获选项)。
#### parse_wiktionary()
```python
def parse_wiktionary(
wxr: WiktextractContext,
dump_path: str,
num_processes: Optional[int],
phase1_only: bool,
namespace_ids: Set[int],
out_f: TextIO,
human_readable: bool = False,
override_folders: Optional[List[str]] = None,
skip_extract_dump: bool = False,
save_pages_path: Optional[str] = None,
) -> None:
"parse_wiktionary"函数将为在维基词典转储中找到的单词和重定向调用"word_cb(data)"。"data"是以字典形式表示的单个单词和词性的信息,可能包含几个词义。它也可能是一个重定向(通过字典中存在"redirect"键来指示)。它的格式与"wiktwords"工具返回的JSON格式字典相同。
其参数如下:
- "wxr"(WiktextractContext)- 一个Wiktextract级别的处理上下文,包含指向Wtp上下文和WiktionarConfig对象的字段(如下)。 ** "wxr.wtp"(Wtp)- 一个wikitextprocessor处理上下文。可以通过构造函数的"num_threads"参数指定要使用的并行进程数,并且可以通过"db_path"参数提供数据库文件路径。 ** "wxr.config"(WiktionaryConfig)- 描述要提取内容的配置对象(见下文)
- "dump_path"(str)- 维基词典转储文件的路径(*-pages-articles.xml.bz2)
- "phase1_only" - 如果设置为"True",则只会创建缓存文件,而不会进行提取。在这种情况下,创建"wxr.wtp"时,"Wtp"构造函数可能应该给出"db_path"参数。
- "namespace_ids" - 一组命名空间id,不包含在此集合中的页面命名空间id将不会被处理。可用的id值可以在wikitextprocessor项目的data/en/namespaces.json文件和维基词典*.xml.bz2转储文件中找到。
- "out_f" - 输出文件对象。
- "human_readable" - 如果设置为"True",输出的JSON将进行格式化缩进。
- "override_folders" - 用这些目录中的文件覆盖页面。
- "skip_extract_dump" - 如果数据库存在,则跳过提取转储文件。
- "save_pages_path" - 存储提取页面的路径。
这个调用在"wxr.config"中收集统计信息。此函数将自动并行化提取过程。然而,"page_cb"将在父进程中被调用。
parse_page()
def parse_page(
wxr: WiktextractContext, page_title: str, page_text: str
) -> List[Dict[str, str]]:
- "wxr"(WiktextractContext)- 一个"wiktextract"上下文,包含: ** "wxr.wtp"(Wtp)- 一个"wikitextprocessor"上下文 ** "wxr.config"(WiktionaryConfig)- 指定要捕获的内容,也用于收集统计信息
- "page_title"(str)- 用于页面的标题
- "page_text"(str)- 页面内容(wikitext)
PARTS_OF_SPEECH
这是一个常量集,包含提取数据中可能出现的所有词性值("pos"键)。请注意,这个列表比传统的词性列表要大一些。
class WiktextractContext(object)
"WiktextractContext"对象用于保存"wikitextprocessor"特定的"Wtp"上下文对象和wiktextract的"WiktionaryConfig"对象,XXX将来它将保存不属于Wtp的实际上下文,XXX WiktionaryConfig很可能会被整合到WiktextractContext对象本身中。
构造函数只需提供一个Wtp和WiktionaryConfig对象:
# 通常用于测试的空白模板
wxr = WiktextractContext(Wtp(), WiktionaryConfig())
或者
# 单独初始化的配置,带有一系列参数,如下面 -> class WiktionaryConfig(object) 部分的示例
wxr = WiktextractContext(wtp, config)
如果这样更方便的话
class WiktionaryConfig(object)
"WiktionaryConfig"对象用于指定从维基词典收集哪些数据,并在提取过程中用于收集统计信息。目前,它是WiktextractContext上下文对象的一个字段。
构造函数:
def __init__(
self,
dump_file_lang_code="en",
capture_language_codes=["en", "mul"],
capture_translations=True,
capture_pronunciation=True,
capture_linkages=True,
capture_compounds=True,
capture_redirects=True,
capture_examples=True,
capture_etymologies=True,
capture_inflections=True,
capture_descendants=True,
verbose=False,
expand_tables=False,
):
参数如下:
- "capture_language_codes"(字符串列表/元组/集合)- 要捕获数据的语言代码。默认为["en", "mul"]。要捕获所有语言,请设置为None。
- "capture_translations"(布尔值)- 设置为False以禁用捕获翻译。翻译信息似乎在英语中最为广泛可用,包含了其他语言的翻译。
- "capture_pronunciation"(布尔值)- 设置为False以禁用捕获发音。通常,发音包括IPA转写和单词条目中包含的任何音频文件,以及其他信息(包括方言标签)。不同语言之间的发音信息类型和数量差异很大。
- "capture_linkages"(布尔值)- 设置为False以禁用捕获单词之间的联系,如上位词、反义词、同义词等。
- "capture_compounds"(布尔值)- 设置为False以禁用捕获包含该单词的复合词。复合词捕获目前尚未完全实现。
- "capture_redirects"(布尔值)- 设置为False以禁用捕获重定向。重定向不与任何特定语言相关联,因此请求它们会返回所有语言中的所有单词的重定向。
- "capture_examples"(布尔值)- 设置为False以禁用捕获用法示例。
- "capture_etymologies"(布尔值)- 设置为False以禁用捕获词源。
- "capture_descendants"(布尔值)- 设置为False以禁用捕获后代词。
- "capture_inflections"(布尔值)- 设置为False以禁用捕获变位表。
提取的重定向格式
维基词典中的某些页面是重定向。对于这些页面,"word_cb"将以特殊格式调用数据。在这种情况下,字典将有一个"redirect"键,其中包含该条目重定向到的页面标题。"title"键包含包含重定向的单词/术语。重定向条目没有"pos"或任何其他字段。重定向也不与任何语言相关联,所以如果请求提取重定向,无论捕获的语言如何,始终会返回所有重定向。
提取的单词条目格式
为每个单词返回的信息是一个字典。该字典具有以下键(也可能存在其他键或稍后添加):
word
- 单词形式pos
- 词性,如"名词"、"动词"、"形容词"、"副词"、"代词"、"限定词"、"介词"、"后置词"等。包中返回的可能值的完整列表可以在wiktextract.PARTS_OF_SPEECH
中找到。lang
- 该词所属的语言名称(例如,英语
)lang_code
- 与lang
键对应的维基词典语言代码(例如,en
)senses
- 该词/词性的词义列表(字典),详见下文forms
- 该词的变化形式或替代形式列表(例如,复数、比较级、最高级、罗马字形式)。这是一个字典列表,每个字典包含form
键和tags
键。tags
标识了该形式的类型。它还可能包含"ipa"、"roman"和"source"字段。当某个词被标记为没有该形式时,form 可以是"-"(其中一些是特定词的,而其他是特定语言的;后处理可以删除那些对于该标签组合没有值的形式)。sounds
- 包含发音、连字符、押韵和相关信息的字典列表。每个字典可能有一个tags
键,包含说明该条目类型的标签。不同类型的信息存储在不同的字段中:ipa
是国际音标发音,enPR
是英语发音重拼,audio
是维基共享资源中的声音文件名。categories
- 该词的非消歧类别列表topics
- 该词的非消歧主题列表translations
- 非消歧翻译条目(见下文)etymology_text
- 经过清理的词源部分文本etymology_templates
- 词源部分的模板及其参数和扩展。这些可用于轻松解析词源关系。某些不表示词源关系的常见模板未包括在内。etymology_number
- 对于有多个编号词源的词,此字段包含该条目出现的词源编号descendants
- 该词的派生词(见下文)synonyms
- 该词的非消歧同义词链接(见下文)antonyms
- 该词的非消歧反义词链接(见下文)hypernyms
- 该词的非消歧上位词链接(见下文)holonyms
- 表示作为某物一部分的非消歧链接(见下文)(未系统编码)meronyms
- 表示拥有部分的非消歧链接(见下文)(相当罕见)derived
- 该词的非消歧派生词链接(见下文)related
- 该词的非消歧相关词链接(见下文)coordinate_terms
- 该词的非消歧并列词链接(见下文)wikidata
- 非消歧维基数据标识符wiktionary
- 维基百科中的非消歧页面标题(可能带有语言ID前缀)head_templates
- 该词的特定词性头部标签。这基本上只是将模板(它们的名称和参数)捕获为字典列表。大多数应用可能会忽略此项。inflection_templates
- 该词的变位和变格模板,以字典形式呈现。这些基本上捕获了该词的特定语言变化模板。注意,对于某些语言,变化信息也包含在head_templates
中。XXX 在不久的将来,我们将开始从变化表中解析变化形式到forms
中,因此通常不需要使用inflection_templates
数据。
可能还有其他字段。
请注意,词条级别的几个字段表示未经词义消歧的信息。这些信息可能适用于一个或多个词义。目前只有最简单的情况得到了消歧;然而,预计将来会进行更多的消歧。同一个键也可能同时出现在词义和词条中;在这种情况下,词义中的数据已经经过词义消歧,而词条中的数据则没有(并且可能不适用于任何特定词义,无论该词义是否有一些相关的经过词义消歧的信息)。
词义
每个词条可能在 senses
键下有多个释义。每个词义是一个字典,可能包含以下键(以及其他键,将来可能会添加更多):
glosses
- 该词义的释义字符串列表(通常只有一个)。这已经经过清理,应该是没有标记的直白文本。raw_glosses
- 该词义的释义字符串列表,比glosses
清理得更少。特别是,已从释义中解析到tags
和topics
的括号部分仍然存在。这个版本可能更容易被人理解。tags
- 释义的限定词和标签列表。这是一个字符串列表,可能包括"古语"、"口语"、"现在"、"分词"、"复数"、"阴性"等词(可能会出现新词)。categories
- 从页面上的(部分)类别链接中提取的经过词义消歧的类别名称列表topics
- 经过词义消歧的主题名称列表(有点类似于类别,但确定方式不同)alt_of
- 该词义是其替代形式的词列表;这是一个字典列表,word
字段包含链接的词,可选的extra
字段包含额外文本form_of
- 该词义是其变化形式的词列表;这是一个字典列表,word
字段包含链接的词,可选的extra
字段包含额外文本translations
- 经过词义消歧的翻译条目(见下文)synonyms
- 该词的经过词义消歧的同义词链接(见下文)antonyms
- 该词的经过词义消歧的反义词链接(见下文)hypernyms
- 该词的经过词义消歧的上位词链接(见下文)holonyms
- 表示作为某物一部分的经过词义消歧的链接(见下文)(未系统编码)meronyms
- 表示拥有部分的经过词义消歧的链接(见下文)(相当罕见)coordinate_terms
- 经过词义消歧的并列词链接(见下文)derived
- 该词的经过词义消歧的派生词链接(见下文)related
- 该词的经过词义消歧的相关词链接(见下文)senseid
- 为该词义收集的文本标识符列表。如果有条目的QID(例如,Q123),则存储在wikidata
字段中。wikidata
- 该词义的QID列表(例如,Q123)wikipedia
- 维基百科页面标题列表(可选带有语言代码前缀)examples
- 用法示例列表,每个示例是一个字典,包含text
字段(包含示例文本),可选的ref
字段(包含源引用),可选的english
字段(包含英语翻译),可选的type
字段(包含示例类型,目前为example
或quotation
(如果存在)),可选的roman
字段(包含罗马化(对于某些使用非拉丁文字的语言)),以及可选的(罕见)note
字段(包含非英语示例开头的英语括号注释)。english
- 如果词义有无法解析的限定词,该限定词会被放在这个字段中(罕见)。大多数限定词被解析到tags
和/或topics
中。带有限定词的释义仍可在raw_glosses
中找到。
发音
发音信息存储在 sounds
键下。它是一个字典列表,每个字典可能包含以下键(以及其他键):
ipa
- 以国际音标字符串 /.../ 或 [...] 表示的发音规范enpr
- 英语发音重拼的发音audio
- 维基共享资源中的声音文件名ogg_url
- OGG Vorbis 格式声音文件的 URLmp3_url
- MP3 格式声音文件的 URLaudio-ipa
- 与音频文件相关的国际音标字符串,通常给出声音文件中内容的国际音标转写homophones
- 该词的同音词列表hyphenation
- 连字符列表tags
- 附加到发音条目的其他标签或上下文信息(例如,可能表示地区变体或方言)text
- 与音频文件相关的文本(通常用处不大)
注意,维基词典音频文件可以在 https://kaikki.org/dictionary/rawdata.html 批量下载。下载中的文件以 ogg_url
和/或 mp3_url
中 URL 的最后一个组件命名。单独下载它们需要几天时间,并会给维基媒体服务器带来不必要的负担。
翻译
翻译存储在单词数据的 translations
键下(如果未经词义消歧)或词义中(如果经过词义消歧)。它们以字典列表的形式存储,每个字典具有以下键(可能还有其他键):
alt
- 可选的翻译替代形式(如不同书写系统)code
- 维基词典用于该语言翻译的2或3字母语言代码english
- 英语文本,通常用于说明翻译的目标含义lang
- 翻译所针对的语言名称note
- 可选文本,描述或评论该翻译roman
- 可选的翻译罗马化形式(针对非拉丁字符)sense
- 可选的语义,表示这是某个特定含义的翻译(这是自由文本字符串,可能与任何释义不完全匹配)tags
- 可选的翻译限定词列表,如性别taxonomic
- 可选的翻译中提到的生物体的分类学名称word
- 指定语言的翻译(当存在note
时可能缺失)
词源
词源信息存储在单词数据的etymology_text
和etymology_templates
键下。当同一词源下列出多个词性时,相同的数据会复制到该词源下的每个词性条目中。
etymology_text
字段包含整个词源部分的内容,已清理为人类可读的文本(即模板已展开,HTML标签已删除等)。
etymology_templates
字段包含词源部分的模板列表。一些不相关的常见模板已被删除(如redlink category
和isValidPageName
)。该列表还包括从词源描述中直接使用的模板引用的嵌套模板。列表中的每个模板是一个字典,包含以下键:
name
- 模板名称args
- 将参数名映射到其清理值的字典。位置参数的键是从"1"开始的数字字符串。expansion
- 模板展开后的(清理后的)文本。
派生词
如果一个词有"Descendants"部分,词的数据中会出现descendants
键。它包含一个对象列表,对应该部分的每一行,每个对象有以下键:
depth
: 当前行的缩进级别。可用于跟踪列表的层次结构。templates
: 对应该行中出现的模板的对象数组。每个对象的结构与etymology_templates
中每个对象的结构相同。text
: 展开和清理后的行文本,类似于etymology_text
。
对于重建语言中作为词根的单词的"Derived terms"和"Extensions"部分的特殊情况,也会出现descendants
数据,因为这些部分具有相同的格式。
与其他单词的链接
链接(synonyms
, antonyms
, hypernyms
, derived words
, holonyms
, meronyms
, derived
, related
, coordinate_terms
)如果没有消歧义,则存储在单词的数据中;如果有消歧义,则存储在单词义项中。它们是字典列表,每个字典可以包含以下键(以及其他键):
alt
- 可选的目标替代形式(如不同书写系统)english
- 与该义项相关的可选英语文本,通常用于识别链接的目标义项roman
- 非拉丁文字中链接词的可选罗马化形式sense
- 识别词义或上下文的文本(如"下大雨")tags
: 为该义项指定的限定词(如研究领域、地区、方言、风格)taxonomic
: 与链接相关的可选分类学名称topics
: 链接的主题描述符列表(如"军事")word
- 链接到的单词(字符串)
类别树数据格式
--categories-file
选项将维基词典类别树以JSON格式提取到指定文件中。数据是通过评估维基词典Lua模块提取的。
写入JSON文件的数据是一个字典,顶级键为roots
和nodes
。
Roots是不是其他节点子节点的顶级节点列表。Fundamental
是正常的顶级节点;其他根可能反映维基词典层次结构中的错误。虽然不是根,但类别all topics
包含主题类别的子层次结构(如food and drink
、nature
、sciences
等)。
Nodes是一个字典,将小写类别名称映射到包含该类别数据的字典。对于每个类别,可能存在以下字段:
name
(始终存在): 类别的非小写名称(但请注意,维基词典层次结构中许多类别原本就是小写的)desc
: 可选的类别描述clean_desc
: 可选的清理后的类别描述,维基文本格式已清理为人类可读文本,除{{{langname}}}(可能还有其他类似标签)保持不变。children
: 可选的该类别的子类别列表sort
: 可选的排序列表(子类别类型?)。
返回的类别与原始维基词典类别数据中的一致。通常不包括特定语言的类别。但是,有一个类别{{{langcat}}}
似乎包含许多有语言特定变体的类别。此外,类别树数据不包含语言前缀(树在维基词典中定义时没有前缀,然后为每种语言复制)。
相关包
wikitextprocessor是一个用于从维基词典、维基百科和其他维基媒体转储文件中提取数据的通用模块。wiktextract
是使用该模块构建的。
当使用GitHub上的wiktextract版本时,请同时设置wikitextprocessor,使它们大致对应。这些包的pypi版本通常是过时的,混合使用新旧版本会导致错误。这些包正在并行开发中。
wiktfinnish包可用于解释芬兰语名词变格和动词变位,以及生成芬兰语变化词形。
出版物
如果您在学术工作中使用Wiktextract或提取的数据,请引用以下文章:
Tatu Ylonen: Wiktextract: Wiktionary as Machine-Readable Structured data,第13届语言资源与评估会议(LREC)论文集,第1317-1325页,马赛,2022年6月20-25日。
链接到https://kaikki.org或相关子页面也将不胜感激。
相关工具
还存在一些其他用于解析维基词典的工具。这些工具包括Dbnary、Wikiparse和DKPro JWKTL。
贡献和报告错误
请在GitHub上报告错误和其他问题。我也欢迎改进建议。
如果您希望贡献或有补丁或建议,请发送电子邮件至ylo@clausal.com
。
许可
版权所有 (c) 2018-2020 Tatu Ylonen。该包可用于商业和非商业用途。它根据MIT许可证授权。详情请参见LICENSE文件。(某些文件有不同的开源许可证)