Mystem

Материал из NLPub
Перейти к: навигация, поиск

mystem — морфологический анализатор русского языка с поддержкой снятия морфологической неоднозначности, разработанный Ильёй Сегаловичем в компании «Яндекс». Программа работает на основе словаря и способна формировать морфологические гипотезы о незнакомых словах[1].

Доступность

Условия использования и распространения программы mystem приведены в лицензионном соглашении[2].

Исходный код mystem закрыт и принадлежит ООО «ЯНДЕКС». Программа доступна как для некоммерческого, так и для коммерческого использования, за исключением трёх случаев, оговорённых в лицензии:

  1. в целях создания и распространения спама и массовых рассылок;
  2. в целях поисковой оптимизации в Интернете (SEO);
  3. в целях разработки программного обеспечения, конкурирующего с продуктами «Яндекса».

Сведения об установке программы автоматически отправляются в «Яндекс» в соответствии с пунктом 3.1.1 лицензионного соглашения.

Установка

Достаточно скачать и распаковать архив с сайта программы.

Использование

Командная строка

На сайте программы имеется подробная документация о параметрах командной строки и используемом тагсете.

При использовании mystem важно выставить правильную кодировку, например UTF-8.

% echo 'Привет, как дела?' | ./mystem -e UTF-8 -gni 
Привет{привет=S,муж,неод=(им,ед|вин,ед)}
как{как=PART=|как=ADVPRO=|как=CONJ=}
дела{девать=V=прош,ед,изъяв,жен,сов|дело=S,сред,неод=(им,мн|род,ед|вин,мн)}

С версии 3.0 появился ключ -d, включающий режим снятия морфологической неоднозначности.

% echo 'Привет, как дела?' | ./mystem -e UTF-8 -gnid
Привет{привет=S,муж,неод=(вин,ед|им,ед)}
как{как=CONJ=}
дела{дело=S,сред,неод=(вин,мн|род,ед|им,мн)}

GATE

Существует плагин для GATE mystem-morphtagger, который позволяет интегрировать анализатор в приложение на Java.

Java

Библиотека mystem-scala доступна для Java, Scala и других языков на платформе JVM. Для подключения достаточно добавить в список зависимостей в pom.xml, либо самостоятельно загрузить библиотеку из центрального репозитория.

<dependency>
  <groupId>ru.stachek66.nlp</groupId>
  <artifactId>mystem-scala</artifactId>
  <version>0.1.4</version>
</dependency>

Пример использования (также см. рекомендации в README):

import ru.stachek66.nlp.mystem.holding.Factory;
import ru.stachek66.nlp.mystem.holding.MyStem;
import ru.stachek66.nlp.mystem.holding.MyStemApplicationException;
import ru.stachek66.nlp.mystem.holding.Request;
import ru.stachek66.nlp.mystem.model.Info;
import scala.Option;
import scala.collection.JavaConversions;

import java.io.File;

public class MyStemJavaExample {

    private final static MyStem mystemAnalyzer =
            new Factory("-igd --eng-gr --format json --weight")
                    .newMyStem("3.0", Option.<File>empty()).get();

    public static void main(final String[] args) throws MyStemApplicationException {

        final Iterable<Info> result =
                JavaConversions.asJavaIterable(
                        mystemAnalyzer
                                .analyze(Request.apply("И вырвал грешный мой язык"))
                                .info()
                                .toIterable());

        for (final Info info : result) {
            System.out.println(info.initial() + " -> " + info.lex() + " | " + info.rawResponse());
        }
    }
}

Python

Библиотека pymystem3 предоставляет программный интерфейс к анализатору для языка программирования Python. Для работы с ней необходимо установить пакет pymystem3.

% pip install pymystem3

Исполняемые файлы анализатора для текущей операционной системы будут автоматически загружены и установлены при первом использовании библиотеки.

% python
Python 2.7.5 (default, Jun 25 2014, 10:19:55) 
[GCC 4.8.2 20131212 (Red Hat 4.8.2-7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pymystem3 import Mystem
>>> mystem = Mystem()
Installing mystem to /home/dmchk/.local/bin/mystem from http://download.cdn.yandex.net/mystem/mystem-3.0-linux3.1-64bit.tar.gz

Экземпляр класса Mystem предоставляет метод lemmatize, вызывающий mystem с соответствующими параметрами.

% python
Python 2.7.5 (default, Jun 25 2014, 10:19:55) 
[GCC 4.8.2 20131212 (Red Hat 4.8.2-7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pymystem3 import Mystem
>>> mystem = Mystem()
>>> text = 'Как насчёт небольшого стемминга'
>>> lemmas = mystem.lemmatize(text)
>>> print(''.join(lemmas))
как насчет небольшой стемминг

Альтернативный вариант

Также существует библиотека python-mystem, взаимодействующая с mystem через FFI интерфейс

from mystem import analyze

text = "Иван Иванович Иванов приехал в Санкт-Петербург"
for word in text.split(" "):
    with analyze(word) as result:
        print(result[0].form, 
             "({0})".format(result[0]),
             result[0].stem_grammemes, 
             result[0].flex_grammemes
        )

>> иван (иван) [<Grammeme.Substantive: 136>, <Grammeme.FirstName: 155>, <Grammeme.Masculine: 192>, <Grammeme.Animated: 201>] ...
>> иванович (иванович) [<Grammeme.Substantive: 136>, <Grammeme.Patr: 157>, <Grammeme.Masculine: 192>] ...
>> иванов (иванов) [<Grammeme.Substantive: 136>, <Grammeme.Surname: 156>, <Grammeme.Masculine: 192>, <Grammeme.Animated: 201>] ...
>> приехал (приезжать) [<Grammeme.Verb: 137>, <Grammeme.Intransitive: 206>] ...
>> в (в) [<Grammeme.Preposition: 135>] ...
>> санкт-петербург (санкт-петербург) [<Grammeme.Substantive: 136>, <Grammeme.Geo: 158>] ...

Go

Библиотека mystem, доступна для Go 1.6+

package main

import (
    "fmt"
)

import "github.com/dveselov/mystem"

func main() {
    analyses := mystem.NewAnalyses("маша")
    defer analyses.Close()
    fmt.Println(fmt.Sprintf("Analyze of '%s':", "маша"))
    for i := 0; i < analyses.Count(); i++ {
        lemma := analyses.GetLemma(i)
        grammemes := lemma.StemGram()
        fmt.Println(fmt.Sprintf("%d. %s - %v", i+1, lemma.Text(), grammemes))
    }
}

Ссылки

См. также

Примечания

  1. I. Segalovich (2003), A fast morphological algorithm with unknown word guessing induced by a dictionary for a web search engine
  2. Лицензионное соглашение.