2012-06-29 2 views
0

У меня есть база данных с почти 100 000 комментариями, и я бы хотел найти наиболее часто используемые слова (используя стоп-слова, чтобы избежать общих слов).Найти наиболее популярные слова в MySQL/PHP

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

Можете ли вы помочь мне с помощью кода запроса и PHP для этого? Спасибо!

+0

Замечания: строки freetext правильно? Как varchar (x), который содержит текст, предоставленный пользователем? – Windle

+1

http://stackoverflow.com/questions/9226603/sphinx-search-mysql-find-most-common-words – craig1231

+1

Надеюсь, я не сломал систему stackoverflow. Я имею в виду, я описал (довольно подробно), каков будет общий процесс. – Aufziehvogel

ответ

1

Самый простой подход, который я думаю, было бы:

  • Создайте две новые таблицы: keywords (идентификатор, слово) и keywords_comments (keyword_id, comment_id, граф)
    • keywords сохраняет уникальный идентификатор и ключевое слово вы нашли в тексте
    • keywords_comments хранит по одной строке для каждого соединения между каждым комментарием, содержащим это ключевое слово. В count вы сохраните количество раз, когда это ключевое слово произошло в комментарии. Два столбца keyword_id + comment_id вместе образуют уникальный или непосредственно первичный ключ.
  • Получить все комментарии из базы данных
  • Разбор через все комментарии и разделить не-символов (или других границ)
  • Запишите эти данные в таблицы

Пример

У вас есть следующие два комментария:

Привет, как дела?

Ничего себе, привет. Меня зовут Стефан.

Теперь вы будете перебирать их и разделять их несимволами. Это приведет к следующим строчным словам для каждого текста: - Первый текст: привет, как, есть, вы - Второй текст: ничего себе, привет, мое, название, Штефан

Как только вы разобраны один из этих текстов, вы уже можете снова вставить его в базу данных. Думаю, вы не хотите загружать 100.000 комментариев в ОЗУ.

Так что пойти бы это:

  • Синтаксического первого текст получить ключевые слова выше
  • Напишите каждое ключевое слово в tabke keywords, если он еще не там
  • Установить ссылку от ключевого слова комментарий (keywords_comments) и правильно установите счетчик (в нашем примере каждое слово происходит только один раз в каждом тексте, вы должны это учитывать).
  • Анализировать второй текст
  • ...

Незначительное улучшение

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

Обычно я использую переменные подсчета, когда я читаю данные в порядке и знаю, что данные не могут измениться с того направления, в котором я начинаю (т. Е. Он будет оставаться постоянным до той точки, в которой я сейчас являюсь). Тогда я сделать что-то вроде:

SELECT * FROM table ORDER BY created ASC LIMIT 0, 100 
SELECT * FROM table ORDER BY created ASC LIMIT 100, 100 
SELECT * FROM table ORDER BY created ASC LIMIT 200, 100 
… 

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

Если вы не можете быть уверены в том, что переменная внешнего подсчета остается неизменной, вы можете добавить новое поле проанализировано которое вы установили в true, как только вы прочли комментарий. Тогда вы всегда можете увидеть, какие комментарии уже были прочитаны, а какие нет. SQL запрос будет выглядеть следующим образом:

SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */ 

Это работает до тех пор, пока вы не распараллелить нагрузку (с несколькими клиентами или нитями). В противном случае вам нужно будет убедиться, что чтение + установка true является атомарной (синхронизированной).

+0

Спасибо @Aufziehvogel, это было действительно полезно! – Santiago

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