Мы продолжаем изучение машинного обучения для машинной идентификации интересующих договорных положений.

В части 1 этой статьи мы рассмотрели реализацию конвейера машинного обучения для обучения модели машинного обучения обнаружению положений о возмещении убытков в лицензионных соглашениях с конечным пользователем программного обеспечения. Там машина смогла отличить возмещения, предоставленные лицензиатом (пользователем), от возмещений, предоставленных лицензиаром (владельцем программного обеспечения). Мы использовали простую однослойную сеть со слоем maxpool, настроенным с использованием Keras в качестве внешнего интерфейса и Tensorflow как внутреннего интерфейса. С относительно небольшим набором данных мы достигли точности более 97% всего за 40 эпох или циклов обучения.

В части 2 мы рассмотрим использование плотных векторов слов вместо одной горячей кодировки для представления слов. Google предоставляет предварительно обученные векторы слов для кодирования нашего слова, поэтому мы будем их использовать.

Эти предварительно обученные векторы слов были обучены на миллионах слов и закодированы таким образом, что векторное расстояние между двумя словами может определять их близость по значению.

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

Мы будем использовать тот же набор данных, который мы использовали в части 1, и на этот раз мы развернем Google Tensorflow Hub, который является высокоуровневым интерфейсом в духе Keras, но обеспечивает более легкий доступ к предварительно обученным встраиваемым словам Google.

Как было сделано в части 1, наборы данных считываются в фрейм данных Pandas.
Код не будет объяснен, поскольку это стандартные служебные функции, обсуждаемые в части 1.

Как и в Части 1, результирующий фрейм данных имеет 2 столбца. Столбец «предложение» содержит образец текста, а столбец «полярность» представляет тип возмещения. 0 - это возмещение, предоставляемое пользователем, а 1 - возмещение, предоставляемое владельцем.

Затем разделение на набор для обучения и проверки.

#Data set split into 0.8 & 0.2
train_df, test_df = train_test_split(_train_df2, test_size=0.2)

Модули Tensorflow предоставляют удобные функции, которые принимают фреймы данных и загружают их в модели.

# Training input on the whole training set with no limit on training epochs.
train_input_fn = tf.estimator.inputs.pandas_input_fn(train_df, train_df["polarity"], num_epochs=None, shuffle=True)
# Prediction on the whole training set.
predict_train_input_fn = tf.estimator.inputs.pandas_input_fn(train_df, train_df["polarity"], shuffle=False)
# Prediction on the test set.
predict_test_input_fn = tf.estimator.inputs.pandas_input_fn(test_df, test_df["polarity"], shuffle=False)

Мы импортируем предварительно обученный модуль встраивания слов из Tensorflow Hub и кэшируем его в папку назначения.
Столбец функций преобразует слова в наших текстовых образцах в плотные контекстные вложения слов.

embedded_text_feature_column = hub.text_embedding_column(key="sentence",module_spec="https://tfhub.dev/google/nnlm-en-dim128/1")

Настраиваем модель с 3 скрытыми слоями. Мы также добавляем уровень регуляризации, чтобы предотвратить чрезмерную подгонку.

estimator = tf.estimator.DNNClassifier(
    hidden_units=[1024, 512, 256],
    feature_columns=[embedded_text_feature_column],
    n_classes=2,
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.1,
      l1_regularization_strength=0.05
    ),
    model_dir=r"D:\data\tf_hub2")

Модель будет обучена для тренировочных циклов.

# Training for 1000 steps
estimator.train(input_fn=train_input_fn, steps=1000);

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

Мы можем изучить другие метрики прогнозирования результатов теста из набора тестов.

test_eval_result

Мы замечаем, что метрика «auc_precision_recall» выявляет некоторые промахи.
Давайте запустим код, чтобы увидеть, где они могут быть.

Давайте запустим код, чтобы увидеть, где они могут быть.

test_pre_result = estimator.predict(input_fn=predict_test_input_fn)
tf.logging.set_verbosity(tf.logging.ERROR)
count = 0
index = 0
for item, pred in zip(test_df["polarity"],test_pre_result):
    if item == 1:
        count += 1  
    if item != pred['class_ids']:
        print("Index={}, X{}P{}".format(index,item,pred['class_ids'][0]))   
    index += 1
print(r"Total of [1] classes: {}".format(count))

for _ind in [9,42]:
    print(test_df.iloc[_ind, :].values.tolist(), "\n")

Это неоднозначные результаты. Можно только сказать, может ли классификатор работать лучше, чем туманная маркировка с более тщательно подобранными наборами данных.
Давайте посмотрим на матрицу путаницы. Вот хорошее объяснение того, что это такое: https://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/

def get_predictions(estimator, input_fn):
    
      return [x["class_ids"][0] for x in estimator.predict(input_fn=input_fn)]
LABELS = [
    "negative", "positive"
]
cm_out = None
# Create a confusion matrix on training data.
with tf.Graph().as_default():
    cm = tf.confusion_matrix(test_df["polarity"], 
                           get_predictions(estimator, predict_test_input_fn))
    with tf.Session() as session:
        cm_out = session.run(cm)
# Normalize the confusion matrix so that each row sums to 1.
cm_out = cm_out.astype(float) / cm_out.sum(axis=1)[:, np.newaxis]
sns.heatmap(cm_out, annot=True, xticklabels=LABELS, yticklabels=LABELS);
plt.xlabel("Predicted");
plt.ylabel("True");

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

This notebook is based on the one found at: https://www.tensorflow.org/hub/tutorials/text_classification_with_tf_hub which is licensed under Apache License, Version 2.0. This notebook itself and associated materials are free for personal academic research use and are provided as-is and without warranty of any sort.
Author: Kok Mun Loon, 25 June 2019.