Как пометить именованные объекты, чтобы подготовить обучающие данные для пользовательского распознавания именованных объектов с пространством? - PullRequest
2 голосов
/ 25 июня 2019

Я хочу обучить простое именованное средство распознавания сущностей в моем настраиваемом наборе данных.Я подготовил словарь Python, имеющий key = entity_type и список значений = имя сущности , но я не получаю никакого способа использовать теги токенов в нужном формате.

IЯ пробовал обычное сопоставление строк (поиск) и регулярное выражение (поиск, компиляция), но не получил желаемого.

Например: мое предложение и слова, которые я использую (это пример)

sentence = "Machine learning and data mining often employ the same methods
and overlap significantly."

dic = {'MLDM': ['machine learning and data mining'], 'ML': ['machine learning'],
 'DM': ['data mining']}

for k,v in dic.items():
  for val in v:
    if val in sentence:
      print(k, val, sentence.index(val)) #right now I'm just printing 
#the key, val and starting index

output:
MLDM machine learning and data mining 0
ML machine learning 0
DM data mining 21

expected output: MLDM 0 32

so I can further prepare training data to train Spacy NER : 
[{"content":"machine learning and data mining often employ the same methods 
and overlap significantly.","entities":[[0,32,"MLDM"]]}

1 Ответ

0 голосов
/ 25 июня 2019

Вы можете создать регулярное выражение из всех значений в вашем dic, чтобы сопоставить их как целые слова, и при совпадении получить ключ, связанный с соответствующим значением. Я предполагаю, что элементы значений уникальны в словаре, они могут содержать пробелы и содержать только символы «слова» (никаких специальных символов, таких как + или ().

import re

sentence = "Machine learning and data mining often employ the same methods and overlap significantly."

dic = {'MLDM': ['machine learning and data mining'], 'ML': ['machine learning'],
 'DM': ['data mining']}

def get_key(val):
    for k,v in dic.items():
        if m.group().lower() in map(str.lower, v):
            return k
    return ''

# Flatten the lists in values and sort the list by length in descending order
l=sorted([v for x in dic.values() for v in x], key=len, reverse=True)
# Build the alternation based regex with \b to match each item as a whole word 
rx=r'\b(?:{})\b'.format("|".join(l))
for m in re.finditer(rx, sentence, re.I): # Search case insensitively
    key = get_key(m.group())
    if key:
        print("{} {}".format(key, m.start()))

См. Демоверсию Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...