Здравствуйте, Михаил.<div><br></div><div>Я совсем не специалист и вполне возможно, могу ошибаться в своем мнении, но попробую ответить, вдруг чем-то помогу.<br><br><div class="gmail_quote">2009/1/24 Михаил Монашёв <span dir="ltr">&lt;<a href="mailto:postmaster@softsearch.ru">postmaster@softsearch.ru</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">А &nbsp;что такое корпус? Это список из слов и их частот? Или там ещё связи<br>
между словами есть?</blockquote><div><br></div><div>Нет, список слов и их частот обычно примерно так и называют -- список частотности слов, частотный словарь и т. д. По английски это frequency list.</div><div><br></div><div>
Корпус же состоит не из отдельных слов, а из текстов, взятых из разных источников (чтобы охватить как можно больше различных вариантов словоупотребления). Для всех этих текстов делается дополнительная разметка. Разметка может включать в себя самую разнообразную информацию: о том, к какому контексту принадлежит текст/предложение (разговорный, поэтический, деловой и т. д.), морфологический разбор входящих в предложение слов (проставлена часть речи, падеж и т. п.), семантическая разметка (например, слова &quot;он&quot;, &quot;Иванов&quot; будут размечены как &quot;человек&quot;), синтаксическая разметка (структура предложения представленная в виде дерева, treebank).</div>
<div><br></div><div>В качестве примера можете зайти на <a href="http://ruscorpora.ru/">http://ruscorpora.ru/</a></div><div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Что можно с корпусом делать в теории?</blockquote><div><br></div><div>Много чего можно. Можно составлять те же словари широко и редко распостраненных слов. (А уж как вы будете это использовать -- только вам известно. Можно словарь выпустить для обучающихся этому языку, а можно верхушку срезать и использовать как стоп-слова при определении ключевых слов). Можно считать статистику употребления различных словоформ, выделять какие-то устойчивые сочетания и т. д. В общем собирать различную статистику. Этим занимается дисциплина, которая называется корпусная лингвистика.</div>
<div><br></div><div>В большинстве прикладных задач, которые приходится решать программистам (классификация, кластеризация текстов, схожесть текстов), сейчас, как вы наверняка знаете, используется модель &#39;bag-of-words&#39; -- когда каждый текст мы рассматриваем, как набор слов и количество упоминаний этих слов, при этом делается два допущения: 1) что словоформа не важна (используем стеммер) 2) что все слова независимы, порядок не важен.</div>
<div><br></div><div>Для каких-то задач такой подход удовлетворителен (вспомните первые байесовские фильтры для отсеивания спама), в каких-то задачах требуется лучшее понимание структуры текста, тут нам и может помочь корпус. В качестве примера можно рассмотреть систему машинного перевода Google.</div>
<div>Если упрощенно, то у них есть параллельный корпус для двух заданных языков и просто корпуса этих языков. Параллельный корпус используется для того, чтобы выбрать разные варианты перевода очередного слова. Теперь представим, что у нас есть четыре переведенных слова и есть варианты перевода для пятого слова. Тогда мы на основе корпуса языка, на который мы переводим, считаем вероятность появления каждого варианта и подставляем самый удачный, а начало цепочки сдвигаем на одно слово. Это, конечно, очень-очень упрощенно.</div>
<div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Мне &nbsp;видится, &nbsp;что &nbsp;можно &nbsp;как-то &nbsp;посчитать близость текста и корпуса<br>
слов. Вот только как правильно это сделать?</blockquote><div><br></div><div>А зачем это делать? Чтобы узнать, принадлежит ли текст тому или иному языку? Ну, если в этом корпусе действительно только слова, а не тексты, то наверное это имеет смысл. Думаю, что найти такие готовые списки слов для основных языков не очень сложно. Но в то же время кажется, что есть какие-то более удобные/интересные алгоритмы.</div>
<div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Можно, &nbsp;наверное, взять совпадающие слова и в многомерном пространстве<br>
из &nbsp;них &nbsp;посчитать &nbsp;угол между многомерным вектором корпуса и вектором<br>
текста. &nbsp; Слово &nbsp; - &nbsp;это &nbsp;измерение. &nbsp;Частота &nbsp;слова &nbsp;- &nbsp;это &nbsp;значение<br>
координаты, &nbsp;отложенное &nbsp;в &nbsp;этом &nbsp;измерении. &nbsp;Так &nbsp;правильно &nbsp;близость<br>
текстов &nbsp; считать? &nbsp; Нужно &nbsp; ли &nbsp;слова &nbsp;предварительно &nbsp;через &nbsp;стеммер<br>
пропускать? Или вместо слов лучше шинглы использовать?</blockquote><div><br></div><div>Обычно так примерно и делают, считают косинус между этими векторами.</div><div>В качестве значений координаты наверное все-таки лучше использовать tf (idf здесь не нужен: по причине того, что мы используем сам корпус для сравнения, idf для терма из документа и idf для того же терма из корпуса будут совпадать). Если так не сделать, то будет зависимость от длины текста и не очень хорошо будут учитываться документы на смешанных языках, это нехорошо.</div>
<div><br></div><div>Вообще, для подсчета весов терма есть куча других формул, надо искать по слову term-weighting.</div><div>Формулы для схожести тоже разные есть. Например, часто используется формула Okapi. Искать надо по чему-то типа text similarity measurement, relevance score и т. д.</div>
<div><br></div><div>Да, через стеммер пропускать надо.</div><div>Шинглы при таком подходе, как мне кажется, неудобно использовать. Их удобно использовать, когда у нас есть два конкретных документа (а не документ и большой корпус) и мы хотим посмотреть, насколько близки друг к другу эти документы, то есть можно с их помощью искать дубликаты или цитаты одного документа в другом.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Можно &nbsp; ли &nbsp; на &nbsp; коллекции &nbsp; разных &nbsp;текстов &nbsp;сделать &nbsp;автоматическое<br>
тематическое разбиение этих текстов, заранее не зная о чём они? Скажем<br>
нужно &nbsp;разбить &nbsp;коллекцию &nbsp;на &nbsp;100 &nbsp;тематических групп. Как эти группы<br>
выделить?</blockquote><div><br></div><div>Можно. Называется кластеризация. Если бы что-то знали и могли бы чему-то предварительно обучить нашу программу, то тогда это был бы классификатор. Думаю, пытаться писать об этом в письме бессмысленно. О кластеризации (обзорно) пишут в книгах по data mining, подробно -- в книгах о кластерном анализе. О том, какие подходы лучше выбирать для текста, пишут в книгах о text mining.</div>
<div>Если сходить по этой ссылке:&nbsp;<a href="http://www.amazon.com/Text-Mining-Handbook-Approaches-Unstructured/dp/0521836573/ref=pd_bxgy_b_img_b">http://www.amazon.com/Text-Mining-Handbook-Approaches-Unstructured/dp/0521836573/ref=pd_bxgy_b_img_b</a></div>
<div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">P.S.<br>
Посоветуйте &nbsp;хороший &nbsp;бесплатный &nbsp;стеммер, &nbsp;который &nbsp;бы &nbsp;справлялся &nbsp;с<br>
неизвестными ему словами русского и английского языков.</blockquote><div><br></div><div>Для русского языка посмотрите на mystem --&nbsp;<a href="http://company.yandex.ru/technology/mystem/">http://company.yandex.ru/technology/mystem/</a></div>
<div>Он бесплатный, с неизвестными словами русского языка справляется. Насколько он &quot;хороший&quot; судить не берусь -- с другими стеммерами не сравнивал.&nbsp;</div><div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
VS&gt; Мысль сделать автоматическую добавлялку фидов.<br>
<br>
VS&gt; Также есть Мысля, что мы таки сделаем language detection.<br>
<br>
VS&gt; Киньте ссылок на блоги, там где про перл на разных языках, мне нужен<br>
VS&gt; корпус языков для самообучения,<br>
VS&gt; Сдаётся мне, что десяток языков я выделить смогу.<br></blockquote></div><br></div><div>О, черт. При первом прочтении письма я плохо прочитал то, что тут пишет Ваня Сережкин. Иначе по-другому ответил бы. Ну все равно, пусть будет.</div>