Python: маскировка именованных объектов в тексте электронной почты - PullRequest
1 голос
/ 22 октября 2019

Я создал скрипт Python для извлечения именованных сущностей следующим образом:

# set java path
java_path = r'C:/Program Files/Java/jre1.8.0_161/bin/java.exe'

os.environ['JAVAHOME'] = java_path

# initialize NER tagger
sn = StanfordNERTagger('C:/Users/Parag/Documents/stanford-ner-2018-10-16/stanford-ner-2018-10-16/classifiers/english.all.3class.distsim.crf.ser.gz',
                       path_to_jar='C:/Users/Parag/Documents/stanford-ner-2018-10-16/stanford-ner-2018-10-16/stanford-ner.jar')

# tag named entities
ner_tagged_sentences = [sn.tag(sent.split()) for sent in dataset_unseen['Text']]
dataset_unseen['Text'] = dataset_unseen.apply(Detectner,axis=1)
# extract all named entities
named_entities = []

for sentence in ner_tagged_sentences:
    temp_entity_name = ''
    temp_named_entity = None

    for term, tag in sentence:
        if tag != 'O':
            temp_entity_name = ' '.join([temp_entity_name, term]).strip()
            temp_named_entity = (temp_entity_name, tag)

        else:
            if temp_named_entity:
                named_entities.append(temp_named_entity)
                temp_entity_name = ''
                temp_named_entity = None
entity_frame = pd.DataFrame(named_entities, columns=['Entity Name', 'Entity Type'])
entity_frame.head()

** Выход **

 Entity Name      Entity Type       Frequency

 ABC Farms        ORGANIZATION          5 

 Freddy Hill Lane  ORGANIZATION          3 

 North Lane Thames ORGANIZATION          2 

Теперь яхочу замаскировать эти именованные сущности с помощью шаблона, подобного "######", чтобы следовать правилам GDPR, скрывая конфиденциальную информацию клиентов.

Я попытался использовать такие варианты, как:

  1. Применение для цикла в исходном фрейме данных - проверка Текст для именованных объектов, присутствующих в фрейме данных именованного объекта - маска именованного объекта с помощью #####.

  2. Определение функции длямаскирование именованных объектов в тексте:

def Detectner(row):
    ner_tagged_sentences = [sn.tag(sent.split()) for sent in row['Text']]
    results = ner_tagged_sentences.sub('**********',row['Text'])
    return results

dataset_unseen['Text'] = dataset_unseen.apply(Detectner,axis=1)

Но я получаю следующее сообщение об ошибке:

AttributeError: ("'list' object has no attribute 'sub'", 'occurred at index 0')

Как мне извлечь и замаскировать именованные объекты в тексте. Любое улучшение этого кода высоко ценится!

1 Ответ

1 голос
/ 23 октября 2019

Когда вы делаете помеченные предложения, вы создаете list в строке

ner_tagged_sentences = [sn.tag(sent.split()) for sent in row['Text']]

type из ner_tagged_sentences равно list, в котором нет sub метода.

Вы можете попробовать несколько вещей для достижения цели сделать документы анонимными:

  1. Замените токены не-O тегами на что-то (уровень токена)
  2. Заменить текст именованного объекта непосредственно в документе (на уровне строки)

Похоже, вы пытаетесь сделать число (2)

...