NER с использованием spaCy и трансформаторов — другой результат при работе внутри и вне цикла

#python #spacy #huggingface-transformers #named-entity-recognition

Вопрос:

Я использую NER (spacy amp; 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')