Как улучшить мой алгоритм для поиска Горячих тем, таких как твиттер,

Я создал задание cron для моего сайта, которое запускается каждые 2 часа, и оно подсчитывает слова в каналах, а затем отображает 10 наивысших слов подсчета в качестве горячих тем.

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

То, что делает моя работа cron прямо сейчас, это подсчет слов, за исключением слов, которые я упомянул, таких слов, как:

array('of', 'a', 'an', 'also', 'besides', 'equally', 'further', 'furthermore', 'in', 'addition', 'moreover', 'too',
                        'after', 'before', 'when', 'while', 'as', 'by', 'the', 'that', 'since', 'until', 'soon', 'once', 'so', 'whenever', 'every', 'first', 'last',
                        'because', 'even', 'though', 'although', 'whereas', 'while', 'if', 'unless', 'only', 'whether', 'or', 'not', 'even',
                        'also', 'besides', 'equally', 'further', 'furthermore', 'addition', 'moreover', 'next', 'too',
                        'likewise', 'moreover', 'however', 'contrary', 'other', 'hand', 'contrast', 'nevertheless', 'brief', 'summary', 'short',
                        'for', 'example', 'for instance', 'fact', 'finally', 'in brief', 'in conclusion', 'in other words', 'in short', 'in summary', 'therefore',
                        'accordingly', 'as a result', 'consequently', 'for this reason', 'afterward', 'in the meantime', 'later', 'meanwhile', 'second', 'earlier', 'finally', 'soon', 'still', 'then', 'third');       //words that are negligible

Но это не полностью решает проблему устранения всех ненужных слов. И дайте только слова, которые полезны.

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

Отношения Zeeshan

Ответ 1

Вот как мы реализовали это для Live-трансляции DjangoDose во время DjangoCon (обратите внимание: это хаккаб, мы написали его в 1 день без тестирования и кричали Bifurcation occsaionally, насколько лучше всего могу сказать, что бифуркация не имеет ничего общего с что-нибудь). Все, что было сказано, это более или менее сработало для нас (то есть по вечерам пиво отслеживалось надлежащим образом).

IGNORED_WORDS = set(open(os.path.join(settings.ROOT_PATH, 'djangocon', 'ignores.txt')).read().split())

def trending_topics(request):
    logs = sorted(os.listdir(LOG_DIRECTORY), reverse=True)[:4]
    tweets = []
    for log in logs:
        f = open(os.path.join(LOG_DIRECTORY, log), 'r')
        for line in f:
            tweets.append(simplejson.loads(line)['text'])
    words = defaultdict(int)
    for text in tweets:
        prev = None
        for word in text.split():
            word = word.strip(string.punctuation).lower()
            if word.lower() not in IGNORED_WORDS and word:
                words[word] += 1
                if prev is not None:
                    words['%s %s' % (prev, word)] += 1
                    words[prev] -= 1
                    words[word] -= 1
                prev = word
            else:
                prev = None
    trending = sorted(words.items(), key=lambda o: o[1], reverse=True)[:15]
    if request.user.is_staff:
        trending = ['%s - %s' % (word, count) for word, count in trending]
    else:
        trending = [word for word, count in trending]
    return HttpResponse(simplejson.dumps(trending))

Ответ 2

Если вам нужны статистически значимые выбросы, вы можете рассчитывать z-балл для каждого слова в последнем подмножестве относительно общего текста.

Итак, если

t is number of occurrences of word in subset
o is number of occurrences of word overall
n_t is number of words in subset
n_o is number of words overall

затем вычислить:

p_hat = t / n_t
p_0 = o / n_o

z = (p_hat - p_0) / sqrt((p_0 * (1 - p_0)) / n_t)

Чем выше значение z, тем более статистически значимым является упоминание слова в подмножестве относительно общего текста. Это также можно использовать для вычисления слов, которые необычно встречаются в подмножестве относительно общего текста.

Ответ 3

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

Теоретически, анализируя частоту слов с течением времени, вы должны иметь возможность отфильтровывать шум (общие слова, такие как те, которые вы указали выше). Это не тривиально реализовать, но, безусловно, возможность.

Еще одна оценка заключалась бы в том, чтобы не концентрироваться на сыром количестве слов за определенный период времени, а скорее на структуре, в которой развиваются трендовые темы. Они обычно растут несколько экспоненциально, и должно быть возможно повторить результаты вашего существующего поиска, пытаясь применить фильтр, который отбрасывает все "горячие слова", которые не соответствуют этому роду.

Просто некоторые мысли: -)

изменить:

чтобы далее описать, что я имел в виду с фильтрацией по частоте, возможно, вам следует проверить словари, содержащие частотную информацию о словах. Это не так сложно построить, и с твердым текстовым корпусом (wikipedia можно скачать бесплатно, я использовал его для теста), вы получите замечательные хорошие результаты.

Ответ 4

Вот идея:

Вычислить среднюю частоту использования каждого слова на английском языке. Поместите их в таблицу поиска. Вероятно, вы захотите только сохранить самые распространенные слова. Выберите несколько слов (например, 5000) или минимальную частоту, что имеет смысл. Вероятно, вы все же хотите иметь список слов, которые вы никогда не показываете. Если вы сортируете свой список слов по частоте, вам не потребуется много времени, чтобы просмотреть их и выбрать, какие слова всегда исключать.

Чтобы вычислить частоту, вам понадобится образец ввода. Ваш выбор входной выборки повлияет на результат. Например, Twitter может использовать каждое сообщение в твиттере, которое когда-либо было опубликовано в качестве образца ввода. Темы, которые постоянно обсуждаются в Twitter (например, "Twitter" ), потеряют значение. Если вы хотите, чтобы темы, посвященные Twitter, сохраняли их значение, затем найдите еще один образец ввода.

Алгоритм вычисления частоты прост:

  • Для каждого слова в выборке:
    • Посмотрите, что слово в словаре
    • Добавьте один к счетчику, связанному с этим словом
  • Чтобы нормализовать данные, разделите частоту каждого слова на количество слов во входном примере.

Теперь, если вы используете тот же алгоритм на сегодняшних сообщениях в Twitter, вы можете сравнить сегодняшние частоты слов с ожидаемыми частотами слов.

Ответ 5

Здесь дешевый и веселый способ сделать это.

Каждые 2 часа создайте гистограмму ваших частот слов. Например;

Snow, 150
Britney, 100
The, 150000

Сохраните все эти файлы.

Каждый так часто захватывает 50 файлов из вашей истории и усредняет частоты. Это сглаживает тенденции, которые сложились с течением времени. Итак, из этих трех файлов:

Snow, 10
Britney, 95
...

Snow, 8
Britney, 100
...

Snow, 12
Britney, 105
...

вы получаете этот базовый набор;

Snow, 10
Britney, 100

Разработайте соотношение между этим набором базовой и самой последней;

Snow 1500%
Britney 100%

Ваши тенденции - это те, которые имеют самые высокие коэффициенты. Осторожно, чтобы разделить на нули здесь.

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

Изменить - с помощью этого алгоритма вам не нужно беспокоиться о словах остановки, потому что все они будут иметь относительно стабильные отношения, примерно на 100%, поэтому всегда будет скучно (например, вне тренд)

Ответ 6

То, что вы ищете, обычно называется stop word. Здесь сообщение в блоге со списком их (даже в формате массива PHP для вас) и еще текстовый файл.

Немного больше поисковых запросов должно найти вам другие примеры.

Несколько потенциальных идей для улучшения алгоритма в целом:

  • Весовое использование слова по времени. Вы уже делаете это, пересчитывая каждые 2 часа, но вы также можете указать точное время с тех пор, как слово также использовалось. Таким образом, вместо того, чтобы каждое упоминание слова стоило 1 "точка", это значение точки определялось временем в минутах, поскольку сообщение, содержащее его, было опубликовано.

  • Создайте таблицу базы данных слов и их среднюю частоту в сообщениях на вашем сайте. Когда вы просматриваете сообщения, созданные за последние X часов, сравните частоту слова со средней частотой в базе данных. Те слова, которые имеют частоту, значительно превышающую среднюю, будут считаться "горячими". Удостоверьтесь, что вы повторно вычисляете среднюю частоту слов на полурегулярной основе (раз в день, может быть?)

Ответ 7

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

Для фильтрации я предлагаю использовать черный список, если вы хотите сохранить его простым. Если вы хотите что-то более сложное, вы можете создать статистику, которая будет определять слова, которые используются довольно часто, которые затем фильтруются из вашего списка слов.

Для подсчета, сортировки и усечения фактического списка "трендов", я предлагаю следующее:

function buildTopTen($word = null)
{
    static $wordList = array();
    if (isset($word)) {
        if (!isset($wordList[$word])) {
            $wordList[$word] = 0;
        }
        $wordList[$word]++;
        return $wordList[$word];
    } else {
        arsort($wordList);
        return array_slice($wordList, 0, 10);
    }
}

Просто вызовите функцию с параметром слова, пока вы не закончите. Он даст вам текущий счет того одного слова взамен, если это вам пригодится.

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

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

Конечно, это всего лишь предложение и может быть уточнено гораздо дальше.

Ответ 8

Возможно, вам захочется исследовать использование Марковских цепей/Скрытых марковских моделей.

Эти математические модели были довольно успешными в обработке естественного языка.

Точность на тренд-темы будет намного выше. (И вы можете позволить ему учиться...)

Ответ 9

Возможно, вы захотите проверить NLTK (Natural Language Toolkit). Существует бесплатная книга, которая научит вас использовать ее в http://www.nltk.org/book. Единственный недостаток - это в python, и я предполагаю, что вам нужно решение PHP. Не будьте слишком напуганными, потому что книга не ожидает, что вы заранее узнаете какой-нибудь python.

NLKT настолько силен и определенно заслуживает внимания.

Ответ 10

Не проще ли сканировать каждую запись фида во время создания, а не делать большой массивный поиск каждые 2 часа?