[Moscow.pm] Корпус слов

Yury Zavarin yury.zavarin на gmail.com
Сб Янв 24 06:45:05 PST 2009


Здравствуйте, Михаил.
Я совсем не специалист и вполне возможно, могу ошибаться в своем мнении, но
попробую ответить, вдруг чем-то помогу.

2009/1/24 Михаил Монашёв <postmaster на softsearch.ru>

> А  что такое корпус? Это список из слов и их частот? Или там ещё связи
> между словами есть?


Нет, список слов и их частот обычно примерно так и называют -- список
частотности слов, частотный словарь и т. д. По английски это frequency list.

Корпус же состоит не из отдельных слов, а из текстов, взятых из разных
источников (чтобы охватить как можно больше различных вариантов
словоупотребления). Для всех этих текстов делается дополнительная разметка.
Разметка может включать в себя самую разнообразную информацию: о том, к
какому контексту принадлежит текст/предложение (разговорный, поэтический,
деловой и т. д.), морфологический разбор входящих в предложение слов
(проставлена часть речи, падеж и т. п.), семантическая разметка (например,
слова "он", "Иванов" будут размечены как "человек"), синтаксическая разметка
(структура предложения представленная в виде дерева, treebank).

В качестве примера можете зайти на http://ruscorpora.ru/


> Что можно с корпусом делать в теории?


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

В большинстве прикладных задач, которые приходится решать программистам
(классификация, кластеризация текстов, схожесть текстов), сейчас, как вы
наверняка знаете, используется модель 'bag-of-words' -- когда каждый текст
мы рассматриваем, как набор слов и количество упоминаний этих слов, при этом
делается два допущения: 1) что словоформа не важна (используем стеммер) 2)
что все слова независимы, порядок не важен.

Для каких-то задач такой подход удовлетворителен (вспомните первые
байесовские фильтры для отсеивания спама), в каких-то задачах требуется
лучшее понимание структуры текста, тут нам и может помочь корпус. В качестве
примера можно рассмотреть систему машинного перевода Google.
Если упрощенно, то у них есть параллельный корпус для двух заданных языков и
просто корпуса этих языков. Параллельный корпус используется для того, чтобы
выбрать разные варианты перевода очередного слова. Теперь представим, что у
нас есть четыре переведенных слова и есть варианты перевода для пятого
слова. Тогда мы на основе корпуса языка, на который мы переводим, считаем
вероятность появления каждого варианта и подставляем самый удачный, а начало
цепочки сдвигаем на одно слово. Это, конечно, очень-очень упрощенно.


> Мне  видится,  что  можно  как-то  посчитать близость текста и корпуса
> слов. Вот только как правильно это сделать?


А зачем это делать? Чтобы узнать, принадлежит ли текст тому или иному языку?
Ну, если в этом корпусе действительно только слова, а не тексты, то наверное
это имеет смысл. Думаю, что найти такие готовые списки слов для основных
языков не очень сложно. Но в то же время кажется, что есть какие-то более
удобные/интересные алгоритмы.


> Можно,  наверное, взять совпадающие слова и в многомерном пространстве
> из  них  посчитать  угол между многомерным вектором корпуса и вектором
> текста.   Слово   -  это  измерение.  Частота  слова  -  это  значение
> координаты,  отложенное  в  этом  измерении.  Так  правильно  близость
> текстов   считать?   Нужно   ли  слова  предварительно  через  стеммер
> пропускать? Или вместо слов лучше шинглы использовать?


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

Вообще, для подсчета весов терма есть куча других формул, надо искать по
слову term-weighting.
Формулы для схожести тоже разные есть. Например, часто используется формула
Okapi. Искать надо по чему-то типа text similarity measurement, relevance
score и т. д.

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

Можно   ли   на   коллекции   разных  текстов  сделать  автоматическое
> тематическое разбиение этих текстов, заранее не зная о чём они? Скажем
> нужно  разбить  коллекцию  на  100  тематических групп. Как эти группы
> выделить?


Можно. Называется кластеризация. Если бы что-то знали и могли бы чему-то
предварительно обучить нашу программу, то тогда это был бы классификатор.
Думаю, пытаться писать об этом в письме бессмысленно. О кластеризации
(обзорно) пишут в книгах по data mining, подробно -- в книгах о кластерном
анализе. О том, какие подходы лучше выбирать для текста, пишут в книгах о
text mining.
Если сходить по этой ссылке:
http://www.amazon.com/Text-Mining-Handbook-Approaches-Unstructured/dp/0521836573/ref=pd_bxgy_b_img_b


> P.S.
> Посоветуйте  хороший  бесплатный  стеммер,  который  бы  справлялся  с
> неизвестными ему словами русского и английского языков.


Для русского языка посмотрите на mystem --
http://company.yandex.ru/technology/mystem/
Он бесплатный, с неизвестными словами русского языка справляется. Насколько
он "хороший" судить не берусь -- с другими стеммерами не сравнивал.


> VS> Мысль сделать автоматическую добавлялку фидов.
>
> VS> Также есть Мысля, что мы таки сделаем language detection.
>
> VS> Киньте ссылок на блоги, там где про перл на разных языках, мне нужен
> VS> корпус языков для самообучения,
> VS> Сдаётся мне, что десяток языков я выделить смогу.
>

О, черт. При первом прочтении письма я плохо прочитал то, что тут пишет Ваня
Сережкин. Иначе по-другому ответил бы. Ну все равно, пусть будет.
----------- следущая часть -----------
Вложение в формате HTML было извлечено&hellip;
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20090124/673c6ee3/attachment-0001.html>


Подробная информация о списке рассылки Moscow-pm