2015-07-17 2 views
1

Проблема: У меня есть большой CSV с несколькими столбцами и десятками миллионов строк. В одном из этих столбцов есть переменная запроса, в которой хранится открытый текст. Мне нужно, чтобы найти наиболее распространенные запросы по данным, а потому, что они генерируются пользовательские запросы, мне нужно иметь запросы, какУчитывая большой объем данных, найдите наиболее распространенные запросы

помощь с установкой [х продукт]

и

[х продукт] помощь в установке

вклад в тот же запрос на имя резюме/отчетности.

Я уже обрезают данные всех общих слов и других JSON упаковки и т.д.

Можно предположить, что значения каждой строки содержит только важные слова запроса пользователь сделал, и что мне нужно получить наиболее распространенные запросы.

Я понимаю, что невозможно предоставить код для такого высокого уровня, как это, но я был бы признателен за то, что он указал в правильном направлении - если бы даже ключевые слова для поиска в Google начали мой поиск/понимание этого проблемного пространства, или какой-либо исследовательский документ или сообщение в блоге, в котором рассматривается проблема, которую я имею.

ответ

2

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

Первое, что вы, вероятно, захотите сделать, это применить алгоритм Levenshtein Distance для исправления возможных ошибок в запросах. Это часть процесса очистки данных, который вы хотите сделать до того, как ваш основной алгоритм сделает это.

Второе, что вам нужно сделать, это применить алгоритм выработки к каждому запросу. Stemming включает в себя возвращение только корень слова. Некоторые примеры:

jumping -> jump 
jumps -> jump 
jumper -> jump 

Таким образом, вы нормализуете все важные ключевые слова в своих запросах.

Теперь вы можете использовать подход «больше похоже на этот» для каждого запроса, чтобы найти другие похожие ему запросы, а затем объединить их вместе. Итак, как работает «больше нравится»?

Он включает в себя три компонента: TF, IDF и длину поля. TF is Term Frequency - как часто каждый термин находится в текущем запросе (что повышает его оценку). IDF Частота обратного документа - как часто термин во всех запросах (что снижает его оценку). И длина поля - это просто, как долго поле запроса (чем короче, тем больше увеличивается оценка). Позвольте мне немного развернуть:

Вы хотите сравнить help instaling [product x] с другими записями.

Первым делом нужно исправить орфографические ошибки во всех ваших запросов:

help installing [product x] 

Далее, стволовые запросы:

help install [product x] 

Далее вы выбираете один запрос и начать сравнивая его ко всем другим запросам (или, по крайней мере, всем другим запросам, которые еще не были сопоставлены вместе, как и другие запросы, которые вы уже обработали). Мы начнем с запроса выше.

Давайте создадим термин вектор а

help (1) 
install (1) 
[x] (1) 

Каждый из этих терминов только появляются один раз. Это временная частота для текущего запроса. Давайте сравним IDF каждого из этих условий. Оказывается help подходит к 15 000 раз по всем запросам, install подходит к 2,000 раз, а [product x] подходит к 500 раз. Это означает, что help является наименее актуальным, потому что он появляется так часто, и [product x] является самым важным, потому что он появляется редко. Возьми?

И длина поля работает, чтобы найти такой счет: чем дольше запрос, тем ниже его оценка. Зачем? Потому что, если запрос из 20 символов соответствует вашим условиям, он гораздо вероятнее будет точным дубликатом, чем запрос из 1000 символов, где пользователь бессвязно и говорит о многих разных темах. Видеть?

Теперь вы можете узнать больше о TF/IDF, чтобы найти хорошую реализацию.

Но у меня есть хорошие новости для вас. Вся эта работа была выполнена для вас в библиотеке Lucene. Используя Lucene, вы можете индексировать каждый из своих запросов в качестве документа. Lucene приложит , создавая автоматически при его индексировании. Кроме того, у Lucene есть алгоритм «больше похоже на этот», который использует TF/IDF для вас. И, наконец, Lucene может применять нечеткое сопоставление, используя калькулятор расстояния Levenshtein для каждого из ваших запросов. Потрясающие!! Если вы обнаружите, что работа с Lucene слишком близка к «голым металлам», вы также можете использовать Elasticsearch, который является продвинутой высокоуровневой оболочкой вокруг Lucene. Это действительно удар ногой.

Обратите внимание, что я не специалист по этим темам. Однако я надеюсь, что это дает некоторые идеи. Ура!

http://cephas.net/blog/2008/03/30/how-morelikethis-works-in-lucene/ https://en.wikipedia.org/wiki/Levenshtein_distance

+1

Удивительное спасибо так много. Подводя итог, есть еще некоторая препроцессия, которую я должен сделать (опечатки, истощение/леммализация), а затем я должен заглянуть в TF-IDF, чтобы создать вещи, которые являются «более похожими» и другими алгоритмами группировки. Что-то еще, что я обнаружил, в то время как во время большего исследования было n-граммов, и я думаю, что это будет довольно полезно для этой цели. Я буду использовать библиотеку Spark, и, хотя у нее нет интеграции с NLP, она делает много вещей TF-IDF и других функций. – James

Смежные вопросы