Стеммеры Snowball на C# — free download

В любой области деятельности человека, есть какие-то базовые вещи, которые должен знать и уметь тот, кто считает себя здесь специалистом. Одной из таких важных и нужных вещей в области компьютерной лингвистики, является операция приведения слова к основной форме — лемматизация. Она позволяет объединить различные словоформы одного и того же слова и далее работать с их общей статистикой, искать в любом падеже, числе и т.п.

Наиболее качественно процесс лемматизации производят словарные морфологические движки. Для большинства языков помимо английского, такие движки обычно платны. Либо написаны на C++. Либо есть другие ограничения, которые делают их использование на C# не очень удобным.

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

Самым известным проектом стемминга, является, пожалуй, Snowball. Очень важным моментом является то, что исходные коды данного проекта даются под лицензией BSD — т.е., с ними можно делать что угодно. Немного портит впечатление только то, что стеммеры генерируются для двух языков программирования — C++ и Java. В свое время, компания Iveonik провела адаптацию данного набора стеммеров для платформы C#. Часть уже была портирована и находилась на разных сайтах по одиночке. Часть была портирована нами с языка Java. Этот язык был выбран, поскольку по набору функционала является в основном подмножеством по отношению к C#. Далее стеммеры были «причесаны», чтобы ими было удобнее пользоваться в единообразном стиле.

И вот настал момент, когда мы решили поделиться этим набором так же, как с нами когда-то поделились разработчики Snowball и другие, часто безымянные авторы.

Исходные коды стеммеров и простой пример их использования вы можете найти по этой ссылке.

Демо разбито на два проекта — собственно набор стеммеров (StemmersNet.csproj) и консольный пример использования трех стеммеров, для русского, английского и немецкого языков. Всего же в паке лежат стеммеры для 14 языков: Чешский, Датский, Голландский, Английский, Финский, Французский, Немецкий, Венгерский, Итальянский, Норвежский, Португальский, Румынский, Русский и Испанский.

Для того, чтобы воспользоваться любым из стеммеров, вам необходимо:

1. Добавить ссылку на проект StemmersNet в свой проект.
2. Использовать пространство имен Iveonik.Stemmers.
3. Создать экземпляр стеммера для нужного языка (языков).
4. Для преобразования в стем использовать метод IStemmer.Stem.

Вот, как это сделано в тестовом примере:

namespace Iveonik.Stemmers
{
  class Program
  {
    static void Main(string[] args)
    {
      TestStemmer(new RussianStemmer(), "краcОта", "красоту", "красоте", "КрАсОтОй");
      TestStemmer(new EnglishStemmer(), "jump", "jumping", "jumps", "jumped");
      TestStemmer(new GermanStemmer(), "mochte", "mochtest", "mochten", "mochtet");
      Console.ReadKey();
    }

    private static void TestStemmer(IStemmer stemmer, params string[] words)
    {
      Console.WriteLine("Stemmer: " + stemmer);
      foreach (string word in words)
      {
        Console.WriteLine(word + " --> " + stemmer.Stem(word));
      }
    }
  }
}

И вот что получаем:

Stemmer: Iveonik.Stemmers.RussianStemmer
краcОта --> краcот
красоту --> красот
красоте --> красот
КрАсОтОй --> красот
Stemmer: Iveonik.Stemmers.EnglishStemmer
jump --> jump
jumping --> jump
jumps --> jump
jumped --> jump
Stemmer: Iveonik.Stemmers.GermanStemmer
mochte --> mocht
mochtest --> mocht
mochten --> mocht
mochtet --> mochtet

Здесь хорошо видно, чем отличаются стеммеры от словарных лемматизаторов:

1. Как правило, на выходе стеммера мы имеем не основную форму слова (лемму), а какую-то обрезанную строку, в которой исходное слово угадывается, но не более того.

2. Даже для распространенных слов, набор эвристических правил может давать сбои. Что мы видим на примере для немецкого языка (стем для последней формы «mochtet» не соответствует остальным формам).

И все же, лемматизаторы имеют право на существование. Они малы по размеру, написаны полностью на C# (в нашем случае). И их качество вполне дает возможность решать многие задачи, стоящие перед практической компьютерной лингвистикой. Enjoy it!

Еще раз повторю основные ссылки:

1. Оригинальные стеммеры проекта Snowball.
2. Портированные на C# стеммеры с примером использования.

Комментарии (3) на “Стеммеры Snowball на C# — free download”

  1. […] Snowball stemmers on C# ­­­– free download 05.08.2011 |  Сергей Сотник |  Алгоритмы |  Нет комментариев » var addthis_product = 'wpp-257'; var addthis_config = {"data_track_clickback":true};This is translation of the original post in Russian. […]

  2. avatar Aram:

    Translated by google:
    Привет. Я пытаюсь конвертировать turkishstemmer.java к Csharp но мне кажется, я потерял. Есть ли способ, чтобы сделать снежный ком генерировать CSharp код для данного языка. (шт. Я не знаю, о турецкой правила грамматики)

    спасибо

    Hi. I am trying to convert the turkishstemmer.java to Csharp but it seems i’m lost. Is there any way to make snowball generate csharp code for this language. (ps. I don’t know about turkish rules of grammar)

    Thank you

Оставить комментарий

Вы должны авторизоваться для отправки комментария.