2009-06-23 5 views
16

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


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


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

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

биграммы уровня слово (2 для п): «# Я», "Я живу", "жить в", "в Нью-Йорке", 'Нью-Йорк #'

биграмм уровня персонажа (2 для п): «#I», «I #», «#l», «li», «iv», «ve», «e #», «#i», «in», «n #», «#N», «Нью-Йорк», «Y #»

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

слова: [1 , 1, 1, 1, 1]

уровень персонажа bigrams: [2, 1, 1, ...]

Это правильно?


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

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

Что вы думаете о моем приложении, особенно в последнем?


Надеюсь, вы можете мне помочь. Заранее спасибо!

+0

Существует библиотека PHP, которая делает это для вас: https://packagist.org/packages/drupol/phpngrams –

ответ

23

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

Из приложений, которые вы упомянули, машинный перевод вероятно, самый надуманный, поскольку только 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-граммов интереса улучшило бы это несколько.

+0

Большое спасибо за этот подробный ответ! У меня еще один последний вопрос: в чем преимущество n-граммов для векторов над простыми словами для векторов? Я имею в виду: Почему вы должны разделить «Я живу в Нью-Йорке» на «Я живу, живу в Нью-Йорке», а не просто «Я, живу, в Нью-Йорке»? – caw

+4

Использование слов как функций равнозначно n-граммовым на основе слова с n = 1. Преимущество увеличения n заключается в увеличении контекста в ваших функциях. например, зная, что два документа включают в себя n-грамм «Кто», может быть полезнее, чем знать, что оба они включают «The» и «Who» отдельно. – bdk

+0

Спасибо! :) Теперь понятно ... – caw

2

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

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

N-грамм токенизатор слов в PHP можно сделать с помощью strtok:

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

Для символов использовать раскол:

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

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

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

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

+0

Спасибо.Я думаю, что strtok слишком прост для хорошей токенизации, так как вам нужно будет добавить много токенов, таких как: пробел, запятая, точка, подчеркивание, скобки и т. Д. Но первый абзац, варианты использования, действительно полезен. Благодаря! :) – caw