У меня есть 27000 свободных текстовых элементов, каждое из примерно 2-3 предложений. Мне нужно объединить их по сходству. Пока что у меня довольно ограниченный успех. Я пробовал следующее:
Я использовал Python Natural Language Toolkit для удаления стоп-слов, лемматизации и токенизации, затем генерировал семантически похожие слова для каждого слова в предложении перед вставкой их в графовую базу данных Neo4j. Затем я попытался сделать запрос, используя счетчик TF для каждого слова и связанного слова. Это не сработало очень хорошо и привело к тому, что можно было легко вычислить сходство между двумя текстовыми элементами.
Затем я посмотрел на библиотеку Graphawares NLP , чтобы аннотировать, обогащать и вычислять косинусное сходство между каждым текстовым элементом. После 4 дней обработки сходства я проверил журнал и обнаружил, что обработка займет 1,5 года. Очевидно, что версия плагина для сообщества не оптимизирована, поэтому я думаю, что она не подходит для такого объема данных.
Затем я написал собственную реализацию, которая использовала тот же подход, что и плагин Graphaware, но в гораздо более простой форме. Я использовал scikitlearn's TfidfVectorizer , чтобы вычислить косинусное сходство между каждым текстовым элементом и каждым другим текстовым элементом и сохранил их как отношения между узлами Neo4j. Тем не менее, с 27000 текстовых элементов, что создает 27000 * 27000 = 729000000 отношений! Намерение состояло в том, чтобы перенести график в Grephi , выбирая отношения более X порога сходства, и использовать модульную кластеризацию для выделения кластеров. Обработка для этого составляет около 4 дней, что намного лучше. Обработка не завершена и в данный момент выполняется. Однако я считаю, что у Grephi максимальное число фронтов составляет 1M, поэтому я ожидаю, что это ограничит то, что я могу сделать.
Поэтому я обратился к более традиционным методам ML с использованием алгоритмов Scikitlearn KMeans, DBSCAN и MeanShift. Я получаю кластеризацию, но когда она нанесена на точечную диаграмму, разделения нет (я могу показать код, если это поможет). Вот что я получаю с DBSCAN:
Я получаю похожие результаты с KMeans. Эти алгоритмы запускаются в течение нескольких секунд, что, очевидно, облегчает жизнь, но результаты кажутся плохими.
Итак, мои вопросы:
- Есть ли лучший подход к этому?
- Можно ли ожидать, что в произвольном тексте вообще найдутся отдельные кластеры?
- Каким должен быть мой следующий ход?
Большое спасибо.