Как извлечь характеристики из длинных химических названий?

Вопрос или проблема

У меня есть интересная проблема, не знаю даже, с чего начать. Я работаю над бинарным классификатором, который будет принимать химическое название, закодированное в виде строки, и прогнозировать, является ли оно ‘хорошим’ или ‘плохим’. Мне удалось достичь довольно хороших результатов, исследуя структуру химического вещества напрямую, но я хотел бы изучить, можно ли извлечь что-то из самого названия химического вещества (так как имя может содержать информацию о структуре молекулы, которую моя кодировка молекулярной структуры не учитывает). Я искал информацию о встроенных в sklearn методах извлечения текстовых признаков. Существует довольно много таких методов, но в основном они, кажется, предназначены для кодирования целых предложений или абзацев. Мой вход будет представлять собой очень длинные отдельные слова, такие как:

1-(аминимоидинометил)-N’-[2,3,6-три-O-бензоил-4-O-(2,3,4,6-тетра-O-бензоил-α-D-глюкопиранозил)-β-D-глюкопиранозил]-

2,4,5-тридеоксид-2-[(16-меркапто-1-оксогексадецил)амино]-1,3-O-(1-метилетилиден)-6-O-ундеканил-

октахидро-7-гидрокси-1-[[2-O-(4-гидроксибензоил)-α-D-аллопиранозил]окси]-7-метил-

Поэтому я не уверен, что мешок слов или одноразовое кодирование строк сможет сработать. Может быть, кто-то может указать мне правильное направление по методологиям или алгоритмам, которые могли бы извлечь признаки из этих строк, чтобы я мог обучить на них бинарный классификатор?

Процесс разделения текста на мелкие единицы называется токенизацией.

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

Затем токены могут быть закодированы методом one-hot.

Вот небольшой код для начала:

import re

words = ["1-(аминимоидинометил)-N'-[2,3,6-три-O-бензоил-4-O-(2,3,4,6-тетра-O-бензоил-α-D-глюкопиранозил)-β-D-глюкопиранозил]-",

"2,4,5-тридеоксид-2-[(16-меркапто-1-оксогексадецил)амино]-1,3-O-(1-метилетилиден)-6-O-ундеканил-",
         "октахидро-7-гидрокси-1-[[2-O-(4-гидроксибензоил)-α-D-аллопиранозил]окси]-7-метил-",]
tokens = []

for word in words:
    # Удаляем неинформативные символы
    word = word.replace("[", "").replace("]", "").replace("(", "").replace(")", "")
    # Разделяем
    tokens.append(re.split(r"-", word))

Вы можете обучить РНН с помощью векторов символов. Это можно сделать, разбив название на последовательности символов и векторизовав их численно. Если вы работаете с Keras, вы можете передать их в слой Embedding(), который научится представлять символы. Слои РНН затем будут обрабатывать их последовательность. На выходном узле ваша сеть выполнит классификацию (‘хороший’ / ‘плохой’).

Ответ или решение

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

1. Токенизация названий

Первый шаг заключается в токенизации названий химических веществ, то есть в делении строки на более мелкие единицы (токены). В химических названиях можно выделить такие токены, как:

  • Префиксы и суффиксы (например, "N’", "O-", "α-", "β-")
  • Основные элементы и соединения (например, "amino", "benzoyl", "glucopyranosyl")
  • Числовые индикаторы (например, "2", "3", "4")

Можно использовать регулярные выражения для удаления неинформативных символов (круглые скобки, квадратные скобки и др.) и разделения строки на токены. Пример кода на Python может выглядеть следующим образом:

import re

words = [
    "1-(aminoiminomethyl)-N'-[2,3,6-tri-O-benzoyl-4-O-(2,3,4,6-tetra-O-benzoyl-α-D-glucopyranosyl)-β-D-glucopyranosyl]-",
    "2,4,5-trideoxy-2-[(16-mercapto-1-oxohexadecyl)amino]-1,3-O-(1-methylethylidene)-6-O-undecyl-",
    "octahydro-7-hydroxy-1-[[2-O-(4-hydroxybenzoyl)-α-D-allopyranosyl]oxy]-7-methyl-"
]

tokens = []

for word in words:
    # Удаление неинформативных символов
    word = re.sub(r"[()\[\]]", "", word)  # Удаляем скобки
    # Разделение по дефисам
    tokens.append(re.split(r"-", word))

print(tokens)

2. Преобразование токенов в числовые векторы

После токенизации можно применить методы, такие как One-Hot Encoding или Word Embeddings. В случае длинных химических названий, одна из эффективных стратегий – это создание эмбеддингов на уровне символов (character embeddings). Это позволит модели учитывать контекст, в котором каждый символ появляется в названии. Если вы используете библиотеку Keras, можно использовать слой Embedding() для векторизации последовательностей символов и далее применять рекуррентные нейронные сети (RNN).

3. Обучение модели

Созданные эмбеддинги или признаки можно использовать для обучения модели. Подходящие архитектуры для таких задач включают:

  • Рекуррентные нейронные сети (RNN): Хорошо работают с последовательными данными и могут захватывать долгосрочные зависимости.
  • Лонг Шорт-Терм Мемоория (LSTM): Улучшают обучение RNN, обеспечивая лучшую работу с длинными последовательностями.
  • Сверточные нейронные сети (CNN): Могут быть использованы для извлечения локальных признаков из последовательностей, если подойти к задаче как к задаче классификации текстов.

4. Оценка и валидация модели

После обучения важно провести оценку качества модели. Для этого необходимо разделить данные на обучающую и тестовую выборки и использовать метрики, такие как точность (accuracy), полнота (recall) и F1-мера.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...