В производственной обработке естественного языка (NLP) критически важна быстрая предварительная обработка популярных форматов документов в текст.

По оценкам, 70–85% мировых данных составляют текстовые (неструктурированные) данные. Большинство форматов бизнес-данных на английском и европейском языках в виде байтового текста, MS Word или Adobe PDF. [1]

В сети организации отображаются документы в формате dobe Postscript Document Format (PDF). [2]

В этом блоге я подробно описываю следующее:

  1. Создайте путь к файлу из имени веб-файла и имени локального файла;
  2. Преобразование байтового файла проекта Gutenberg в текстовый корпус;
  3. Превратить PDF-документ в текстовый корпус;
  4. Сегментируйте непрерывный текст в корпус словесного текста.

Преобразование популярных форматов документов в текст

1. Создайте локальный путь к файлу из имени веб-файла или локального имени файла.

Следующая функция принимает либо имя локального файла, либо URL удаленного файла и возвращает объект пути к файлу.

#in file_to_text.py
--------------------------------------------
from io import StringIO, BytesIO
import urllib

def file_or_url(pathfilename:str) -> Any:
    """
    Reurn filepath given local file or URL.
    Args:
        pathfilename:

    Returns:
        filepath odject istance

    """
    try:
        fp = open(pathfilename, mode="rb")  # file(path, 'rb')
    except:
        pass
    else:
        url_text = urllib.request.urlopen(pathfilename).read()
        fp = BytesIO(url_text)
    return fp

2. Измените файл с байтовой кодировкой Unicode на строку Unicode Python.

Вы часто будете сталкиваться с загрузкой текстовых BLOB-объектов в 8-битном формате Unicode (на романтических языках). Вам необходимо преобразовать 8-битный Unicode в строки Python Unicode.

#in file_to_text.py
--------------------------------------------
def unicode_8_to_text(text: str) -> str:
    return text.decode("utf-8", "replace")
import urllib
from file_to_text import unicode_8_to_text
text_l = 250
text_url = r'http://www.gutenberg.org/files/74/74-0.txt' 
gutenberg_text =  urllib.request.urlopen(text_url).read()
%time gutenberg_text = unicode_8_to_text(gutenberg_text)
print('{}: size: {:g} \n {} \n'.format(0, len(gutenberg_text) ,gutenberg_text[:text_l]))

output = ›

CPU times: user 502 µs, sys: 0 ns, total: 502 µs
Wall time: 510 µs
0: size: 421927 
 
The Project Gutenberg EBook of The Adventures of Tom Sawyer, Complete by
Mark Twain (Samuel Clemens)

This eBook is for the use of anyone anywhere at no cost and with almost
no restrictions whatsoever. You may copy it, give it away or re-use
it under the terms of the Project Gutenberg License included with this
eBook or online at www.guten

В результате text.decode('utf-8') может преобразовать в строку Python из миллиона символов примерно за 1/1000 секунды. Скорость, которая намного превышает наши требования к производительности.

3. Превратите PDF-документ в текстовый корпус.

«Преобразование PDF-документа в текстовый корпус» - одна из самых трудных и распространенных задач, которые я выполняю для предварительной обработки текста НЛП.

#in file_to_text.py
--------------------------------------------
def PDF_to_text(pathfilename: str) -> str:
    """
    Chane PDF format to text.
    Args:
        pathfilename:

    Returns:

    """

    fp = file_or_url(pathfilename)
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos = set()

    for page in PDFPage.get_pages(
        fp,
        pagenos,
        maxpages=maxpages,
        password=password,
        caching=caching,
        check_extractable=True,
    ):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()

    return text
-------------------------------------------------------
arvix_list =['https://arxiv.org/pdf/2008.05828v1.pdf'
             , 'https://arxiv.org/pdf/2008.05981v1.pdf'
             , 'https://arxiv.org/pdf/2008.06043v1.pdf'
             , 'tmp/inf_finite_NN.pdf' ]
for n, f in enumerate(arvix_list):
    %time pdf_text = PDF_to_text(f).replace('\n', ' ')
    print('{}: size: {:g} \n {} \n'.format(n, len(pdf_text) ,pdf_text[:text_l])))

output = ›

CPU times: user 1.89 s, sys: 8.88 ms, total: 1.9 s
Wall time: 2.53 s
0: size: 42522 
 On the Importance of Local Information in Transformer Based Models  Madhura Pande, Aakriti Budhraja, Preksha Nema  Pratyush Kumar, Mitesh M. Khapra  Department of Computer Science and Engineering  Robert Bosch Centre for Data Science and AI (RBC-DSAI)  Indian Institute of Technology Madras, Chennai, India  {mpande,abudhra,preksha,pratyush,miteshk}@ 

CPU times: user 1.65 s, sys: 8.04 ms, total: 1.66 s
Wall time: 2.33 s
1: size: 30586 
 ANAND,WANG,LOOG,VANGEMERT:BLACKMAGICINDEEPLEARNING1BlackMagicinDeepLearning:HowHumanSkillImpactsNetworkTrainingKanavAnand1anandkanav92@[email protected]@tudelft.nlJanvanGemert1j.c.vangemert@tudelft.nl1DelftUniversityofTechnology,Delft,TheNetherlands2UniversityofCopenhagenCopenhagen,DenmarkAbstractHowdoesauser’sp 

CPU times: user 4.82 s, sys: 46.3 ms, total: 4.87 s
Wall time: 6.53 s
2: size: 57204 
 0 2 0 2     g u A 3 1         ]  G L . s c [      1 v 3 4 0 6 0  .  8 0 0 2 : v i X r a  Offline Meta-Reinforcement Learning with  Advantage Weighting  Eric Mitchell1, Rafael Rafailov1, Xue Bin Peng2, Sergey Levine2, Chelsea Finn1  1 Stanford University, 2 UC Berkeley  [email protected]  Abstract  Massive datasets have proven critical to successfully 

CPU times: user 12.2 s, sys: 36.1 ms, total: 12.3 s
Wall time: 12.3 s
3: size: 89633 
 0 2 0 2    l u J    1 3      ]  G L . s c [      1 v 1 0 8 5 1  .  7 0 0 2 : v i X r a  Finite Versus Infinite Neural Networks:  an Empirical Study  Jaehoon Lee  Samuel S. Schoenholz∗  Jeffrey Pennington∗  Ben Adlam†∗  Lechao Xiao∗  Roman Novak∗  Jascha Sohl-Dickstein  {jaehlee, schsam, jpennin, adlam, xlc, romann, jaschasd}@google.com  Google Brain

В этой конфигурации оборудования «Преобразование файла PDF в строку Python» требует 150 секунд на миллион символов. Недостаточно быстро для рабочего приложения с веб-взаимодействием.

Возможно, вы захотите выполнить форматирование в фоновом режиме.

4. Сегментируйте непрерывный текст в корпус словесного текста.

Когда мы прочитали https://arxiv.org/pdf/2008.05981v1.pdf, он вернулся как сплошной текст без разделительного символа. Используя пакет из wordsegment, мы разделяем непрерывную строку на слова.

from wordsegment import load,  clean, segment
%time words = segment(pdf_text)
print('size: {:g} \n'.format(len(words)))
' '.join(words)[:text_l*4]

output = ›

CPU times: user 1min 43s, sys: 1.31 s, total: 1min 44s
Wall time: 1min 44s
size: 5005
'an and wang loog van gemert blackmagic in deep learning 1 blackmagic in deep learning how human skill impacts network training kanavanand1anandkanav92g mailcom ziqiwang1zwang8tudelftnl marco loog12mloogtudelftnl jan van gemert 1jcvangemerttudelftnl1 delft university of technology delft the netherlands 2 university of copenhagen copenhagen denmark abstract how does a users prior experience with deep learning impact accuracy we present an initial study based on 31 participants with different levels of experience their task is to perform hyper parameter optimization for a given deep learning architecture the results show a strong positive correlation between the participants experience and then al performance they additionally indicate that an experienced participant nds better solutions using fewer resources on average the data suggests furthermore that participants with no prior experience follow random strategies in their pursuit of optimal hyperparameters our study investigates the subjective human factor in comparisons of state of the art results and scientic reproducibility in deep learning 1 introduction the popularity of deep learning in various elds such as image recognition 919speech1130 bioinformatics 2124questionanswering3 etc stems from the seemingly favorable tradeoff between the recognition accuracy and their optimization burden lecunetal20 attribute their success t'

Вы заметите, что wordsegment выполняет довольно точное разделение на слова. Есть некоторые ошибки или слова, которые мы не хотим, чтобы текст НЛП был удален при предварительной обработке.

wordsegment Apache работает медленно. Этого недостаточно для работы с небольшими документами объемом менее 1 тысячи слов. Можем ли мы найти более быстрый способ сегментирования?

4b. Сегментируйте непрерывный текст в корпус текста слова

Кажется, есть более быстрый способ сегментировать непрерывный текст в корпусе словесного текста.

Как обсуждается в следующем блоге:



SymSpell в 100–1000 раз быстрее. Ух ты!

Примечание: изд: 24.08.2020 Вольф Гарбе заслуживает похвалы за указание

Результаты тестов (в 100–1000 раз быстрее), приведенные в сообщении блога SymSpell, относятся исключительно к исправлению орфографии, а не к сегментации слов. В этом посте SymSpell сравнивался с другими алгоритмами исправления орфографии, а не с алгоритмами сегментации слов. - Вулф Гарбе, 23 августа 2020 г.

а также

Кроме того, есть более простой способ вызвать библиотеку C # из Python: https://stackoverflow.com/questions/7367976/calling-a-c-sharp-library-from-python - Вулф Гарбе 23.08.2020

Примечание: изд: 24.08.2020. Я собираюсь попробовать реализацию Garbe на C ##. Если я не получу тех же результатов (и, вероятно, если получу), я попробую порт cython и посмотрю, смогу ли я вписаться в spacy в качестве элемента конвейера. Я сообщу вам свои результаты.

Однако это реализовано на C #. Поскольку я не собираюсь спускаться по бесконечным убежищам:

  • Преобразуйте все мои NLP в C #. Не вариант.
  • Вызов C # из Python. Я поговорил с двумя менеджерами инженеров группы Python. У них есть возможности Python-C #, но они включают:

Примечание:

  1. Перевод на VB -ванильный;
  2. Ручное вмешательство и перевод должны пройти тесты на воспроизводимость;
  3. Перевод с VB -ванильного на C;
  4. Ручное вмешательство и перевод должны пройти тесты на воспроизводимость.

Вместо этого мы работаем с портом на Python. Вот версия:

def segment_into_words(input_term):
    # maximum edit distance per dictionary precalculation
    max_edit_distance_dictionary = 0
    prefix_length = 7
    # create object
    sym_spell = SymSpell(max_edit_distance_dictionary, prefix_length)
    # load dictionary
    dictionary_path = pkg_resources.resource_filename(
        "symspellpy", "frequency_dictionary_en_82_765.txt")
    bigram_path = pkg_resources.resource_filename(
        "symspellpy", "frequency_bigramdictionary_en_243_342.txt")
    # term_index is the column of the term and count_index is the
    # column of the term frequency
    if not sym_spell.load_dictionary(dictionary_path, term_index=0,
                                     count_index=1):
        print("Dictionary file not found")
        return
    if not sym_spell.load_bigram_dictionary(dictionary_path, term_index=0,
                                            count_index=2):
        print("Bigram dictionary file not found")
        return
result = sym_spell.word_segmentation(input_term)
    return result.corrected_string
%time long_s = segment_into_words(pdf_text)
print('size: {:g} {}'.format(len(long_s),long_s[:text_l*4]))

output = ›

CPU times: user 20.4 s, sys: 59.9 ms, total: 20.4 s
Wall time: 20.4 s
size: 36585 ANAND,WANG,LOOG,VANGEMER T:BLACKMAGICINDEEPLEARNING1B lack MagicinDeepL earning :HowHu man S kill Imp acts Net work T raining Ka nav An and 1 an and kana v92@g mail . com ZiqiWang1z. wang -8@tu delft .nlM arc oLoog12M.Loog@tu delft .nlJ an van Gemert1j.c. vang emert@tu delft .nl1D elf tUniversityofTechn ology ,D elf t,TheN ether lands 2UniversityofC open hagen C open hagen ,Den mark Abs tract How does a user ’s prior experience with deep learning impact accuracy ?We present an initial study based on 31 participants with different levels of experience .T heir task is to perform hyper parameter optimization for a given deep learning architecture .T here -s ult s show a strong positive correlation between the participant ’s experience and the fin al performance .T hey additionally indicate that an experienced participant finds better sol u-t ions using fewer resources on average .T he data suggests furthermore that participants with no prior experience follow random strategies in their pursuit of optimal hyper pa-ra meters .Our study investigates the subjective human factor in comparisons of state of the art results and sci entific reproducibility in deep learning .1Intro duct ion T he popularity of deep learning in various fi eld s such as image recognition [9,19], speech [11,30], bio informatics [21,24], question answering [3] etc . stems from the seemingly fav or able trade - off b

SymSpellpy примерно в 5 раз быстрее реализован в Python. Мы не видим в 100–1000 раз быстрее.

Я предполагаю, что SymSpell-C # сравнивается с различными алгоритмами сегментации, реализованными в Python.

Возможно, мы видим ускорение благодаря C #, скомпилированному языку со статической типизацией. Поскольку C # и C имеют примерно одинаковую скорость вычислений, следует ожидать ускорения C # в 100-1000 раз быстрее, чем Python реализация.

Примечание. Существует просторная реализация конвейера spacy_symspell, которая напрямую вызывает SymSpellpy. Я рекомендую вам не использовать spacy_symspell. Spacy сначала генерирует токены в качестве первого шага конвейера, который является неизменным. spacy_symspell создает новый текст на основе сегментации непрерывного текста. Он не может генерировать новые токены в spacy as spacy уже сгенерированных токенах . Конвейер. spacy работает с последовательностью токенов, а не с потоком текста . Придется создать измененную версию spacy. Зачем беспокоиться? Вместо этого , сегментируйте непрерывный текст в Корпус словесного текста. Затем исправьте текст, содержащий пробелы в слове и слова с дефисом в тексте. Сделайте любую другую чистку, которую захотите. Затем передайте необработанный текст в spacy.

Я показываю spacy_symspell. Я снова советую не его использовать.

import spacy
from spacy_symspell import SpellingCorrector

def segment_into_words(input_term):
nlp = spacy.load(“en_core_web_lg”, disable=[“tagger”, “parser”])
corrector = SpellingCorrector()
nlp.add_pipe(corrector)

Заключение

В будущих блогах я подробно расскажу о многих распространенных и необычных методах быстрой предварительной обработки текста. Кроме того, я покажу ожидаемое ускорение при переходе от SymSpellpy к cython.

В мире «преобразования формата X в текстовый корпус» вам потребуется поддерживать множество других форматов и API.

Я подробно рассказал о двух наиболее распространенных форматах документов: PDF и Gutenberg Project. Кроме того, я дал две служебные функции NLP segment_into_words и file_or_url.

Надеюсь, вы кое-что узнали и можете использовать часть кода из этого блога.

Если у вас есть какие-то преобразования формата или еще лучше их пакет, дайте мне знать.

использованная литература

[1] Сколько данных мы создаем каждый день?

[2] https://en.wikipedia.org/wiki/PDF

[3] Сегментирование последовательности ДНК на« слова »