Вопрос или проблема
У меня есть интересная проблема, не знаю даже, с чего начать. Я работаю над бинарным классификатором, который будет принимать химическое название, закодированное в виде строки, и прогнозировать, является ли оно ‘хорошим’ или ‘плохим’. Мне удалось достичь довольно хороших результатов, исследуя структуру химического вещества напрямую, но я хотел бы изучить, можно ли извлечь что-то из самого названия химического вещества (так как имя может содержать информацию о структуре молекулы, которую моя кодировка молекулярной структуры не учитывает). Я искал информацию о встроенных в 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 и эмбеддингов символов может значительно улучшить классификацию. Не забывайте о важности тщательной проверки и валидации модели, чтобы убедиться в ее эффективности в решении поставленной задачи.