Вопрос или проблема
У меня возникла проблема, когда мне нужно вычислять сходства между двуязычными (английскими и французскими) текстами. “База данных” выглядит так:
+-+-+-+
| |F|E|
+-+-+-+
|1|X|X|
+-+-+-+
|2| |X|
+-+-+-+
|3|X| |
+-+-+-+
|4|X| |
+-+-+-+
|5| |X|
+-+-+-+
|6|X|X|
+-+-+-+
|7|X| |
+-+-+-+
это означает, что у меня есть английские и французские тексты (переменные длинные одиночные предложения) для каждого “элемента”, причем либо в обоих вариантах (в данном случае версии являются свободными переводами друг друга), либо только на одном языке.
Задача состоит в том, чтобы найти ближайший ID элемента для любого поступающего нового предложения независимо от фактического языка предложения в “базе данных” или поступающего предложения (то есть совпадающее предложение в “базе данных” необязательно должно быть на том же языке, что и поступающее предложение, если их смысл наиболее близок). Надеюсь, моя цель объяснена ясно.
Изначально я планировал создать word2vec с нуля для обоих языков (словарь довольно специфичный, так что я предпочел бы свой собственный word2vec) и находить сходства только для соответствующего языка для каждого нового предложения, но это исключило бы всех кандидатов из элементов, где отсутствуют предложения на соответствующем языке.
Поэтому я задумываюсь, возможно ли создать общее кодирование word2vec для объединенного корпуса (сам метод word2vec не зависит от языка), но я не могу понять, будет ли такое решение более высоким по качеству.
Кроме того, количество предложений не очень велико (около 10.000), возможно, генерация word2vec с нуля — не лучшая идея с одной стороны, но с другой стороны, в корпусах действительно специфические термины.
Эта статья от Amazon объясняет, как можно использовать выровненные двуязычные эмбединги слов для создания оценки сходства между двумя предложениями на разных языках. Используются субтитры к фильмам в четырех языковых парах (английский-немецкий, французский, португальский и испанский), чтобы показать эффективность их системы.
Вы можете взять предобученный эмбеддер на нескольких языках, а затем проверить расстояния между кодировками. Существует неофициальный порт pypi
Facebook’s LASER. Он не зависит от языка и предобучен на en
и fr
.
from laserembeddings import Laser
laser = Laser()
sentence_en = 'My name is Hendrik'
sentence_fr = "Je suis Hendrik"
en_embedding = laser.embed_sentences([sentence_en], lang='en')[0]
fr_embedding = laser.embed_sentences([sentence_fr], lang='fr')[0]
Эмбеддинги представляют собой массивы NumPy из 1024 элементов. Вы можете рассчитать некоторую метрику между эмбеддингами, например, эвклидово расстояние.
import numpy as np
distance = np.linalg.norm(en_embedding - fr_embedding)
Хорошо то, что у вас определено сходство в вашей базе данных, так что вы можете изучить порог для вашей метрики расстояния и точно проверить, насколько хорошо она работает.
Ответ или решение
Для решения задачи вычисления сходства между текстами на двух языках (английским и французским) с использованием word2vec необходимо учитывать несколько важных аспектов, включая природу двуязычного текста, особенности word2vec и альтернативные решения с использованием предобученных многоязычных моделей.
Теория
Word2Vec и Многоязычные Корпусы:
Word2Vec — это модель, которая преобразует слова в векторы фиксированной длины, сохраняя при этом семантическое сходство. Тем не менее, применение word2vec к многоязычным текстам требует определенных корректировок. В идеале для каждой пары языков следует иметь согласованные представления, чтобы векторы слов с одинаковым значением, но из разных языков, расположились в близком пространстве. Например, слова "cat" и "chat" должны иметь близкие векторы.
Обучение с нуля vs Предобученные модели:
Обучение word2vec с нуля с использованием специфического корпуса может быть оправданным, если вы располагаете достаточным объемом текстов и хотите учитывать специфические термины, характерные для вашего предметного пространства. Однако в вашем случае, количество текстов невелико (около 10,000), что может ограничить качество обученной модели. Если корпусы невелики и специфика терминологии не критична, целесообразно использовать предобученные многоязычные модели.
Многоязычные Векторные Представления:
Применение моделей, обученных на многоязычных коллекциях текстов (например, Facebook LASER, MUSE), позволяет сразу же получить согласованные векторные представления для английских и французских текстов. Это значит, что ни язык, ни длина текста не повлияют на качество результата.
Пример
В вашем случае, баз данных содержит предложения на английском и французском языках, причем некоторые тексты доступны только на одном языке. Для решения задачи и вычисления семантического сходства вне зависимости от исходного языка, предлагаем рассмотреть предобученные модели. Например, Facebook LASER, как указано в описании вашей проблемы, является многоязычной моделью, поддерживающей оба ваших языка.
Ниже приведен пример использования LASER для получения векторных представлений предложений на английском и французском:
from laserembeddings import Laser
laser = Laser()
sentence_en = 'My name is Hendrik'
sentence_fr = "Je suis Hendrik"
en_embedding = laser.embed_sentences([sentence_en], lang='en')[0]
fr_embedding = laser.embed_sentences([sentence_fr], lang='fr')[0]
Применение
Вычисление Сходства:
После получения векторных представлений, следующая задача — это вычисление расстояния или сходства между ними. Наиболее распространенный метод — это использование евклидова расстояния или косинусного сходства, чтобы определить, насколько семантически близки два текста.
import numpy as np
distance = np.linalg.norm(en_embedding - fr_embedding)
cosine_similarity = np.dot(en_embedding, fr_embedding) / (np.linalg.norm(en_embedding) * np.linalg.norm(fr_embedding))
Пороговое Значение для Сходства:
Используя вашу базу данных, можно провести обучающее тестирование для определения порогового значения сходства, при котором предложения считаются достаточно близкими. Находя пары текстов, которые вы уже точно знаете как семантически идентичные или неидентичные, вы сможете калибровать свой алгоритм.
Альтернативные Подходы:
Если ваша задача требует поддержки на большем количестве языков или в случае включения более обширного доменного лексикона, также следует рассмотреть использование трансформеров, таких как BERT, XLNet или XLM-RoBERTa, обученных на многоязычных корпусах. Эти модели способны захватывать контекстное значение текстов и работать с семантически сложными структурами.
В заключение, применение предобученных моделей многоязычного представления данных предлагает значительные преимущества для обработки двуязычных текстов. Это позволяет добиться высокой точности даже с ограниченным объемом данных за счет использования заранее обученных, согласованных векторных представлений. В вашей задаче, модели, такие как LASER от Facebook, могут стать отличным выбором для создания надежной системы нахождения сходства предложений.