Как решить ошибку памяти с Spacy PhraseMatcher? - PullRequest
1 голос
/ 28 марта 2019

Highlevel Background

Я работаю над проектом, где на первом этапе я ищу ключевые слова и фразы в большом текстовом корпусе.Я хочу определить отрывки / предложения, где встречаются эти ключевые слова.Позже я хочу сделать эти отрывки доступными через мою локальную базу данных postgres, чтобы пользователь мог запрашивать информацию.Данные хранятся в хранилище BLOB-объектов Azure, и я использую Minio Server для подключения к своему приложению Django.

Фактическая проблема

Сначала моя оболочка была убита и после некоторого рефакторинга методом проб и ошибок /отладка ошибки памяти, при запуске моего скрипта, которая:

  1. сэмплов 30 (я хочу сэмплировать 10000, но она разбивается уже при малых числах) случайных текстовых документов из хранилища больших двоичных объектов,
  2. предварительно обработав необработанный текст для задачи nlp,
  3. передает текст через файл spacy nlp.pipe для получения списка документов, а
  4. передает список документов в PhraseMatcher (который передает on_match rule_id,стартовый токен предложения (с соответствием), предложения, hash_id к списку совпадений).

Сначала оболочка была убита.Я заглянул в файлы журнала и увидел, что это была ошибка памяти, но, если честно, я довольно новичок в этой теме.

После перестановки кода я получил MemoryError непосредственно внутри оболочки.На шаге language.pipe () потоковой передачи текста в spaCy.

Извлечения кода

Функции

# Function that samples filing_documents
def random_Filings(amount):
 ...
 return random_list

# Function that connects to storage and saves cleaned text
def get_clean_text(random_list):
  try:
    text_contents = S3Client().get_buffer(remote_path)
  ...
return clean_list

# matcher function that performs action on match of PhraseMatcher
def on_match(matcher, doc, id, matches):
  matcher_id, start, end = matches[id]
  rule_id = nlp.vocab.strings[match_id]
  token = doc[start]
  sent_of_token = token.sent
  match_list.append([str(rule_id), sent_of_token.start, sent_of_token, 
  doc.user_data])

def match_text_stream(clean_texts):
   some_pattern = [nlp(text) for text in ('foo', 'bar')]
   some_other_pattern = [nlp(text) for text in ('foo bar', 'barara')]

   matcher = PhraseMAtcher(nlp.vocab)

   matcher.add('SOME', on_match, *some_pattern)
   matcher.add('OTHER', on_match, *some_other_pattern)

   doc_list = []

   for doc in nlp.pipe(list_of_text, barch_size=30):
     doc_list.append(doc)

   for doc in matcher.pipi(doc_list, batch_size=30):
     pass

Задачи:

match_list = []

nlp = en_core_web_sm.load()
sample_list = random_Filings(30)
clean_texts = get_clean_text(sample_list)
match_text_stream(clean_text)

print(match_list)

Сообщение об ошибке

MemoryError
<string> in in match_text_stream(clean_text)

../spacy/language.py in pipe(self, texts, as_tubles, n thready, batch_size, disable cleanup, component_cfg)

709 origingal_strings_data = None
710 nr_seen = 0
711 for doc in docs:
712   yield doc
713   if cleanup:

...

MemoryError


../tick/neural/_classes/convolution.py in begin_update(self, X__bi, drop)

31
32 def(bedin_update(self,X__bi, drop=0.0):
33   X__bo = self.ops.seqcol(X__bi, self.nW)
34   finish_update = self._get_finsih_update()
35   return X__bo, finish_update

ops.pyx in thinc.neural.ops.NumpyOps.seq2col()
ops.pyx in thinc.neural.ops.NumpyOps.allocate()

MemoryError:

1 Ответ

0 голосов
/ 29 марта 2019

Решение состоит в том, чтобы разрезать ваши документы на мелкие кусочки перед тренировкой. Единицы параграфа работают довольно хорошо, или, возможно, разделы.

...