Конкурс Ant Financial NLP - сводка вопросов о семантическом сходстве текста

1. Введение

Я давно не обновлял свой блог, в основном был занят экзаменационной неделей и недавним соревнованием Ant Financial NLP——Конкурс на семантическое сходство текста. Без лишних слов, давайте к делу. Этот блог в основном описывает подробный процесс решения проблем участия в соревновании типа НЛП впервые с тех пор, как я начал заниматься НЛП. Далее он будет разделен на три части для описания: описание проблемы, идеи решения проблемы и соответствующая реализация кода, а также краткое изложение проблемы.
Адрес кода проекта и описание

2 Описание игры

инструкция: расчет схожести вопросов, то есть с учетом двух предложений, описанных пользователем в службе поддержки клиентов, используется алгоритм для определения того, представляют ли они одинаковую семантику. Если семантика одинакова, суждение равно 1, а разница равна 0.

1 «Как погасить Huabei» — «Как погасить Huabei»: синонимичный вопрос
2 «Как погасить Huabei» — «Как мне погасить мое одеяло»: синонимичный вопрос
3 «Как погасить просроченный платеж после рассрочки Хуабэй» — «Где просроченный платеж после рассрочки Хуабэй»: несинонимичный вопрос

Вопросы для размышления и решения:1. В парах предложений есть опечатки, синонимы, изменения порядка слов и другие проблемы. 2. Два предложения очень похожи, только с одним небольшим отличием, но конечная семантика различна.
Индекс оценки конкурсного вопроса:
Оценка вопросов конкурса основана на оценке F1.Если оценки одинаковы, рейтинг основан на точности. Для расчета F1 необходимо понимать следующие понятия: Истинно положительный (TP) означает вынесение синонимического суждения, причем суждение правильное, а значение TP указывает на количество правильных синонимичных суждений; Ложноположительный (FP) Означает вынести синонимическое суждение, но суждение неверное, а значение указывает на количество неправильных синонимичных суждений; Истинно Отрицательный (TN) означает принять решение, которое не является синонимичным, и решение является правильным. Значение указывает на правильное количество несинонимичных суждений; Ложноотрицательное (FN) означает, что вынесено суждение, которое не является синонимичным, и суждение ошибочно. Числовое значение указывает количество ложных несоответствий.
Формула расчета:

Показатель точности (соотношение, которое синонимично, по сути, синонимично): показатель точности = ТП/(ТП+ФП)
Напомним (собственно, какая доля пар синонимов предсказана):
recall rate = TP / (TP + FN)
Точность: точность = (TP + TN) / (TP + FP + TN + FN)
F1-score = 2 * precision rate * recall rate / (precision rate + recall rate)

3 Идеи решения проблем и соответствующая реализация кода

3.1 Общий анализ конкурсных вопросов

анализировать: В этом вопросе необходимо разработать алгоритм для вычисления семантического сходства двух предложений и, наконец, указать, являются ли они синонимами или несинонимами. Для разработки алгоритма, прежде всего, необходимо уточнить вход и выход алгоритма. Легко судить, что окончательный вывод алгоритма равен 0 или 1, а вход алгоритма - это то, о чем нужно подумать.Если вы рассматриваете моделирование с помощью нейронной сети, вам нужно использовать метод обучения представлению для представления ввода предложение с вектором (вектор слова). ), если для моделирования используется метод классификации машинного обучения, необходимо извлечь признаки, выбрать признаки и выразить признаки для входных предложений. Векторы слов входного предложения представляют собой проблему для размышления - выбор корпуса для обучения векторов слов и метод модели для обучения векторов слов.

3.2 Анализ обучающих данных

Данные, относящиеся ко всему соревнованиюссылка для скачивания, пароль: 5ig5.

1. Метка данных содержит две категории 1 и 0, которые относятся к классической задаче двух классов. Доля категории 1 и категории 0 в наборе данных примерно4.5:1, относится к явлению несбалансированной классификации (это также проблема, которую необходимо решить позже, и важный момент улучшения выполнения конкурсного вопроса).
2. В каждой команде предложений есть определенные опечатки, которые необходимо оценить, например: «хуабэй» пишется как «цветочное одеяло», «логин» пишется как «логин» и т. д., а также в предложениях есть соответствующие синонимы. типа: «почему»: «Почему», хотя эти люди могут сразу судить, но алгоритм — это проблемный момент, который нужно решить.
3. Выборочные данные не только несбалансированы в распределении по категориям, но также имеют относительно небольшое количество положительных примерных (синонимичных) групп предложений, что затрудняет для модели изучение характеристик синонимичных групп предложений.
4. В китайских предложениях есть незарегистрированные слова.После тестирования новые слова, такие как Ant Huabei, Ant Borrowing и т. д., не могут быть выделены причастием jieba.

3.3 Общая идея

Итоговый оценочный индекс F1 этого соревнования составляет0.6238, процесс улучшения индекса оценки F1 конкурсного вопроса0.29——>0.45->0.53->0.5925->0.6159->0.6238. Это соревнование является первым случаем участия в соревновании НЛП, и это процесс постепенного накопления навыков решения проблем, шаг за шагом.Окончательное решение проблемы:

Наконец, метод машинного обучения используется для моделирования проблемы классификации этого конкурса, Входные данные для машинного обучения в основном представляют собой два аспекта: извлеченные статистические характеристики НЛП и сходство предложений, выводимых путем обучения глубокой модели. Окончательная классификационная модель обучается с использованием метода ансамблевого обучения Stacking.

3.4 Конкретный процесс и этапы реализации

Шаг 1. Предварительная работа по сопоставлению внешних данных.
В соответствии с анализом предыдущих данных обучения, внешние данные, которые будут использоваться, следующие, и основная часть ищется вручную:

1. Список стоп-слов для сегментации слов в командах предложений - stop_words.txt
2. Пользовательский словарь новых слов для сегментации слов jieba - dict_all.txt
3. Файл, используемый для исправления ошибок и некоторых правил замены синонимов — правописание_corrections.json
4. Предварительно обученные векторы слов для моделей глубокого обучения на семантическое сходство (300 измерений, обученных на корпусе вопросов и ответов Zhihu) — sgns.zhihu.bigram
5. Файл правил схожести вопросительных слов, используемый для расчета схожести вопросительных слов в двух предложениях - question_words.txt

Шаг 2 Предварительная обработка текста
Основная цель этой части: предоставить относительно правильное представление для ввода окончательного алгоритма.Основная работа: заменить пары слов в искомом файле правила в предложении, удалить стоп-слова в предложении, и выполнить предложение.Обработка сегментации слов, и в соответствии с матрицей предварительно обученных векторов слов строится матрица векторов слов embedding_matrix словаря.Корпус, используемый для построения предварительно обученных векторов слов, состоит из 10447 пар предложений во всем обучающем наборе, а метод обучения - CBOW в Word2Vec, метод отрицательной выборки. Другой предварительно обученный вектор слов — это внешний онлайн-ресурс Zhihu Q&A corpus, обученный Word2vec. Векторы слов (распределенные представления слов) в основном используются в качестве входных данных для слоя внедрения нейронной сети.
Подробный процесс:

    # step 1 加载原数据
    jieba.load_userdict(project.aux_dir + dict_path)
    data_local_df = pd.read_csv(project.data_dir + train_all, sep='\t', header=None,names=["index", "s1", "s2", "label"])
    data_test_df = pd.read_csv(project.data_dir + test_all, sep='\t', header=None, names=["index", "s1", "s2", "label"])
    data_all_df = pd.read_csv(project.data_dir + train_data_all, sep='\t', header=None, names=["index", "s1", "s2", "label"])
    # 预训练中文字符向量
    pre_train_char_w2v()
    # 训练集中的语句的文本处理,去除停用词,根据规则表替换相应的词,使用jieba对语句进行分词处理
    preprocessing(data_local_df,'train_0.6_seg')
    preprocessing(data_test_df,'test_0.4_seg')
    preprocessing(data_all_df,'data_all_seg')

    # 保存label
    project.save(project.features_dir + 'y_0.4_test.pickle', data_test_df['label'].tolist())
    project.save(project.features_dir + 'y_0.6_train.pickle', data_local_df['label'].tolist())
    project.save(project.features_dir + 'y_train.pickle', data_all_df['label'].tolist())

    # step 2预训练中文词组向量
    pre_train_w2v()

    # step 3记录训练集中的词汇表中的词对应的词向量表示
    process_save_embedding_wv('train_all_w2v_embedding_matrix.pickle',type=2,isStore_ids=True)
    # process_save_embedding_wv('zhihu_w2v_embedding_matrix.pickle',type=2,isStore_ids=False)
    # process_save_embedding_wv('zhihu_w2v_embedding_matrix.pickle',type=3,isStore_ids=False)

    # step 4 char wordembedding
    process_save_char_embedding_wv(isStore_ids=True)

Шаг 3 Работа по извлечению текстовых признаков
описывать:Ключевая часть вопроса о конкуренции, качество результатов вопроса о конкуренции в основном зависит от выбора функций. Поскольку это не похоже на многих крупных шишек, которые могут разработать модель нейронной сети, чтобы судить о семантическом сходстве пар предложений с самого начала, эта часть исследуется и исследуется постепенно. Поскольку окончательная модель классификации создается с помощью машинного обучения, многомерные признаки необходимо использовать в качестве входных данных для алгоритма вычисления семантического сходства пар предложений. В итоге выбранные нами признаки включают в себя два аспекта: с одной стороны, в качестве одного из признаков используется выход нейронной сети для вычисления семантического сходства пар предложений, а с другой стороны, это характеристики данные НЛП статистических пар предложений.
a.两个语句的长度上的差距.
b.两个语句的编辑距离.
c.两个语句的n-gram相似性的特征.
d.两个语句的词的统计特征.Включая количество одинаковых слов, количество разных слов и сходство Жаккара.
e.两个语句中的疑问词的相似度.В основном он рассчитывается в соответствии с файлом правил сходства вопросительных слов.
f.两个语句是否同时包括蚂蚁花呗和蚂蚁借呗相关的主题., замечено, что пары предложений в обучающих данных в основном касаются проблем, связанных с муравьиным цветком и муравьиным заимствованием.
g.两个语句的词向量组合的相似度.В основном на основе всего обучающего набора в качестве корпуса, комбинированное сходство векторов слов двух предложений вычисляется с использованием векторов слов, обученных word2vec.
h.两个语句神经网络编码的曼哈顿距离相似度和余弦相似度В основном, манхэттенское расстояние и косинусное сходство семантических векторов двух предложений рассчитываются в соответствии с вводом предварительно обученного вектора слов двух предложений и кодируются LSTM как одна из окончательных функций модели классификации машинного обучения.
i.两个语句的神经网络编码的match vector形式计算的相似度.
j.两个语句的神经网络编码的改进的Compare-Aggregate模型的相似度
Описание модели нейронной сети
Лучшей моделью нейронной сети для функций подобия здесь является улучшенная модель сравнения-агрегации, за которой следуют модели сходства манхэттенского расстояния и косинусного сходства, закодированные нейронной сетью из двух предложений. Итак, подробно представлены следующие две модели нейронных сетей. Далее я подробно расскажу об этих трех моделях нейронных сетей, что также является процессом попытки улучшить и понятно построить модель, используя модель в конкурсе.
Модель 1: модель подобия манхэттенского расстояния и косинусного сходства для семантического кодирования на основе LSTM.
图1
Результат F1 теста платформы после отправки результатов составляет 0, 456. Модель в основном состоит в том, чтобы просто кодировать входную последовательность предложений с помощью LSTM, чтобы получить вектор семантического представления предложения, а затем пройти манхэттенский расчет семантического вектора и вычисление косинусного расстояния Наконец, на основе этих двух терминов можно обучить параметры модели.
Конкретная реализация:

class ManDist(Layer):
    def call(self, inputs, **kwargs):
        """This is where the layer's logic lives."""
        self.res  = K.exp(- K.sum(K.abs(inputs[0]-inputs[1]),axis = 1,keepdims = True))
        return self.res
class ConsDist(Layer):
    def call(self, inputs, **kwargs):
        self.res = K.sum(inputs[0] * inputs[1],axis=1,keepdims=True)/(K.sum(inputs[0]**2,axis=1,keepdims=True) * K.sum(inputs[1]**2,axis=1,keepdims=True))
        return self.res

Модель 2: модель сходства, рассчитанная в виде вектора соответствия для семантического кодирования на основе LSTM.
Модель улучшена на основе модели 1. Результат теста платформы F1 после отправки результатов составляет 0,53. Улучшение заключается в том, что после использования LSTM для кодирования вектора слова предложения вектор семантического кодирования двух предложений является точечным. умножение После вычисления вычитания выполняется следующее вычисление подобия.Причина повышения:В дополнение к семантическому вектору, сформированному кодированием LSTM, семантический вектор предложения также добавляет семантическое взаимодействие, образованное скалярным произведением и вычитанием семантического вектора двух предложений.
Конкретная реализация:

    def call(self, inputs, **kwargs):
        encode_s1 = inputs[0]
        encode_s2 = inputs[1]
        sentence_differerce = encode_s1 - encode_s2
        sentece_product = encode_s1 * encode_s2
        self.match_vector = K.concatenate([encode_s1,sentence_differerce,sentece_product,encode_s2],1)
        return self.match_vector

Модель 3: Улучшенная модель сравнения-агрегации
Улучшения, сделанные моделью 3:первая часть, модель основана на механизме внимания в статье «Разлагаемая модель внимания для вывода на естественном языке», и механизм внимания добавлен на уровень слова в предложении, так что семантический вектор, закодированный с помощью LSTM, больше относится к словам. в предложении.Фокус в основном отражается в различном распределении веса вектора слова каждого слова в предложении после механизма внимания. Кроме того, с помощью части сравнения в этой статье вектор слова предложения, представленный механизмом внимания, конкатенированно связан с вектором двунаправленного семантического кодирования LSTM.Вторая часть, Модель 3 не только принимает векторы двух предложений на уровне фраз в качестве входных данных, но также добавляет векторы двух предложений на уровне слов в качестве входных данных. Увеличьте ввод на уровне символов, в основном для решения проблемы уровня фразы вне словарного запаса.третья часть, добавляя идею интерактивной обработки на основе CNN к семантическому вектору вектора слов предложения, которая учитывает все интерактивные свойства между предложениями.
Результат теста платформы F1 после подачи результатов по модели 3 увеличивается до 0,59.
图2
окончательная реализация кода

    # 提取深度学习特征
    extract_feature_siamese_lstm_manDist()
    extract_feature_siamese_lstm_attention()
    extract_feature_siamese_lstm_dssm()
    # 提取NLP特征
    extract_sentece_length_diff()
    extract_edit_distance()
    extract_ngram()
    extract_sentence_diff_same()
    extract_doubt_sim()
    extract_sentence_exist_topic()
    extract_word_embedding_sim()

Каждый метод извлечения соответствует функции и шагам извлечения признаков:
step1 Определите имя метода для извлечения функций
step2 Загрузите данные, необходимые для извлечения функций
step3 определяет метод извлечения признаков (если это глубокое обучение, его нужно вызывать./final_demo/train_model.pyметод построения модели в файле)
step4 Считайте данные построчно, извлеките функции и сохраните их в соответствующем массиве np.array.
хранилище функций step5
Метод вызова:
project.save_features(feature_train, feature_test, col_names, feature_name)
Описание параметра: извлеченная функция feature_train обучающего набора, извлеченная функция feature_test тестового набора, имя столбца col_names многостолбцовой функции метода извлечения признаков, feature_name метода извлечения признаков

Шаг 4 Создание модели классификации Stacking
С помощью описанного выше метода извлечения признаков будет извлечено 19 признаков, и будет создана модель классификации с использованием машинного обучения извлеченных признаков. Вначале я решил использовать базовый метод классификации LogisticRegression в sklearn. Позже было предложено использовать режим Stacking в ансамблевом обучении для интеграции нескольких методов обучения классификации в Sklearn, а результат F1 теста платформы после окончательной отправки результатов был улучшен до 0,61.
图3
В двухуровневом методе стекирования, использованном в этом конкурсе, в качестве базовой модели стекирования первого уровня были выбраны четыре базовых классификатора: GussianNBClassifier, RandomForestClassifier, LogisticRegression и DecisionTreeClassifier. Второй уровень Stacking обучается классификатором RandomForestClassifier. Конкретная реализация выглядит следующим образом:

    # stacking 第一层模型训练,分别使用基分类器对训练集X_train进行5折交叉验证,在使用训练的模型预测X_test取均值。作为第二层Stacking模型的输入。
    gnb_cls = GussianNBClassifier()
    gnb_oop_train,gnb_oofp_val = gnb_cls.get_model_out(,y_train,X_test)

    rf_cls = RFClassifer()
    rf_oop_train, rf_oofp_val = rf_cls.get_model_out(X_train, y_train, X_test)

    lg_cls = LogisicClassifier()
    lg_oop_train, lg_oofp_val = lg_cls.get_model_out(X_train, y_train, X_test)

    dt_cls = DecisionClassifier()
    dt_oop_train, dt_oofp_val = dt_cls.get_model_out(X_train, y_train, X_test)
     # 构造第二层Stacking模型的输入
    input_train = [gnb_oop_train,rf_oop_train,lg_oop_train,dt_oop_train]
    input_test = [gnb_oofp_val,rf_oofp_val,lg_oofp_val,dt_oofp_val]

    stacked_train = np.concatenate([data.reshape(-1,1) for data in input_train],axis=1)
    stacked_test = np.concatenate([data.reshape(-1,1) for data in input_test],axis=1)

    # stacking 第二层模型训练
    second_model = DecisionTreeClassifier(max_depth=3,class_weight={0: 1, 1: 4})
    second_model.fit(stacked_train,y_train)

Шаг 5 Запустите весь проект

1. Выберите имена методов для извлечения признаков и объедините их в требуемый список ввода признаков.
2. Загрузите данные объектов, извлеченные с помощью нескольких методов извлечения, и данные меток обучающего набора.
Метод вызова: project.load_feature_lists(feature_names_list)
Описание параметра: feature_names_list — это имя вашего метода извлечения признаков, объединенное в список.
Описание возвращаемого параметра: ваш обучающий набор состоит из нескольких столбцов с использованием нескольких методов извлечения, ваш тестовый набор состоит из нескольких столбцов с использованием нескольких методов извлечения и индекса столбца, соответствующего каждому методу извлечения.
Примечание. Один метод извлечения может соответствовать нескольким столбцам функций.
3. Построить окончательную классификационную модель, способ перекрестной проверки

Шаг 6. Обработка проблем, возникающих при анализе данных перед обучением.
1. Для проблемы дисбаланса классификации выборки используется окончательная корректировка веса класса выборки для решения проблемы дисбаланса выборки.Модель классификации в Sklearn можно установить, установив параметр class_weight.Проверьте принцип Sklearn.Установка class_weight должна изменить образец_веса.
2. Для проблемы небольшого количества пар предложений с положительным примером новая пара образцов с положительным примером формируется путем последовательного перестановки пар предложений с положительным примером.
Решив две вышеупомянутые проблемы, результат теста платформы F1 после окончательной отправки результатов улучшился до 0,6238.

4 Итоги после матча

1. В первую очередь необходимо определить задачу алгоритма самостоятельно, во-первых, необходимо рассмотреть форму ввода алгоритма и отображение вывода. Для ввода алгоритма необходимо учитывать, как предварительно обрабатывать ввод, и в какой форме ввод должен быть рассчитан в алгоритме, то есть как представлять ввод. Для вывода алгоритма это точка, и она определяет структурный выбор алгоритма.
2. Во-вторых, для анализа данных, прежде чем разрабатывать структуру алгоритма, необходимо провести статистический и алгоритмический анализ заданных игровых данных и зафиксировать потенциальные проблемы, которые, возможно, необходимо решить, или существующие статистические характеристики. вероятно, будет ключом к улучшению результатов вопросов поздней игры.
3. При разработке структуры алгоритма, если вы вообще не имеете представления, вы можете запросить соответствующие документы и улучшить модель метода, предложенную в документе.Это хороший метод. Направленные на потенциальные проблемы, возникшие на ранней стадии, целевые документы с запросами для решения этих проблем. Поэтому очень полезно читать больше статей, связанных с вашей областью, когда у вас есть время.
4. При обучении модели постарайтесь распечатать val_loss, val_f1, val_acc, val_precision, val_recall в каждом процессе итерации алгоритма.Научитесь наблюдать за этими данными, а также обрабатывать и анализировать причины выводимых результатов на основе опыта. Вероятно, это основа для того, чтобы увидеть, соответствует ли модель обучающим данным или превосходит данные.
5. Дело в деталях.Помимо сравнения структуры алгоритма, окончательный результат улучшается за счет сравнения деталей задачи, таких как процесс обучения вектора слова, процесс предварительной обработки китайского языка и процесс тонкой обработки. настройка того, используется ли матрица встраивания в качестве параметра.

5 Ссылки и ссылки

1.Исследование комбинации вектора китайского слова и вектора слова в глубоком обучении
2.A Compare-Aggregate Model for Matching Text Sequences
3.A Decomposable Attention Model for Natural Language Inference
4.Text Matching as Image Recognition
5.краткое изложение модели пары предложений
5.Использование Word2Vec в gensim
6.Краткое изложение интегрированного обучения и подробное объяснение метода стекирования