Skip to main content
 首页 » 编程设计

python之将 csv 文件中的列加载到 spaCy

2025年05月04日26pander-it

作为一个整体,我是 spaCy 和 NLTK 的新手,所以如果这看起来是一个愚蠢的问题,我提前道歉。

根据 spaCy 教程,我必须使用以下命令将文本加载到文档中。

doc = nlp(u'Hello, world. Natural Language Processing in 10 lines of code.') 

但是,我有很多文本以表格格式存储在 sql server 或 excel 上。它基本上有两列。第一列有一个唯一标识符。第二列有一个简短的文本。

如何将它们加载到 spaCy 中?我是否需要将它们转换为 Numpy 数组或 Pandas 数据框,然后将其加载到文档中?

预先感谢您的帮助!

请您参考如下方法:

给定一个这样的 csv 文件:

$ cat test.tsv 
DocID   Text    WhateverAnnotations 
1   Foo bar bar dot dot dot 
2   bar bar black sheep dot dot dot dot 
 
$ cut -f2 test.tsv 
Text 
Foo bar bar 
bar bar black sheep 

在代码中:

$ python 
>>> import pandas as pd 
>>> pd.read_csv('test.tsv', delimiter='\t') 
   DocID                 Text WhateverAnnotations 
0      1          Foo bar bar         dot dot dot 
1      2  bar bar black sheep     dot dot dot dot 
>>> df = pd.read_csv('test.tsv', delimiter='\t') 
>>> df['Text'] 
0            Foo bar bar 
1    bar bar black sheep 
Name: Text, dtype: object 

在 spacy 中使用管道:

>>> import spacy 
>>> nlp = spacy.load('en') 
>>> for parsed_doc in nlp.pipe(iter(df['Text']), batch_size=1, n_threads=4): 
...     print (parsed_doc[0].text, parsed_doc[0].tag_) 
...  
Foo NNP 
bar NN 

要使用 pandas.DataFrame.apply():

>>> df['Parsed'] = df['Text'].apply(nlp) 
 
>>> df['Parsed'].iloc[0] 
Foo bar bar 
>>> type(df['Parsed'].iloc[0]) 
<class 'spacy.tokens.doc.Doc'> 
>>> df['Parsed'].iloc[0][0].tag_ 
'NNP' 
>>> df['Parsed'].iloc[0][0].text 
'Foo' 

基准测试。

首先将行复制 200 万次:

$ cat test.tsv  
DocID   Text    WhateverAnnotations 
1   Foo bar bar dot dot dot 
2   bar bar black sheep dot dot dot dot 
 
$ tail -n 2 test.tsv > rows2 
 
$ perl -ne 'print "$_" x1000000' rows2 > rows2000000 
 
$ cat test.tsv rows2000000 > test-2M.tsv 
 
$ wc -l test-2M.tsv  
 2000003 test-2M.tsv 
 
$ head test-2M.tsv  
DocID   Text    WhateverAnnotations 
1   Foo bar bar dot dot dot 
2   bar bar black sheep dot dot dot dot 
1   Foo bar bar dot dot dot 
1   Foo bar bar dot dot dot 
1   Foo bar bar dot dot dot 
1   Foo bar bar dot dot dot 
1   Foo bar bar dot dot dot 
1   Foo bar bar dot dot dot 
1   Foo bar bar dot dot dot 

[nlppipe.py]:

import time 
 
import pandas as pd 
import spacy 
 
 
df = pd.read_csv('test-2M.tsv', delimiter='\t') 
nlp = spacy.load('en') 
 
start = time.time() 
for parsed_doc in nlp.pipe(iter(df['Text']), batch_size=1000, n_threads=4): 
    x = parsed_doc[0].tag_ 
print (time.time() - start) 

[dfapply.py]:

import time 
 
import pandas as pd 
import spacy 
 
 
df = pd.read_csv('test-2M.tsv', delimiter='\t') 
nlp = spacy.load('en') 
 
start = time.time() 
df['Parsed'] = df['Text'].apply(nlp) 
 
for doc in df['Parsed']: 
    x = doc[0].tag_ 
print (time.time() - start)