Textacy无法从extacy.doc.Doc类创建语料库
问题描述
我只是通过文本教程使用DataSet模块之外的数据进行工作。我从DataFrame获得一些文本数据,并将其存储为字符串变量以供工作。
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'>"
我曾尝试用同样的方法创建一个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')]
因此,每个文本的文本存储在‘Text’列下,如果需要,可以通过Speaker列将每个文本绑定到扬声器。
目前,我正在研究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
解决方案
docs
参数应为可迭代对象,且可迭代对象的项应为各种Doc
类型。您传递的是单个文档,迭代该文档时返回Tokens
--因此出现错误。您可以将doc=doc1
参数包装为doc=[doc1]
,这应该允许您创建语料库。
编辑:处理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: '
'.join(col)))
docs = list(chat_concat.apply(lambda x: nlp(x)))
corpus = textacy.corpus.Corpus(nlp, docs=docs)
corpus
所以这里的步骤是:
- 加载模型(在本例中创建虚拟数据帧)
- 按散列和一些顺序排序(以便按正确的顺序聊天),然后按聊天散列分组并将所有文本连接在一起(我在文本之间使用新行,可以使用任何分隔符
- 将函数应用于每个文本块以从中创建文档
- 如前所述创建语料库。
相关文章