N-граммы: Объяснение + 2 приложения

Я хочу реализовать некоторые приложения с n-граммами (желательно на PHP).


Какой тип n-граммов более подходит для большинства целей? Уровень слова или уровень n-грамма уровня символов? Как можно реализовать n-грамматический токенизатор в PHP?


Во-первых, я хотел бы знать, что такое N-граммы. Это верно? Это как я понимаю n-граммы:

Предложение: "Я живу в Нью-Йорке".

бирамы на уровне слов (2 для n): "# I", "Я живу", "живу в", "в Нью-Йорке", "NY #"

бирамы уровня персонажа (2 для n): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "in", "n #", "#N", "NY", "Y #"

Когда у вас есть этот массив n-грамм-частей, вы бросаете дубликаты и добавляете счетчик для каждой части, задающей частоту:

биграмы уровня слова: [1, 1, 1, 1, 1]

биграмы уровня персонажа: [2, 1, 1,...]

Правильно ли это?


Кроме того, я хотел бы узнать больше о том, что вы можете сделать с n-граммами:

  • Как я могу определить язык текста с помощью n-граммов?
  • Можно ли выполнять машинный перевод с использованием n-граммов, даже если у вас нет двуязычного корпуса?
  • Как создать спам-фильтр (спам, ветчина)? Объединить n-граммы с байесовским фильтром?
  • Как я могу найти тему? Например: есть ли текст о баскетболе или собаках? Мой подход (сделайте следующее со статьей Википедии для "собак" и "баскетбола" ): постройте векторы n-gram для обоих документов, нормализуйте их, вычислите расстояние Манхэттен/Евклида, чем ближе результат к 1, тем выше будет сходство

Как вы относитесь к моему приложению, особенно к последнему?


Надеюсь, ты поможешь мне. Спасибо заранее!

Ответ 1

Word n-gram, как правило, будут более полезны для большинства приложений для текстового анализа, о которых вы упомянули, за возможным исключением определения языка, где нечто вроде символьных триграмм может дать лучшие результаты. Эффективно, вы бы создали вектор n-грамм для тела текста на каждом языке, который вас интересует, и затем сравните частоты триграмм в каждом корпусе с триграммами в документе, который вы классифицируете. Например, триграмма the, вероятно, появляется гораздо чаще на английском языке, чем на немецком, и обеспечит некоторый уровень статистической корреляции. После того, как у вас есть документы в формате n-gram, у вас есть выбор для многих алгоритмов для дальнейшего анализа, Baysian Filters, N Nearest Neighbor, Support Vector Machines и т.д.

Из упомянутых вами приложений машинный перевод, вероятно, самый надуманный, поскольку только n-граммы не приведут вас очень далеко по пути. Преобразование входного файла в представление n-gram - это всего лишь способ поместить данные в формат для дальнейшего анализа функций, но по мере того, как вы теряете много контекстуальной информации, это может быть не полезно для перевода.

Одна вещь, на которую следует обратить внимание, заключается в том, что недостаточно создать вектор [1,1,1,2,1] для одного документа и вектор [2,1,2,4] для другого документа, если размеры не совпадают. То есть первая запись в векторе не может быть the в одном документе и is в другом, или алгоритмы не будут работать. Вы завершите работу с такими векторами, как [0,0,0,0,1,1,0,0,2,0,0,1], так как большинство документов не будут содержать больше n-граммов, которые вас интересуют. Эта "подкладка" а также требует, чтобы вы заранее определили, какие ngrams вы будете включать в свой анализ. Часто это реализуется как двухпроходный алгоритм, чтобы сначала решить статистическую значимость различных n-граммов, чтобы решить, что сохранить. Google 'feature selection' для получения дополнительной информации.

Основанные на словах n-граммы плюс поддержка векторных машин в отличном способе для определения темы, но для подготовки классификатора вам нужен большой корпус текста, предварительно классифицированный по теме "по теме" и "вне темы". Вы найдете большое количество исследовательских работ, объясняющих различные подходы к этой проблеме на сайте, например citeseerx. Я бы не рекомендовал эвклидово-дистанционный подход к этой проблеме, так как он не взвешивает отдельные n-граммы на основе статистической значимости, поэтому два документа, которые включают в себя the, a, is и of, будут считалось лучшим совпадением, чем два документа, которые включали Baysian. Удаление стоп-слов из ваших n-грамм интереса немного улучшило бы это.

Ответ 2

Вы правильно относитесь к определению n-граммов.

Вы можете использовать n-граммы уровня слова для приложений типа поиска. Уровень n-граммов уровня символов можно использовать больше для анализа самого текста. Например, чтобы идентифицировать язык текста, я использовал бы частоты букв по сравнению с установленными частотами языка. То есть текст должен примерно соответствовать частоте появления букв на этом языке.

n-грамматический токенизатор для слов в PHP может быть выполнен с использованием strtok:

http://us2.php.net/manual/en/function.strtok.php

Для символов используйте split:

http://us2.php.net/manual/en/function.str-split.php

Затем вы можете просто разбить массив так, как вам угодно, на любое количество n-граммов.

Байесовские фильтры необходимо обучать для использования в качестве спам-фильтров, которые могут использоваться в сочетании с n-граммами. Однако вам нужно дать ему много вклада, чтобы он учился.

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