Обнаружение синонимов из набора документов с использованием LSA-преобразования в Ruby
После применения преобразования LSA к массиву документов, как это можно использовать для создания синонимов? Например, у меня есть следующие образцы документов:
D1 = Мобилизация
D2 = отражающий тротуар
D3 = Обслуживание трафика
D4 = Специальный обход
D5 = Коммерческие материалы для дороги
D1 D2 D3 D4 D5
commerci[ +0.00 +0.00 +0.00 +0.00 +1.00 ]
materi[ +0.00 +0.00 +0.00 +0.00 +1.00 ]
drivewai[ +0.00 +0.00 +0.00 +0.00 +1.00 ]
special[ +0.00 +0.00 +0.00 +1.00 +0.00 ]
detour[ +0.00 +0.00 +0.00 +1.00 +0.00 ]
mainten[ +0.00 +0.00 +1.00 +0.00 +0.00 ]
traffic[ +0.00 +0.00 +1.00 +0.00 +0.00 ]
reflect[ +0.00 +1.00 +0.00 +0.00 +0.00 ]
pavement[ +0.00 +1.00 +0.00 +0.00 +0.00 ]
mobil [ +1.00 +0.00 +0.00 +0.00 +0.00 ]
Применение преобразования TFIDF
D1 D2 D3 D4 D5
commerci[ +0.00 +0.00 +0.00 +0.00 +0.54 ]
materi[ +0.00 +0.00 +0.00 +0.00 +0.54 ]
drivewai[ +0.00 +0.00 +0.00 +0.00 +0.54 ]
special[ +0.00 +0.00 +0.00 +0.80 +0.00 ]
detour[ +0.00 +0.00 +0.00 +0.80 +0.00 ]
mainten[ +0.00 +0.00 +0.80 +0.00 +0.00 ]
traffic[ +0.00 +0.00 +0.80 +0.00 +0.00 ]
reflect[ +0.00 +0.80 +0.00 +0.00 +0.00 ]
pavement[ +0.00 +0.80 +0.00 +0.00 +0.00 ]
mobil [ +1.61 +0.00 +0.00 +0.00 +0.00 ]
Применение преобразования LSA
D1 D2 D3 D4 D5
commerci[ +0.00 +0.00 +0.00 +0.00 +0.00 ]
materi[ +0.00 +0.00 +0.00 +0.00 +0.00 ]
drivewai[ +0.00 +0.00 +0.00 +0.00 +0.00 ]
special[ +0.00 +0.00 +0.00 +0.80 +0.00 ]
detour[ +0.00 +0.00 +0.00 +0.80 +0.00 ]
mainten[ +0.00 +0.00 +0.80 +0.00 +0.00 ]
traffic[ +0.00 +0.00 +0.80 +0.00 +0.00 ]
reflect[ +0.00 +0.80 +0.00 +0.00 +0.00 ]
pavement[ +0.00 +0.80 +0.00 +0.00 +0.00 ]
mobil [ +1.61 +0.00 +0.00 +0.00 +0.00 ]
1 ответ
Во-первых, этот пример не сработает. Принцип заключается в том, что чем чаще слова встречаются в одинаковых контекстах, тем больше они связаны по смыслу. Поэтому между входными документами должно быть некоторое совпадение. Документы с длиной абзаца идеальны (так как в них есть разумное количество слов и в каждом абзаце, как правило, одна тема).
Чтобы понять, как LSA полезен для распознавания синонимов, вам необходимо сначала понять, как представление векторного пространства (первая полученная там матрица) вхождений слов полезно в первую очередь для распознавания синонимов. Это потому, что вы можете вычислить расстояние между двумя элементами в этом векторном пространстве высокой размерности как меру их сходства (учитывая, что это мера того, как часто они встречаются вместе). Магия АЛП заключается в том, что она переставляет размеры векторного пространства, так что элементы, которые не встречаются вместе, но встречаются в одинаковых контекстах, объединяются путем слияния сходных измерений друг с другом.
Идея весовой функции TFIDF состоит в том, чтобы выделить различия между документами, придав более высокие значения весам для слов, которые появляются больше в меньшем подмножестве корпуса, и меньшие веса для слов, которые используются повсеместно. Более подробное объяснение.
Преобразование "LSA" на самом деле является разложением по сингулярным значениям (SVD) - обычно скрытый семантический анализ или скрытое семантическое индексирование относится к комбинации TFIDF с SVD - и оно служит для уменьшения размерности векторного пространства, или, другими словами, оно уменьшает количество столбцов в меньшее, более краткое описание (как описано выше).
Итак, чтобы получить суть вашего вопроса: вы можете сказать, насколько похожи слова, применив функцию расстояния к двум соответствующим векторам (строкам). Есть несколько функций расстояния, из которых наиболее часто выбирается косинусное расстояние (которое измеряет угол между двумя векторами).
Надеюсь, это прояснит ситуацию.