Особенности разработки для строки - PullRequest
0 голосов
/ 30 апреля 2020

Предположим, у нас есть набор данных, состоящий из 6 строк di git (все строчные буквы), например, "olmido" и соответствующего двоичного значения. Например, «olmido» имеет значение 1, а «lgoead» - значение 0. Для новых строк 6-di git (все строчные буквы) я хочу предсказать, какое значение они имеют (т.е. 1 или 0) .

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

В моем варианте порядок букв не имеет значения (поэтому «olmido», например, трактуется так же, как, например, «loimod»), но порядок букв должен играть большую роль. Как я могу лучше всего принять это во внимание?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Я не совсем уверен в случае использования здесь, но я предполагаю, что вы хотели бы предсказать на основе sub-sequence алфавитов.

Если полное совпадение строки и у вас нет ограничений памяти, достаточно использовать словарь. Если это частичное совпадение строк, взгляните на методологию Aho-Corasick, где вы могли бы делать совпадения подстрок.

Более вероятный подход c заключается в использовании алгоритма обучения последовательности , такого как Условное случайное поле (CRF) . Рассматривая это как проблему обучения последовательности, приведенный ниже фрагмент изучает элементы левого алфавита и элементы правого алфавита для каждого алфавита в слове. Я добавил параметр DEPENDENCY_CHAIN_LENGTH, который можно использовать для управления количеством зависимостей, которые вы хотите выучить для каждого алфавита. Поэтому, если вы хотите, чтобы модель изучала только непосредственную левую и непосредственную правую зависимости алфавита, вы можете присвоить это 1. Я назначил это 3 для приведенного ниже фрагмента.

Во время прогнозирования прогнозируется метка для каждого (закодированного) алфавита (и его зависимостей слева и справа). Я усреднил прогноз для каждого алфавита и объединил его в один вывод для каждого слова.

Пожалуйста, сделайте pip install sklearn_crfsuite для установки crfsuite, если он еще не установлен.

import sklearn_crfsuite
import statistics

DEPENDENCY_CHAIN_LENGTH = 3


def translate_to_features(word, i):
    alphabet = word[i]
    features = {
        'bias': 1.0,
        'alphabet.lower()': alphabet.lower(),
        'alphabet.isupper()': alphabet.isupper(),
        'alphabet.isdigit()': alphabet.isdigit(),
    }
    j = 1
    # Builds dependency towards the left side characters upto
    # DEPENDENCY_CHAIN_LENGTH characters
    while i - j >= 0 and j <= DEPENDENCY_CHAIN_LENGTH:
        position = (i - j)
        alphabet1 = word[position]
        features.update({
            '-' + str(position) + ':alphabet.lower()': alphabet1.lower(),
            '-' + str(position) + ':alphabet.isupper()': alphabet1.isupper(),
            '-' + str(position) + ':alphabet.isdigit()': alphabet1.isdigit(),
        })
        j = j + 1
    else:
        features['BOW'] = True

    j = 1
    # Builds dependency towards the right side characters upto
    # DEPENDENCY_CHAIN_LENGTH characters
    while i + j < len(word) and j <= DEPENDENCY_CHAIN_LENGTH:
        position = (i + j)
        alphabet1 = word[position]
        features.update({
            '+' + str(position) + ':alphabet.lower()': alphabet1.lower(),
            '+' + str(position) + ':alphabet.isupper()': alphabet1.isupper(),
            '+' + str(position) + ':alphabet.isdigit()': alphabet1.isupper(),
        })
        j = j + 1

    else:
        features['EOW'] = True

    return features


raw_training_data = {"Titles": "1",
                     "itTels": "0",
                     }

print("Learning dataset with labels : {}".format(raw_training_data))
raw_testing_data = ["titles", "ittsle"]

X_train = []
Y_train = []

print("Feature encoding in progress ... ")
# Prepare encoded features from words
for word in raw_training_data.keys():
    word_tr = []
    word_lr = []
    word_length = len(word)
    if word_length < DEPENDENCY_CHAIN_LENGTH:
        raise Exception("Dependency chain cannot have length greater than a word")
    for i in range(0, len(word)):
        word_tr.append(translate_to_features(word, i))
        word_lr.append(raw_training_data[word])
    X_train.append(word_tr)
    Y_train.append(word_lr)
print("Feature encoding in completed")
# Training snippet
crf = sklearn_crfsuite.CRF(
    algorithm='lbfgs',
    c1=0.1,
    c2=0.1,
    max_iterations=1,
    all_possible_transitions=True
)
print("Training in progress")
crf.fit(X_train, Y_train)
print("Training completed")

print("Beginning  predictions")
# Prediction Snippet
for word in raw_testing_data:
    # Encode into features
    word_enc = []
    for i in range(0, len(word)):
        word_enc.append(translate_to_features(word, i))

    # Predict using the encoded features
    pred_values = crf.predict_marginals_single(word_enc)

    # Aggregate scores across spans per label
    label_scores = {}
    for span_prediction in pred_values:
        for label in span_prediction.keys():
            if label in label_scores:
                label_scores[label].append(span_prediction[label])
            else:
                label_scores[label] = [span_prediction[label]]

    # Print aggregated score
    print("Predicted label for the word '{}'  is :".format(word))
    for label in label_scores:
        print("\tLabel {} Score {}".format(label, statistics.mean(label_scores[label])))
print("Predictions  completed")

Выводит:

Learning dataset with labels : {'Titles': '1', 'itTels': '0'}
Feature encoding in progress ... 
Feature encoding in completed
Training in progress
Training completed
Beginning  predictions
Predicted label for the word 'titles'  is :
    Label 1 Score 0.6821365857513837
    Label 0 Score 0.3178634142486163
Predicted label for the word 'ittsle'  is :
    Label 1 Score 0.36701890171374996
    Label 0 Score 0.6329810982862499
Predictions  completed
0 голосов
/ 30 апреля 2020

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

...