Маркировка ключевых слов с помощью аннотатора данных для машинного обучения (DAML)

Извлечение ключевых фраз - важная часть любого набора инструментов обработки естественного языка (NLP). Ключевые фразы можно использовать для индексации корпуса документов или для резюмирования документа. Существует множество алгоритмов для извлечения ключевой фразы. Большинство этих алгоритмов неконтролируемые, начиная с TF-IDF и совсем недавно с KeyBert. Облачные провайдеры, такие как Amazon Web Services (AWS) и IBM Watson, также предоставляют услуги извлечения ключевых фраз через Amazon Comprehend и Watson Assistant, но это модели черного ящика, оснащенные данными общего назначения. Для документов, которые ограничены определенной областью или текстом, который может следовать своему собственному тону (твиты против академических статей), идеальным вариантом является обучение контролируемой модели извлечения ключевых фраз.

Хотя модели машинного обучения с учителем широко признаны как обеспечивающие более высокую точность, их часто избегают из-за высокой стоимости маркировки, которую несет человек.

Для извлечения ключевой фразы существуют наборы данных с открытым исходным кодом, например SemEval-2010. Однако большинство из них ограничено академическими исследованиями или новостями. Разметка ключевых фраз является особенно сложной задачей, поскольку требует тщательного изучения каждого документа для извлечения наиболее важных ключевых фраз из каждого документа. Автоматическое увеличение данных невозможно. Рассмотрим этот фрагмент текста здесь и попытаемся определить ключевые фразы:

Завтра вместо баскетбола я буду играть в бейсбол с друзьями из Нью-Йорка в парке Сан-Франциско.

Какие ключевые фразы? ‘баскетбол’? Я так не думаю, писатель не этим будет заниматься. Я думаю, что «бейсбол» более важен. Как насчет Нью-Йорка и Сан-Франциско? Сколько ключевых фраз нужно извлечь? Эти решения усложняют создание меток по ключевым словам даже для человека-аннотатора.

В этой статье я пошагово рассмотрю процесс маркировки набора данных IMDB для извлечения ключевой фразы. Таким образом, мы можем обнаружить ключевые фразы, соответствующие отрицательным или положительным отзывам о фильме. Или мы можем определить ключевые фразы среди отзывов на такой фильм, как Звездные войны. Мы будем использовать Аннотатор данных для машинного обучения (DAML), чтобы помочь с нашей задачей маркировки. DAML предоставляет множество преимуществ по сравнению с процессом маркировки вручную (например, на основе Excel):

  1. Быстрая аннотация, щелкнув или выделив ключевые фразы.
  2. Использование предварительных этикеток для облегчения и ускорения написания аннотаций.
  3. Различать и маркировать на основе нескольких аннотаторов.
  4. Вычисляйте человеческие показатели, например показатель отклонения.

Предварительные ярлыки

DAML по своей сути предоставляет нам Шаг 1: Быстрая аннотация через интуитивно понятный пользовательский интерфейс аннотаций. Большая часть усилий, описанных в этой статье, относится к Шагу 2 с использованием предварительных меток для облегчения и ускорения аннотаций. Эти начальные предварительные метки, хотя и не всегда точны, могут определять некоторые ключевые слова или часть ключевой фразы в документе. Аннотатор-человек может быстро просмотреть эти предварительные метки и принять, отклонить или изменить в DAML. В этом разделе я опишу процесс создания и представления предварительных меток в DAML.

Сначала мы импортируем набор данных imdb. Образец набора данных предоставляется в репозитории DAML.

import pandas
imdb_df = pandas.read_csv('imdb-500.csv')

Затем мы настраиваем некоторые служебные функции, чтобы помочь нам подготовить данные для DAML. Чтобы использовать и определять предварительные метки, которые помогут аннотаторам, нам нужно определить позиции этих предварительных меток в обзорах или тексте.

def get_keyphrase_positions(text, keyphrase):
    
    # get the starting offset
    start = text.lower().find(keyphrase)
    
    # get the end offset
    end = start + len(keyphrase)
    
    # reset keyphrase to exactly the word in text
    correct_keyphrase = text[start:end]
    
    # return as a dictionary
    return { correct_keyphrase: [start, end] }

Кроме того, нам также необходимо отделить слова от знаков препинания, чтобы аннотатор мог быстро щелкнуть только слово, а не слово плюс знак препинания. Например, ключевой фразой должно быть «комедия», а не «комедия .».

def tokenize_for_daml(text):
    
    tokenized_text = text
    
    # separate words from punctuation.
    punctuation_list = ['.', ',', '!']
    for punctuation in punctuation_list:
        tokenized_text = tokenized_text.replace(punctuation, 
                                                ' ' + punctuation) 
    
    return tokenized_text

Наконец, мы пишем основной код для генерации предварительных меток с использованием неконтролируемого алгоритма извлечения ключевой фразы, в частности TextRank.

import json
import pke
import warnings
warnings.simplefilter('ignore')
# define the set of valid Part-of-Speeches
pos = {'NOUN', 'PROPN', 'ADJ'}
# define a list to store the keyphrases and tokenized_text
list_of_keyphrases = []
list_of_tokenized_text = []
# get initial keyphrases for each review
# see PKE TextRank documentation for explaination
for _, row in imdb_df.iterrows():
    input_string = row['review']
    
    # format text for DAML
    tokenized_text = tokenize_for_daml(input_string)
    list_of_tokenized_text.append(tokenized_text)
    
    # run PKE's TextRank
    extractor = pke.unsupervised.TextRank()
    extractor.load_document(input=input_string, 
                            language='en', 
                            normalization=None)
    extractor.candidate_weighting(window=5, 
                                  pos=pos, 
                                  top_percent=0.33)
    results = extractor.get_n_best(n=5)
    
    # DAML requires this format, {'keyphrase': [start, end]}
    daml_format_list = []
    
    # the result is actually a tuple, ('keyphrase', score)
    # transform the result to fit DAML's expected format 
    for result in results:
        
        # extract the keyphrase
        keyphrase = result[0]
        
        daml_format = get_keyphrase_positions(tokenized_text,         
                                              keyphrase)
        daml_format_list.append(daml_format)
    
    list_of_keyphrases.append(json.dumps(daml_format_list, 
                                         separators=(',', ':'))
                             )
        
imdb_df['tokenized_reviews'] = list_of_tokenized_text
imdb_df['pre-labels'] = list_of_keyphrases
imdb_df.to_csv('for_daml.csv', index=False)

Теперь у нас есть данные, готовые для импорта в DAML.

Несколько аннотаторов

Для сложных задач маркировки, таких как извлечение ключевых фраз, может быть полезно иметь несколько аннотаторов, работающих над задачей. Таким образом, мы можем измерить консенсус и уверенность в аннотациях. И наоборот, мы можем обнаружить слабые аннотаторы и исключить их метки из обучающего набора. Мы можем создать несколько аннотаторов через DAML, определив отдельные метки для каждого аннотатора. Аннотатор будет использовать свой собственный ярлык при выборе ключевых фраз.

Оценка предсказанных результатов человеком

Для извлечения ключевых фраз часто бывает трудно измерить результаты как точное положительное обнаружение. Ключевые фразы часто субъективны и могут зависеть от контекста варианта использования. Однако человеку может быть легко обнаружить плохие ключевые фразы или фразы, которые сильно неточны. Примерами плохих ключевых фраз являются такие слова, как «the», текст в формате, отличном от ASCII, или часто встречающиеся в документе (неинтересные). Оценщик-человек может легко использовать DAML, чтобы легко обнаруживать и удалять эти плохие ключевые фразы и вычислять коэффициент отклонения¹, который может быть полезен при сравнении различных моделей извлечения ключевых фраз.

Заключение

После заполнения аннотаций вы можете экспортировать помеченные данные и обучить пользовательскую модель с помощью контролируемых алгоритмов извлечения ключевых фраз, таких как KEA или Генерация ключевой фразы OpenNMT. Для получения дополнительной информации о DAML или если вы хотите внести свой вклад, посетите наш Github.

[1] Фейфань Лю, Дина Пеннелл, Фэй Лю и Ян Лю. 2009. Неконтролируемые подходы к автоматическому извлечению ключевых слов с использованием стенограмм собраний. В Proceedings of Human Language Technologies: Ежегодная конференция 2009 г. Североамериканского отделения Ассоциации компьютерной лингвистики (NAACL ‘09). Ассоциация компьютерной лингвистики, США, 620–628. Https://dl.acm.org/doi/10.5555/1620754.1620845