Textacy не может создать корпус из класса textacy.doc.Doc

Я просто работаю, думал текстовые учебники с данными за пределами модуля наборов данных для работы. Я получаю некоторые текстовые данные из фрейма данных и храню их как строковую переменную для работы.

def mergeText(df):
    content = ''
    for i in df['textColumn']:
        content += (i + '. ' )
    #print(content)
    return content


     txt = mergeText(df)

Я немного поработал с spacy и знаю, что это стандартный способ создания объекта doc

nlp = spacy.load('en')
doc1 = nlp(txt)
print(type(doc1))

какие выводы

class 'spacy.tokens.doc.Doc

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

corpus = textacy.corpus.Corpus('en', docs=doc1)

Но я получаю эту ошибку, хотя я передаю правильный тип функции

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-c6f568014162> in <module>()
----> 1 corpus = textacy.corpus.Corpus('en', docs=doc1, metadatas=None)

~/anaconda3/envs/nlp/lib/python3.6/site-packages/textacy/corpus.py in __init__(self, lang, texts, docs, metadatas)
    156             else:
    157                 for doc in docs:
--> 158                     self.add_doc(doc)
    159 
    160     def __repr__(self):

~/anaconda3/envs/nlp/lib/python3.6/site-packages/textacy/corpus.py in add_doc(self, doc, metadata)
    337             msg = '`doc` must be {}, not "{}"'.format(
    338                 {Doc, SpacyDoc}, type(doc))
--> 339             raise ValueError(msg)
    340 
    341     #################

ValueError: `doc` must be {<class 'textacy.doc.Doc'>, <class 'spacy.tokens.doc.Doc'>}, not "<class 'spacy.tokens.token.Token'>"

Я пытался создать объект textacy таким же образом, но безуспешно

doc = textacy.Doc(txt)
print(type(doc))

<class 'spacy.tokens.doc.Doc'>

Я также пытался использовать параметр text для корпуса, передавая ему необработанный текст, но это выводит

corpus[:10]

[Doc(1 tokens; "D"),
 Doc(1 tokens; "e"),
 Doc(1 tokens; "a"),
 Doc(1 tokens; "r"),
 Doc(1 tokens; " "),
 Doc(1 tokens; "C"),
 Doc(1 tokens; "h"),
 Doc(1 tokens; "r"),
 Doc(1 tokens; "i"),
 Doc(1 tokens; "s")]

Любые идеи о том, как это исправить?

РЕДАКТИРОВАТЬ Для того, чтобы получить документы из множества строк и передать это в корпус вот кадр данных, с которыми я работаю для потока

 chat1 = df[(df['chat_hash']=='121418-456986')]

Таким образом, текст для каждого текста хранится в столбце "текст", и каждый из них может быть привязан к говорящему при необходимости через колонку говорящего.

В настоящее время я смотрю на пример слов столицы, но не совсем понятно, как разделить это, используя фрейм данных.

records = cw.records(speaker_name={'Hillary Clinton', 'Barack Obama'})
text_stream, metadata_stream = textacy.fileio.split_record_fields(records, 'text')
corpus = textacy.Corpus('en', texts=text_stream, metadatas=metadata_stream)
corpus

Будет ли в этом случае настройка записей быть фильтром для хэша чата?

thread = df[(df['chat_hash']=='121418-456986')]
text_stream, metadata_stream = textacy.fileio.split_record_fields(thread, 'text')
corpus = textacy.Corpus('en', texts=text_stream, metadatas=metadata_stream)
corpus

1 ответ

docs параметр ожидает итерируемый, а элементы итерируемого имеют различные Doc типы. Вы передаете один документ, который при повторении возвращает Tokens - отсюда и ошибка. Вы можете обернуть doc=doc1 параметр, который будет doc=[doc1] и это должно позволить вам создать корпус.

Это, однако, корпус, содержащий один документ - что вряд ли очень полезно. Вы хотите создать документ для каждой строки вашего DataFrame, а не объединять их вместе?

РЕДАКТИРОВАТЬ: Работа с DataFrame

Если вы хотите, чтобы каждый чат был документом, вам нужно сгруппировать фрейм данных по chat_hash и объединить весь текст вместе. Затем создайте документ для каждого чата и корпус для этого:

import pandas as pd
import spacy
import textacy

nlp = spacy.load('en')

df = pd.DataFrame([['Ken', 'aaaa', 1, 'This is a thing I said'],
                  ['Peachy', 'aaaa', 2, 'This was a response'],
                  ['Ken', 'aaaa', 3, 'I agree!'],
                  ['Ken', 'bbbb', 1, 'This is a thing I said'],
                  ['Peachy', 'bbbb', 2, 'You fool!']], columns=['speaker', 'chat_hash', 'sequence_number', 'text'])

chat_concat = (df
               .sort_values(['chat_hash', 
                             'sequence_number'])
               .groupby('chat_hash')['text']
               .agg(lambda col: '\n'.join(col)))

docs = list(chat_concat.apply(lambda x: nlp(x)))

corpus = textacy.corpus.Corpus(nlp, docs=docs)

corpus

Итак, шаги в этом:

  • Загрузите модель (и создайте фиктивный фрейм данных в этом случае)
  • Сортировка по хешу и некоторой последовательности (так что чат в правильном порядке), затем группировка по хэшу чата и объединение всего текста (я использую новые строки между текстом, можно использовать любой разделитель)
  • Примените функцию к каждому блоку текста, чтобы создать из него документ
  • Создайте корпус как прежде.
Другие вопросы по тегам