Mystem
mystem — морфологический анализатор русского языка с поддержкой снятия морфологической неоднозначности, разработанный Ильёй Сегаловичем в компании «Яндекс». Программа работает на основе словаря и способна формировать морфологические гипотезы о незнакомых словах[1].
Доступность
Условия использования и распространения программы mystem приведены в лицензионном соглашении[2].
Исходный код mystem закрыт и принадлежит ООО «ЯНДЕКС». Программа доступна как для некоммерческого, так и для коммерческого использования, за исключением трёх случаев, оговорённых в лицензии:
- в целях создания и распространения спама и массовых рассылок;
- в целях поисковой оптимизации в Интернете (SEO);
- в целях разработки программного обеспечения, конкурирующего с продуктами «Яндекса».
Сведения об установке программы автоматически отправляются в «Яндекс» в соответствии с пунктом 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))
}
}

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.
