Я хочу реализовать некоторые приложения с n-граммами (желательно на PHP).
Какой тип n-граммов более подходит для большинства целей? Уровень слова или уровень n-грамма уровня символов? Как вы могли бы реализовать n-gram-токенизатор в PHP?
Во-первых, я хотел бы знать, что такое N-граммы. Это верно? Вот как я понимаю n-граммы:
Предложение: «Я живу в Нью-Йорке».
(2 для n): «Я», «Я живу», «Живу в», «В Нью-Йорке», «Нью-Йорк»,
(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-граммами:
Что вы думаете о моем приложении, особенно о последнем?
Я надеюсь, что вы можете мне помочь. Заранее спасибо!
Word n-gram, как правило, будут более полезны для большинства приложений для анализа текста, которые вы упомянули, за исключением исключения языка, где нечто вроде символьных триграмм может дать лучшие результаты. Эффективно, вы бы создали вектор n-грамм для тела текста на каждом языке, который вас интересует, и затем сравните частоты триграмм в каждом корпусе с триграммами в документе, который вы классифицируете. Например, триграмма, вероятно, появляется гораздо чаще на английском языке, чем на немецком, и обеспечит некоторый уровень статистической корреляции. После того, как у вас есть документы в формате n-грамм, у вас есть выбор многих алгоритмов для дальнейшего анализа, Baysian Filters, N Nearest Neighbor, Support Vector Machines и т. Д.
Из приложений, которые вы упомянули, машинный перевод, вероятно, самый надуманный, поскольку только n-граммы не приведут вас очень далеко по пути. Преобразование входного файла в представление n-gram – это просто способ поместить данные в формат для дальнейшего анализа функций, но по мере того, как вы теряете много контекстуальной информации, это может быть не полезно для перевода.
Одна вещь, о которой следует помнить, заключается в том, что недостаточно создать вектор [1,1,1,2,1] для одного документа и вектор [2,1,2,4] для другого документа, если размеры не совпадают. То есть первая запись в векторе не может быть в одном документе и 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
, и будут рассматриваться лучше, чем два документа, которые оба включены Baysian
. Удаление стоп-слов из ваших n-граммов интереса улучшило бы это несколько.
Вы правильно относитесь к определению 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-граммы кажутся хорошей отправной точкой для этого.