Введение
В настоящее время я пытаюсь использовать dask совместно с gensim для вычисления документов NLP, и у меня возникает проблема при преобразовании моего корпуса в " TaggedDocument ".
Поскольку я пробовал так много разных способов решить эту проблему, я перечислю свои попытки.
Каждая попытка решить эту проблему встречается со своими проблемами.
Сначала начальные данные.
Данные
df.info()
<class 'dask.dataframe.core.DataFrame'>
Columns: 5 entries, claim_no to litigation
dtypes: object(2), int64(3)
claim_no claim_txt I CL ICC lit
0 8697278-17 battery comprising interior battery active ele... 106 2 0
Желаемый выход
>>tagged_document[0]
>>TaggedDocument(words=['battery', 'comprising', 'interior', 'battery', 'active', 'elements', 'battery', 'cell', 'casing', 'said', 'cell', 'casing', 'comprising', 'first', 'casing', 'element', 'first', 'contact', 'surface', 'second', 'casing', 'element', 'second', 'contact', 'surface', 'wherein', 'assembled', 'position', 'first', 'second', 'contact', 'surfaces', 'contact', 'first', 'second', 'casing', 'elements', 'encase', 'active', 'materials', 'battery', 'cell', 'interior', 'space', 'wherein', 'least', 'one', 'gas', 'tight', 'seal', 'layer', 'arranged', 'first', 'second', 'contact', 'surfaces', 'seal', 'interior', 'space', 'characterized', 'one', 'first', 'second', 'contact', 'surfaces', 'comprises', 'electrically', 'insulating', 'void', 'volume', 'layer', 'first', 'second', 'contact', 'surfaces', 'comprises', 'formable', 'material', 'layer', 'fills', 'voids', 'surface', 'void', 'volume', 'layer', 'hermetically', 'assembled', 'position', 'form', 'seal', 'layer'], tags=['8697278-17'])
>>len(tagged_document) == len(df['claim_txt'])
Ошибка № 1 Генераторы не разрешены
def read_corpus_tag_sub(df,corp='claim_txt',tags=['claim_no']):
for i, line in enumerate(df[corp]):
yield gensim.models.doc2vec.TaggedDocument(gensim.utils.simple_preprocess(line), (list(df.loc[i,tags].values)))
tagged_document = df.map_partitions(read_corpus_tag_sub,meta=TaggedDocument)
tagged_document = tagged_document.compute()
TypeError: Не удалось сериализовать объект генератора типов.
Я не нашел способа обойти это, все еще используя генератор. Исправление для этого было бы здорово! Как это прекрасно работает для обычных панд.
Ошибка № 2 Только первый элемент каждого раздела
def read_corpus_tag_sub(df,corp='claim_txt',tags=['claim_no']):
for i, line in enumerate(df[corp]):
return gensim.models.doc2vec.TaggedDocument(gensim.utils.simple_preprocess(line), (list(df.loc[i,tags].values)))
tagged_document = df.map_partitions(read_corpus_tag_sub,meta=TaggedDocument)
tagged_document = tagged_document.compute()
Это немного глупо, так как функция не выполняет итерацию (я знаю), но дает желаемый формат, а возвращает только первую строку в каждом разделе.
Ошибка вызова функции № 3 зависает на 100% процессоре
def read_corpus_tag_sub(df,corp='claim_txt',tags=['claim_no']):
tagged_list = []
for i, line in enumerate(df[corp]):
tagged = gensim.models.doc2vec.TaggedDocument(gensim.utils.simple_preprocess(line), (list(df.loc[i,tags].values)))
tagged_list.append(tagged)
return tagged_list
Насколько я могу судить, при рефакторинге возврата вне цикла эта функция зависает, строит память в клиенте dask, и моя загрузка ЦП достигает 100%, но никакие задачи не вычисляются. Имейте в виду, я вызываю функцию так же.
Pandas Solution
def tag_corp(corp,tag):
return gensim.models.doc2vec.TaggedDocument(gensim.utils.simple_preprocess(corp), ([tag]))
tagged_document = [tag_corp(x,y) for x,y in list(zip(df_smple['claim_txt'],df_smple['claim_no']))]
Список компов У меня нет времени проверять это решение
Другое решение для панд
tagged_document = list(read_corpus_tag_sub(df))
Это решение будет длиться часами. Однако у меня недостаточно памяти, чтобы жонглировать этой штукой, когда она закончится.
Заключение (?)
Я чувствую себя супер потерянным прямо сейчас. Вот список тем, на которые я смотрел. Я признаюсь, что был действительно новичком в этом деле. Я только что провел так много времени, и я чувствую, что у меня дурацкое поручение.
- Сумка Dask от генератора
- Обработка текста с помощью Dask
- Ускорить применение панд с помощью Dask
- Каким образом вы распараллеливаете apply () на информационных панелях Pandas, используя все ядра на одном компьютере?
- Python dask DataFrame, поддержка (тривиально распараллеливаемой) строки применяется?
- Что делает map_partitions?
- пример простого dask map_partitions
- Документы