Python 3.x Textacy无法从Textacy.doc.doc类创建语料库

Python 3.x Textacy无法从Textacy.doc.doc类创建语料库,python-3.x,pandas,corpus,spacy,textacy,Python 3.x,Pandas,Corpus,Spacy,Textacy,我只是在用数据集模块之外的数据编写文本教程。我从一个数据框中获取一些文本数据,并将其存储为一个字符串变量用于工作 def mergeText(df): content = '' for i in df['textColumn']: content += (i + '. ' ) #print(content) return content txt = mergeText(df) 我曾经使用过spacy,我知道这是创建文档对象的标准方法

我只是在用数据集模块之外的数据编写文本教程。我从一个数据框中获取一些文本数据,并将其存储为一个字符串变量用于工作

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


     txt = mergeText(df)
我曾经使用过spacy,我知道这是创建文档对象的标准方法

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'>"
有没有办法解决这个问题

编辑 为了从多行中获取文档并将其传递给语料库,我正在使用一个线程的数据框架

 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

docs
参数需要一个iterable,iterable的项应该是各种
Doc
类型。您传递的是单个文档,当迭代时返回
标记
——因此出现错误。您可以将
doc=doc1
参数包装为
doc=[doc1]
,这样您就可以创建语料库了

不过,这是一个包含单个文档的语料库,不太可能非常有用。您的意思是为数据帧的每一行创建一个文档,而不是连接在一起吗

编辑:处理数据帧

如果您希望每个聊天都是一个文档,其中一个方法是通过chat_散列将数据框分组,并将所有文本合并在一起。然后为每个聊天创建一个文档和语料库:

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
因此,其中的步骤是:

  • 加载模型(在这种情况下创建虚拟数据帧)
  • 按散列和一些序列排序(以便按正确的顺序聊天),然后按聊天散列分组并将所有文本连接在一起(我在文本之间使用新行,可以使用任何分隔符)
  • 对每个文本块应用一个函数,从中创建一个文档
  • 像以前一样创建语料库

我处理的是多行线程中的句子是的。因此,我假设我需要相应地拆分数据,与此示例类似,数据帧中的行代表什么?每一行是来自线程的句子还是来自线程的帖子?每一行都有“文本”列的对话。我为h添加了编辑现在,你可以拿一个样本数据帧并转换成一个语料库-让我知道你是否需要这样的东西。
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
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