我在这里有点新。我有一个项目,我必须下载并使用维基百科进行 NLP。我面临的问题如下: 我的 RAM 只有 12 GB,但英文 wiki 转储压缩后的大小超过 15 GB。这会限制我对 wiki 的处理吗?我不需要维基百科上的任何图片。在处理之前我需要解压缩转储吗?有人可以告诉我所需的步骤或向我指出相关内容吗? 预先感谢。
处理 wikipedia 转储的最简单方法是依赖 kiwix.org 转储,您可以在以下位置找到该转储:https://wiki.kiwix.org/wiki/Content_in_all_languages
然后使用 python 你可以执行以下操作
% wget http://download.kiwix.org/zim/wiktionary_eo_all_nopic.zim
...
% pip install --user libzim
% ipython
In [2]: from libzim.reader import File
In [3]: total = 0
...:
...: with File("wiktionary_eo_all_nopic.zim") as reader:
...: for uid in range(0, reader.article_count):
...: page = reader.get_article_by_id(uid)
...: total += len(page.content)
...: print(total)
这是一个简单的处理,您应该明白要点才能开始。特别是,截至 2020 年,使用 wikimarkup 的原始维基百科转储非常难以处理,因为如果没有完整的 wikimedia 设置,您无法将 wikimarkup 转换为 html(包括信息框)。还有 REST API,但是当工作已经完成时为什么还要挣扎 :)
关于处理后的数据存储位置,我认为行业标准是 PostgreSQL 或 ElasticSearch(也需要大量内存),但我真的很喜欢 hoply,更一般的是 OKVS。
如果您想直接处理 XML 转储,您可以下载多流版本。
multistream 允许使用索引根据需要解压缩部分,而无需解压缩整个内容。
这允许您从压缩转储中提取文章。
有关文档,请参阅 https://meta.wikimedia.org/wiki/Data_dumps/Dump_format#Multistream_dumps。使用此信息,您可以从转储中获取任何给定的文章,而无需将其加载到内存中。
如果您想解析所有维基百科,您可以一次解析其中一个多流文件(约 100 篇文章),这应该能让您适应您的资源。有关如何执行此操作的示例,请参见 https://jamesthorne.co.uk/blog/processing-wikipedia-in-a- Couple-of-hours/。
from libzim.reader import Archive
PATH = "path/to/file.zim"
zim = Archive(PATH)
for uid in range(0, zim.article_count):
entry = zim._get_entry_by_id(uid)
# 'if' is to skip entries with extension
# like .js, .css, .svg, .png
if "." not in entry.title:
print(entry.title)
# After you can:
entry = zim.get_entry_by_title("title")
buffer = entry.get_item().content
html_str = bytes(buffer).decode("UTF-8")
# you can process this html_str using
# for example 'from html.parser import HTMLParser'