Wikipedia Extractor в качестве парсера для файла дампа Википедии - PullRequest
0 голосов
/ 09 марта 2020

Я пытался преобразовать bz2 в текст с помощью "Wikipedia Extractor (http://medialab.di.unipi.it/wiki/Wikipedia_Extractor)". Я скачал дамп Wikipedia с расширением bz2, а затем в командной строке использовал следующую строку кода:

WikiExtractor.py -cb 250K -o extracted itwiki-latest-pages-articles.xml.bz2

Это дало мне результат, который можно увидеть по ссылке:

image

Тем не менее, после этого указано: Для объединения всего извлеченного текста в один файл можно выдать:

> find extracted -name '*bz2' -exec bzip2 -c {} \; > text.xml
> rm -rf extracted

Я получаю следующую ошибку:

File not found - '*bz2'

Что я могу сделать?

1 Ответ

2 голосов
/ 10 марта 2020

Пожалуйста go через это. Это помогло бы.

Ошибка при использовании команды 'find' для создания файла коллекции на opencv

Команды, упомянутые на странице WikiExtractor, предназначены для Unix / Linux system и не будет работать на Windows.

Команда find, которую вы запустили на windows, работает иначе, чем в unix / linux.

Извлеченная часть работает отлично подходит для обоих окон / linux env, если вы запускаете его с префиксом python.

python WikiExtractor.py -cb 250K -o extracted your_bz2_file

Вы увидите папку extracted, созданную в том же каталоге, что и ваш скрипт.

После этого команда find должна работать так, только на linux.

find extracted -name '*bz2' -exec bzip2 -c {} \; > text.xml

найдите в папке extracted все, что соответствует bz2, а затем выполните команду bzip2 для этого файла и поместите результат в текстовый файл. xml file.

Кроме того, если вы запустите команду bzip -help, которая должна выполняться с командой find выше, вы увидите, что она не будет работать на Windows, а для Linux вы получите следующий вывод.

gaurishankarbadola@ubuntu:~$ bzip2 -help
bzip2, a block-sorting file compressor.  Version 1.0.6, 6-Sept-2010.

   usage: bzip2 [flags and input files in any order]

   -h --help           print this message
   -d --decompress     force decompression
   -z --compress       force compression
   -k --keep           keep (don't delete) input files
   -f --force          overwrite existing output files
   -t --test           test compressed file integrity
   -c --stdout         output to standard out
   -q --quiet          suppress noncritical error messages
   -v --verbose        be verbose (a 2nd -v gives more)
   -L --license        display software version & license
   -V --version        display software version & license
   -s --small          use less memory (at most 2500k)
   -1 .. -9            set block size to 100k .. 900k
   --fast              alias for -1
   --best              alias for -9

   If invoked as `bzip2', default action is to compress.
              as `bunzip2',  default action is to decompress.
              as `bzcat', default action is to decompress to stdout.

   If no file names are given, bzip2 compresses or decompresses
   from standard input to standard output.  You can combine
   short flags, so `-v -4' means the same as -v4 or -4v, &c.

Как уже упоминалось выше, действие bzip2 по умолчанию заключается в сжатии, поэтому используйте bzcat для распаковки.

Измененная команда, которая будет работать только на linux, будет выглядеть следующим образом.

find extracted -name '*bz2' -exec bzcat -c {} \; > text.xml

Он работает в моей системе Ubuntu.

РЕДАКТИРОВАТЬ :

Для Windows:

ПЕРЕД ТЕМ, ЧТОБЫ ПОПРОБОВАТЬ, ПОЖАЛУЙСТА GO ПЕРВЫЙ ИНСТРУКЦИЯ

  1. Создайте отдельную папку и t файлы в папке. Файлы -> WikiExtractor.py и itwiki-latest-pages-articles1.xml-p1p277091.bz2 (в моем случае это небольшой файл, который я смог найти).

2. Откройте командную строку в текущем каталоге и выполните следующую команду, чтобы извлечь все файлы.

python WikiExtractor.py -cb 250K -o extracted itwiki-latest-pages-articles1.xml-p1p277091.bz2

Это займет время в зависимости от размера файла, но теперь каталог будет выглядеть следующим образом.

2

ВНИМАНИЕ : если у вас уже есть извлеченная папка, переместите ее в текущий каталог, чтобы он соответствовал изображению выше и вам больше не нужно делать извлечение.

Скопируйте, вставьте приведенный ниже код и сохраните его в файле bz2_Extractor.py.
import argparse
import bz2
import logging

from datetime import datetime
from os import listdir
from os.path import isfile, join, isdir

FORMAT = '%(levelname)s: %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger()
logger.setLevel(logging.INFO)


def get_all_files_recursively(root):
    files = [join(root, f) for f in listdir(root) if isfile(join(root, f))]
    dirs = [d for d in listdir(root) if isdir(join(root, d))]
    for d in dirs:
        files_in_d = get_all_files_recursively(join(root, d))
        if files_in_d:
            for f in files_in_d:
                files.append(join(f))
    return files


def bzip_decompress(list_of_files, output_file):
    start_time = datetime.now()
    with open(f'{output_file}', 'w+', encoding="utf8") as output_file:
        for file in list_of_files:
            with bz2.open(file, 'rt', encoding="utf8") as bz2_file:
                logger.info(f"Reading/Writing file ---> {file}")
                output_file.writelines(bz2_file.read())
                output_file.write('\n')
    stop_time = datetime.now()
    print(f"Total time taken to write out {len(list_of_files)} files = {(stop_time - start_time).total_seconds()}")


def main():
    parser = argparse.ArgumentParser(description="Input fields")
    parser.add_argument("-r", required=True)
    parser.add_argument("-n", required=False)
    parser.add_argument("-o", required=True)
    args = parser.parse_args()

    all_files = get_all_files_recursively(args.r)
    bzip_decompress(all_files[:int(args.n)], args.o)


if __name__ == "__main__":
    main()
Теперь текущий каталог будет выглядеть следующим образом.

3

Теперь откройте cmd в текущем каталоге и выполните следующую команду.

Пожалуйста, прочитайте, что каждый ввод делает в команде.


python bz2_Extractor.py -r extracted -o output.txt -n 10

-r : Каталог root, в котором находятся файлы bz2.

-o: имя выходного файла

-n: количество записываемых файлов. [Если не предоставлено, он записывает все файлы в каталоге root]

ВНИМАНИЕ : я вижу, что ваш файл в гигабайтах и ​​в нем более полумиллиона статей. Если вы попытаетесь поместить это в один файл с помощью приведенной выше команды, я не уверен, что произойдет, или если ваша система сможет пережить это, и если она все же выживет, выходной файл будет таким большим, поскольку он извлекается из 2.8. Файл GB, я не думаю, что Windows ОС сможет открыть его напрямую.

Поэтому я предлагаю обрабатывать 10000 файлов одновременно.

Дайте мне знать, если это работает для вас.

PS: Для приведенной выше команды вывод выглядит следующим образом.

4 5

...