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

时间:2017-04-17 12:52:48

标签: python pandas numpy nltk spacy

我是spaCy和NLTK的新手,所以如果这似乎是一个愚蠢的问题,我会事先道歉。

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

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

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

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

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

给出一个像这样的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中使用pipe

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

答案 1 :(得分:1)

我认为亚历克西斯使用pandas .apply()的评论是最好的答案,这对我来说非常有用:

import spacy 

df = pd.read_csv('doc filename.txt')
df['text_as_spacy_objects'] = df['text column name'].apply(nlp)

答案 2 :(得分:0)

这应该非常简单 - 您可以使用任何想要从数据库中读取文本的方法(Pandas数据框,CSV读取器等),然后迭代它们。

最终取决于您想要做什么以及如何处理文本 - 如果您想单独处理每个文本,只需逐行遍历数据:

for id, line in text:
    doc = nlp(line)
    # do something with each text

或者,您也可以将文本加入一个字符串并将其作为一个文档处理:

text = open('some_large_text_file.txt').read()
doc = nlp(text)

有关更高级的使用示例,请参阅使用pipe()的{​​{3}}。