NER 使用 spaCy 和 Transformers - 在循环内部和外部运行时结果不同

Posted

技术标签:

【中文标题】NER 使用 spaCy 和 Transformers - 在循环内部和外部运行时结果不同【英文标题】:NER using spaCy & Transformers - different result when running inside and outside of a loop 【发布时间】:2021-11-26 06:07:23 【问题描述】:

我正在使用 NER (spacy & Transformer) 来查找和匿名化个人信息。我注意到直接给出输入行时得到的输出与从文件中读取输入行时得到的输出不同(参见下面的屏幕截图)。有人对如何解决这个问题有建议吗?

这是我的代码:

import pandas as pd
import csv
import spacy
from spacy import displacy
from transformers import pipeline
import re

!python -m spacy download en_core_web_trf
nlp = spacy.load('en_core_web_trf')

sent = nlp('Yesterday I went out with Andrew, johanna and Jonathan Sparow.')
displacy.render(sent, style = 'ent')

with open('Synth_dataset_raw.txt', 'r') as fd:
    reader = csv.reader(fd)
    for row in reader:
        sent = nlp(str(row))
        displacy.render(sent, style = 'ent')

【问题讨论】:

【参考方案1】:

您正在使用 csv 模块读取文件,然后尝试将文件的每一行(也称为行)转换为带有 str(row) 的字符串。

如果您的文件每行只有一个句子,那么您根本不需要 csv 模块。你可以这样做

with open('Synth_dataset_raw.txt', 'r') as fd:
    for line in fd:
        # Remove the trailing newline
        line = line.rstrip()
        sent = nlp(line)
        displacy.render(sent, style = 'ent')

如果您实际上有一个 csv(可能有多个列和一个标题),您可以这样做

open('Synth_dataset_raw.txt', 'r') as fd:
    reader = csv.reader(fd)
    header = next(reader)
    text_column_index = 0
    for row in reader:
        sent = nlp(row[text_column_index])
        displacy.render(sent, style = 'ent')

【讨论】:

以上是关于NER 使用 spaCy 和 Transformers - 在循环内部和外部运行时结果不同的主要内容,如果未能解决你的问题,请参考以下文章

使用 spaCy 3 进行自定义 NER 训练会引发 ValueError

将 NER 训练数据转换为 Spacy 训练数据格式

Spacy 2.0 NER培训

spaCy 2.0:保存并加载自定义NER模型

每次迭代后保存spacy的NER模型

使用自定义数据集训练 SpaCy NER