Pandas 将标记化空间结果导出到Excel或SQL表中

Pandas 将标记化空间结果导出到Excel或SQL表中,pandas,xlsxwriter,spacy,Pandas,Xlsxwriter,Spacy,我正在使用SpaCy和Pandas将词性(POS)标记的句子导出到excel。代码如下: import spacy import xlsxwriter import pandas as pd nlp = spacy.load('en_core_web_sm') text ="""He is a good boy.""" doc = nlp(text) for token in doc: x=[token.text, token.lemma_, token.pos_, token.tag_

我正在使用
SpaCy
Pandas
将词性(POS)标记的句子导出到excel。代码如下:

import spacy
import xlsxwriter
import pandas as pd
nlp = spacy.load('en_core_web_sm')
text ="""He is a good boy."""
doc = nlp(text)
for token in doc:
    x=[token.text, token.lemma_, token.pos_, token.tag_,token.dep_,token.shape_, token.is_alpha, token.is_stop]
    print(x)
当我
打印(x)
时,我得到以下信息:

['He', '-PRON-', 'PRON', 'PRP', 'nsubj', 'Xx', True, False]
['is', 'be', 'VERB', 'VBZ', 'ROOT', 'xx', True, True]
['a', 'a', 'DET', 'DT', 'det', 'x', True, True]
['good', 'good', 'ADJ', 'JJ', 'amod', 'xxxx', True, False]
['boy', 'boy', 'NOUN', 'NN', 'attr', 'xxx', True, False]
['.', '.', 'PUNCT', '.', 'punct', '.', False, False]
在令牌循环中,我添加了数据帧,如下所示: 对于文档中的令牌:

for token in doc:
    x=[token.text, token.lemma_, token.pos_, token.tag_,token.dep_,token.shape_, token.is_alpha, token.is_stop]
    df=pd.Dataframe(x)
    print(df)
现在,我统计得到以下格式:

  0
0      He
1  -PRON-
2    PRON
3     PRP
4   nsubj
5      Xx
6    True
7   False   
........
........
但是,当我尝试使用
Pandas
作为以下代码将输出(df)导出到excel时,它只在列中显示x的最后一次迭代

df=pd.DataFrame(x)
writer = pd.ExcelWriter('pandas_simple.xlsx', engine='xlsxwriter')
df.to_excel(writer,sheet_name='Sheet1')
输出(在Excel表格中):

在这个场景中,我如何让所有迭代一个接一个地出现在新列中,如下所示

 0     He      is   ….
1    -PRON-    be   ….
2     PRON    VERB  ….
3     PRP      VBZ  ….
4    nsubj     ROOT ….
5      Xx      xx   ….
6    True     True  ….
7    False   True   ….

如果您还没有您的版本:

import pandas as pd

rows =[
    ['He', '-PRON-', 'PRON', 'PRP', 'nsubj', 'Xx', True, False],
    ['is', 'be', 'VERB', 'VBZ', 'ROOT', 'xx', True, True],
    ['a', 'a', 'DET', 'DT', 'det', 'x', True, True],
    ['good', 'good', 'ADJ', 'JJ', 'amod', 'xxxx', True, False],
    ['boy', 'boy', 'NOUN', 'NN', 'attr', 'xxx', True, False],
    ['.', '.', 'PUNCT', '.', 'punct', '.', False, False],
    ]

headers = ['text', 'lemma', 'pos', 'tag', 'dep', 
           'shape', 'is_alpha', 'is_stop']

# example 1: list of lists of dicts
#following  https://stackoverflow.com/a/28058264/1758363
d = []
for row in rows:
    dict_ = {k:v for k, v in zip(headers, row)}
    d.append(dict_)
df = pd.DataFrame(d)[headers] 

# example 2: appending dicts 
df2 = pd.DataFrame(columns=headers)
for row in rows:
    dict_ = {k:v for k, v in zip(headers, row)}
    df2 = df2.append(dict_, ignore_index=True)

#example 3: lists of dicts created with map() function
def as_dict(row):
    return {k:v for k, v in zip(headers, row)}

df3 = pd.DataFrame(list(map(as_dict, rows)))[headers]     

def is_equal(df_a, df_b):
    """Substitute for pd.DataFrame.equals()"""
    return (df_a == df_b).all().all()

assert is_equal(df, df2)
assert is_equal(df2, df3)
一些较短的代码:

import spacy
import pandas as pd
nlp = spacy.load('en_core_web_sm')
text ="""He is a good boy."""
param = [[token.text, token.lemma_, token.pos_, 
          token.tag_,token.dep_,token.shape_, 
          token.is_alpha, token.is_stop] for token in nlp(text)]
df=pd.DataFrame(param)
headers = ['text', 'lemma', 'pos', 'tag', 'dep', 
           'shape', 'is_alpha', 'is_stop']
df.columns = headers  

数据帧的转置更有意义。使用df.append()按行添加@EvgenyPogrebnyak,如何?你能告诉我如何使用df.append更改它吗?试着通过,没有什么大的困难,如果不成功请回信。由于缺少编译器,我在安装SpaCy时遇到问题,因此无法为您提供快速准备的代码。谢谢@Evengy。我将尝试这段代码,看看它如何适合这个场景。顺便说一句,在完成这项工作后,我最终使用了一个替代库(CSV库)将输出作为字典导入,它可以工作,但我的输出是CSV而不是excel,因此我必须经历从CSV到excel的第二轮转换。我确实觉得Pandas DataFrame在某种程度上与SpaCy提供的不完全兼容,因为在几行内通过CSV进行操作相对容易。您可以使用
CSV
如果您对它更熟悉,它只是没有出现在您的问题中您想保存/保存数据,而是关于
Pandas
的使用。希望您对转换想法不是完全不满意-SpaCy没有任何特殊类型的输出,只是名称为Tuples I guees。在任何情况下,都要不惜一切代价避免将Excel作为格式来保存中间数据,并确保单词是成行的,而不是成列的。@Evengy,只是对代码的快速反馈。当数据(行)是一个统计数组时,这三种方法都能很好地工作。然而,一旦它被SpaCy称为“令牌”,就会出现各种错误。我觉得SPaCY的NLP参数处理循环的方式不适合熊猫数据框架。使用CSV(CSV.DicWriter)这样的基本库,只需几行就可以完成这项工作,这样就可以将其进一步扩展到Excel。无论如何,谢谢你的投入,如果你有任何其他意见,请分享你的想法。很高兴你为你的项目整理好了它!如何在windows上编译SpaCy以进行安装?是否有测试编译器的命令?我安装了Visual Studio,但
pip install spacy
在我身上停止,出现
错误:命令'cl.exe'失败:没有此类文件或目录
错误。请在Conda环境(Anaconda)下尝试。我认为Spacy有自己的需求,最好是单独安装(从根Python)。谢谢。刚得到
ValueError:长度不匹配:预期轴有6个元素,新值有8个元素
。因此,我尝试了
df
而不使用
.transpose()
,它可以完美地工作并符合目的。(正如您所提到的,将文本片段按行编辑比按列编辑更好)不使用
.transpose()
,这确实是一个错误。
import spacy
import pandas as pd
nlp = spacy.load('en_core_web_sm')
text ="""He is a good boy."""
param = [[token.text, token.lemma_, token.pos_, 
          token.tag_,token.dep_,token.shape_, 
          token.is_alpha, token.is_stop] for token in nlp(text)]
df=pd.DataFrame(param)
headers = ['text', 'lemma', 'pos', 'tag', 'dep', 
           'shape', 'is_alpha', 'is_stop']
df.columns = headers