NER маркировка нового текста с помощью обученной модели с использованием симплетрансформаторов - PullRequest
0 голосов
/ 29 апреля 2020

Я следовал инструкциям Тилины Раджапаксе в его статье для Среды: «Простые трансформаторы - распознавание именованных сущностей с помощью моделей трансформаторов» (https://towardsdatascience.com/simple-transformers-named-entity-recognition-with-transformer-models-c04b9242a2a0) и обучил модель bert для маркировки NER. Я закончил с 3 вопросами, которые я перечислю в конце поста. Но сначала позвольте мне дать вам некоторый контекст.

Мой код следующий (близко следует к коду Тилины в его статье):

from simpletransformers.ner.ner_model import NERModel

# Create a NERModel
model = NERModel('bert', 'bert-base-multilingual-cased', use_cuda = False) # for some reason my environment does not see CUDA as I mention in another post (https://stackoverflow.com/questions/61490026/cuda-appears-installed-in-one-environment-but-not-installed-in-the-base-and-anot) so I had to set `use_cuda = False` .  In case you can visit my other post and make a suggestion.

# Train the model
model.train_model('train.txt')

# Evaluate the model
result, model_outputs, predictions = model.eval_model('test.txt')

До этого момента все было хорошо.

result
{'eval_loss': 0.11112056551398079,
 'precision': 0.898527865404837,
 'recall': 0.9083982990786676,
 'f1_score': 0.9034361233480177}
predictions
len(predictions)

Далее я проверяю два небольших фрагмента текста:

[txt0, txt1]
['δηµοσίευσης  στο  διαδικτυακό  τόπο του Γ.Ε.ΜΗ. στοιχείων της ανώνυµης εταιρείας µε την επωνυµία «ΑΛΟΥΜΥΛ, ΒΙΟΜΗΧΑΝΙΑ ΑΛΟΥΜΙΝΙΟΥ ΑΝΩΝΥΜΗ ΕΤΑΙΡΙΑ».    Την 25/07/2019 καταχωρίσθηκε στο Γενικό Εµπορικό Μητρώο (Γ.Ε.ΜΗ.) µε Κωδικό Αριθµό Καταχώρισης',
 'ΑΝΑΚΟΙΝΩΣΗ Καταχώρισης στο Γενικό Εμπορικό Μητρώο στοιχείων της ανώνυμης εταιρείας με την επωνυμία ΒΙΑΝΕΞ Α.Ε. ΑΝΩΝΥΜΟΣ ΕΜΠΟΡΟΒΙΟΜΗΧΑΝΙΚΗ ΤΟΥΡΙΣΤΙΚΗ ΞΕΝΟΔΟΧΕΙΑΚΗ ΚΑΙ ΝΑΥΤΙΛΙΑΚΗ ΑΝΩΝΥΜΟΣ ΕΤΑΙΡΕΙΑ και το διακριτικό τίτλο ΒΙΑΝΕΞ ΑΕ. Την 03/04/2019 καταχωρίσθηκε στο Γενικό Εμπορικό Μητρώο ']


preds, outputs = model.predict([txt0, txt1])

Вот что я получаю:

enter image description here

enter image description here

В каждом из этих двух текстовых фрагментов имеется одно наименование юридического лица. Но фирменное наименование является составным, оно состоит из названия компании и некоторых других слов, которые, хотя и относятся к официальному названию компании, также имеют более общее c значение и использование на языке.

Итак, чтобы быть конкретным:

{'ΒΙΑΝΕΞ': 'B-ORG'}, # This is a name
  {'Α.Ε.': 'I-ORG'}, # This are the initials of 'Societe Generale'
  {'ΑΝΩΝΥΜΟΣ': 'I-ORG'}, # This means 'anonymous' (technical legal term)
  {'ΕΜΠΟΡΟΒΙΟΜΗΧΑΝΙΚΗ': 'O'}, # This means 'commercial and industrial'
  {'ΤΟΥΡΙΣΤΙΚΗ': 'O'}, # This means 'Touristic'
  {'ΞΕΝΟΔΟΧΕΙΑΚΗ': 'O'}, # This means 'Hotel operator'
  {'ΚΑΙ': 'O'}, # This means 'and'
  {'ΝΑΥΤΙΛΙΑΚΗ': 'B-ORG'}, # This means 'Maritime'
  {'ΑΝΩΝΥΜΟΣ': 'O'}]] # This means 'Anonymous'

Таким образом, имя сущности является всей последовательностью этих слов, некоторые из которых, как я уже сказал, имеют более общее значение semanti c (может применяться в других контекстах ).

Мои вопросы: 3:

1) Как я могу обучить модель с помощью простейших преобразователей, чтобы распознавать, что вся строка соответствует одному имени сущности, и поэтому все термины должны быть помечены как B-ORG или какую-либо другую метку, которую я выберу, хотя они будут помечены по-разному в другом контексте?

2) Тот факт, что обучающие данные представлены кадром данных, где каждое слово принадлежит отдельной строке, не мешает ли цель сделать так, чтобы модель распознала и пометила всю последовательность одинаковой меткой (например, B-ORG)?

3) Сколько предложений я должен предоставить с комментариями в качестве обучающих данных? Сколько должно включать название компании, а сколько нет? Я понимаю, что на этот вопрос трудно ответить без экспериментов, но большая часть поможет мне начать.

...