我已经对维基百科中的数据进行了一些解析。我对提取方程特别感兴趣,所以我只对文件的一部分感兴趣。
首先,如果您对它的 WikiMedia 数据感兴趣,那么获得实验室帐户会容易得多。这需要大约一天的时间,它可以让你在他们的机器上运行大部分代码,避免下载数 GB 的需要。使用 Labs 帐户,您应该能够在相当最新的数据库复制上运行代码,而无需完全使用 json。
我使用一个简单的 python 程序来解析数据,它基本上在每一行运行几个正则表达式;一个查找包含的行,<title>...</title>
因此我知道它是哪篇维基百科文章,还有一些查找名称空间和数学标签。它可以在 13 秒内处理 160MB 的文件,因此可能可以在一个小时内完成整个 36GB。
此代码生成仅包含我感兴趣的数据的文本文件。如果您感兴趣,代码是
import sys
import re
dump = len(sys.argv)>1 and sys.argv[1]=='-d'
titleRE = re.compile('<title>(.*)</title>')
nsRE = re.compile('<ns>(.*)</ns>')
mathRE = re.compile('</?math(.*?)>')
pageEndRE = re.compile('</page>')
supOc = 0
supCc = 0
subOc = 0
subCc = 0
title =""
attr = ""
ns = -1
inEqn = 0
for line in sys.stdin:
m = titleRE.search(line)
if m :
title = m.group(1)
expression = ""
if dump : print line
inEqn = 0
m = nsRE.search(line)
if m :
ns = m.group(1)
start = 0
pos = 0
m = mathRE.search(line,pos)
while m :
if m.group().startswith('<math'):
attr = m.group(1)
start = m.end()
pos = start
expression = ""
inEqn = 1
if m.group() == '</math>' :
end = m.start()
expression = ' '.join([expression,line[start:end]])
print title,'\t',attr,'\t',expression.lstrip().replace('<','<').replace('>',
'>').replace('&','&')
pos = m.end()
expression = ""
start = 0
inEqn = 0
m = mathRE.search(line,pos)
if start > 0 :
expression = line[start:].rstrip()
elif inEqn :
expression = ' '.join([expression,line.rstrip()])
对不起,如果它有点神秘,但它不是供公众消费的。样本输出为
Arithmetic mean a_1,\ldots,a_n.
Arithmetic mean A
Arithmetic mean A=\frac{1}{n}\sum_{i=1}^{n} a_i
Arithmetic mean \bar{x}
每行都有文章的名称和乳胶方程式。这将我需要处理的数据减少到更易于管理的 500k。我不确定这样的策略是否适用于您的应用程序。
对于主要的 enwiki 数据,将 xml 转储拆分为 27 个较小的文件,大小大致相同。您可能会发现一些大小合理的文件,比一个大文件或数百万个小文件更容易处理。可能很容易按文章标题中的第一个字母进行拆分,从而给出不到一百个文件,每个文件小于 1 GB。