Кластеризация текстового корпуса - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть 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:

enter image description here

Я получаю похожие результаты с KMeans. Эти алгоритмы запускаются в течение нескольких секунд, что, очевидно, облегчает жизнь, но результаты кажутся плохими.

Итак, мои вопросы:

  • Есть ли лучший подход к этому?
  • Можно ли ожидать, что в произвольном тексте вообще найдутся отдельные кластеры?
  • Каким должен быть мой следующий ход?

Большое спасибо.

1 Ответ

0 голосов
/ 21 ноября 2018

Я думаю, что ваш вопрос слишком общий, чтобы быть подходящим для переполнения стека, но чтобы дать вам несколько советов ...

  1. Каковы ваши данные? Вы обсуждаетеваши методы в деталях, но не ваши данные.Какие кластеры вы ожидаете?

Пример полезного описания:

У меня есть несколько коротких обзоров продуктов.Я ожидаю, что смогу разделить обзоры обуви, шляп и холодильников.

Вы пробовали тематическое моделирование? Это не модно, но это традиционный метод сортировки текстовых документов в кластеры.Начните с LDA, если вы ничего не знаете.

Вы ищете дубликаты? Если вы ищете плагиат или спам, генерируемый ботами, посмотритев MinHash, SimHash и библиотеку FuzzyWuzzy для Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...