【问题标题】:Textacy unable to create corpus from a textacy.doc.Doc classTextacy 无法从 textacy.doc.Doc 类创建语料库
【发布时间】:2018-05-25 03:23:20
【问题描述】:

我只是在考虑使用数据集模块之外的数据的文本教程。我从数据框中获取了一些文本数据,并将其存储为字符串变量以供工作。

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

所以我应该能够按照文档所述从这个 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'>

我还尝试将文本参数用于语料库,将原始文本传递给它,但这会输出

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')]

因此,每个文本的文本都存储在“文本”列下,如有必要,每个文本都可以通过扬声器列绑定到扬声器。

目前我正在查看capitol words 示例,但尚不完全清楚如何使用数据框进行拆分。

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

【问题讨论】:

    标签: python-3.x pandas corpus spacy textacy


    【解决方案1】:

    docs 参数需要一个可迭代对象,并且该可迭代对象的项是各种 Doc 类型。您正在传递一个文档,该文档在迭代时返回 Tokens - 因此出现错误。您可以将doc=doc1 参数包装为doc=[doc1],这样您就可以创建语料库了。

    虽然这是一个包含单个文档的语料库 - 这不太可能非常有用。您的意思是为 DataFrame 的每一行创建一个 Doc,而不是连接在一起?

    编辑:处理 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
    

    所以这里的步骤是:

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

    【讨论】:

    • 好吧,我正在处理多行线程中的句子,是的。所以我假设我需要像这里的示例一样使用capital words 相应地拆分数据
    • 那么数据框中的行代表什么?每个是来自线程的句子还是每个线程的帖子?
    • 每一行都有一个“文本”列的对话。
    • 我添加了一个关于如何获取样本数据帧并将其转换为语料库的编辑 - 如果这是您需要的,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2016-03-17
    • 2011-05-15
    相关资源
    最近更新 更多