Libpostal - это библиотека C для анализа/нормализации уличных адресов по всему миру с использованием статистического NLP и открытых данных. Цель этого проекта-понять строки, основанные на местоположении на каждом языке, везде. Для более полного обзора исследования Libpostal, обязательно ознакомьтесь с (длинными) вступительными сообщениями в блоге:
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
Адреса и местоположения, которые они представляют, важны для любого приложения, посвященного картам (поиск по месту, транспортировку, услуги по требованию/доставке, проверки, обзоры). Тем не менее, даже самые простые адреса заполнены местными соглашениями, сокращениями и контекстом, что затрудняет эффективное индекс/запрос с традиционными полнотекстовыми поисковыми системами. Эта библиотека помогает преобразовать адреса свободной формы, которые люди используют в чистые нормализованные формы, подходящие для сравнения машин и полнотекстового индексации. Хотя Libpostal сам по себе не является полным геокодером, его можно использовать в качестве шага предварительной обработки, чтобы сделать любое геокодирующее приложение более умным, более простым и более последовательным на международном уровне.
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
Основная библиотека написана в чистых языковых привязках для Python, Ruby, Go, Java, PHP и Nodejs, официально поддерживаются, и легко писать привязки на других языках.
Если ваша компания использует Libpostal, подумайте о том, чтобы попросить вашу организацию спонсировать проект. Интерпретация того, что люди означают, когда они ссылаются на местоположения, далека от решения, и спонсорство помогает нам преследовать новые границы в геопространственном НЛП. В качестве спонсора, логотип вашей компании появится на странице Github Repo вместе со ссылкой на ваш сайт. Спонсорская информация
Отдельные пользователи также могут помочь поддержать открытые исследования Geo NLP, сделав ежемесячное пожертвование:
Перед установкой убедитесь, что у вас есть следующие предпосылки:
На Ubuntu/Debian
sudo apt-get install curl autoconf automake libtool pkg-config
На Centos/Rhel
sudo yum install curl autoconf automake libtool pkgconfig
На Mac Osx
brew install curl autoconf automake libtool pkg-config
Затем установить библиотеку C:
Если вы используете Mac M1, добавьте --disable-sse2 в команду ./configure . Это приведет к более низкой производительности, но сборка будет успешной.
git clone https://github.com/openvenues/libpostal
cd libpostal
./bootstrap.sh
./configure --datadir=[...some dir with a few GB of space...]
make -j4
sudo make install
# On Linux it's probably a good idea to run
sudo ldconfig
Libpostal имеет поддержку PKG-Config, поэтому вы можете использовать PKG-Config для печати флагов, необходимых для связи вашей программы против нее:
pkg-config --cflags libpostal # print compiler flags
pkg-config --libs libpostal # print linker flags
pkg-config --cflags --libs libpostal # print both
Например, если вы пишете программу с именем app.c, вы можете скомпилировать ее так:
gcc app.c `pkg-config --cflags --libs libpostal`
Msys2/mingw
Для Windows процедура сборки в настоящее время требует MSYS2 и Mingw. Это может быть загружено с http://msys2.org. Пожалуйста, следуйте инструкциям на веб -сайте MSYS2 для установки.
Пожалуйста, убедитесь, что MSYS2 в курсе работы:
pacman -Syu
Установите следующие предпосылки:
pacman -S autoconf automake curl git make libtool gcc mingw-w64-x86_64-gcc
Затем создать библиотеку C:
git clone https://github.com/openvenues/libpostal
cd libpostal
cp -rf windows/* ./
./bootstrap.sh
./configure --datadir=[...some dir with a few GB of space...]
make -j4
make install
Примечания: При настройке DataDir диск C: введен как /c . Скрипт сборки Libpostal автоматически добавляет libpostal на конце пути, поэтому '/c' станет C:libpostal on Windows.
Скомпилированный .dll будет в src/.libs/ Directory и должен называться libpostal-1.dll .
Если вам нужна библиотека импорта .LIB, чтобы связать это с вашим приложением. Вы можете генерировать один, используя инструмент Visual Studio lib.exe и файл определения libpostal.def :
lib.exe /def:libpostal.def /out:libpostal.lib /machine:x64
Альтернативная модель данных доступна для Libpostal. Он создан Senzing Inc. для улучшения разбора на адресах США, Великобритании и Сингапура и улучшенной обработки адреса в сельском маршруте США. Чтобы включить эту MODEL=senzing в линию конигура во время установки:
./configure --datadir=[...some dir with a few GB of space...] MODEL=senzing
Данные для этой модели получены от OpenAddress, OpenStreetMap и данных, сгенерированных Senzing на основе отзывов клиентов (несколько сотен записей), в общей сложности около 1,2 миллиарда данных из более чем 230 стран, на 100+ языках. Данные от OpenStreetMap и OpenAddress хороши, но не идеальны, поэтому набор данных был изменен путем фильтрации плохо сформированных адресов, исправления неправильных классифицированных токенов адреса и удаления жетонов, которые не принадлежали к адресам, когда эти условия встречались.
Senzing создал набор данных из 12950 адресов из 89 стран, которые он использует для тестирования и проверки качества своих моделей. Набор данных был сгенерирован с использованием случайных адресов от OSM, минимально 50 на страну. Трудные адреса были получены от команды поддержки Senzing и клиентов, а также со страницы Libpostal Github и добавлены в этот набор. Модель Senzing получила на 4,3% лучшие результаты анализа, чем модель по умолчанию, используя этот набор тестирования.
Размер этой модели составляет около 2,2 ГБ по сравнению с 1,8 ГБ для модели по умолчанию, поэтому имейте в виду, если важно, если пространство Storage важно.
Дополнительную информацию об этой модели данных можно найти по адресу: https://github.com/senzing/libpostal-data, если вы столкнетесь с любыми проблемами с этой моделью, независимо от того, должны ли они связаны с анализами, установкой или любыми другими проблемами, затем сообщите о них по адресу https://github.com/senzing/libpostal-data
Международный анализатор адреса Libpostal использует машинное обучение (условные случайные поля) и обучается более 1 миллиардам адресов в каждой обитаемой стране на земле. Мы используем OpenStreetMap и OpenAddresses в качестве источников структурированных адресов, а шаблоны формата адреса OpenCage по адресу: https://github.com/opencagedata/address-formatting, чтобы создать учебные данные, дополнение с содержащими полигонами, а также генерирующие субботные компоненты, такие как квартира/ножи, и полевые ящики. Мы также добавляем аббревиатуры, выпадаем компоненты случайным образом и т. Д., Чтобы сделать анализатор максимально надежным, чтобы грязный ввод реального мира.
Эти примеры результатов Parse взяты из интерактивной программы Address_parser, которая построена с Libpostal при make . Обратите внимание, что анализатор может обрабатывать запятые с запятыми, а также различные оболочки и перестановки компонентов (если вклад, например, только город или только город/почтовый индекс).
Парсер достигает очень высокой точности при удерживаемых данных, в настоящее время 99,45% правильных полных синтаксий (что означает 1 в числителе для правильного получения каждого токена в адрес).
Вот пример API анализатора с использованием привязки Python:
from postal . parser import parse_address
parse_address ( 'The Book Club 100-106 Leonard St Shoreditch London EC2A 4RH, United Kingdom' )И пример с CPI C:
#include <stdio.h>
#include <stdlib.h>
#include <libpostal/libpostal.h>
int main ( int argc , char * * argv ) {
// Setup (only called once at the beginning of your program)
if (! libpostal_setup () || ! libpostal_setup_parser ()) {
exit ( EXIT_FAILURE );
}
libpostal_address_parser_options_t options = libpostal_get_address_parser_default_options ();
libpostal_address_parser_response_t * parsed = libpostal_parse_address ( "781 Franklin Ave Crown Heights Brooklyn NYC NY 11216 USA" , options );
for ( size_t i = 0 ; i < parsed -> num_components ; i ++ ) {
printf ( "%s: %sn" , parsed -> labels [ i ], parsed -> components [ i ]);
}
// Free parse result
libpostal_address_parser_response_destroy ( parsed );
// Teardown (only called once at the end of your program)
libpostal_teardown ();
libpostal_teardown_parser ();
}Последователь адреса технически может технически использовать любые строковые этикетки, которые определены в учебных данных, но они определены в настоящее время, на основе полей, определенных в библиотеке форматирования адресов OpenCage, а также несколько добавлены Libpostal для обработки конкретных шаблонов:
API expand_address преобразует грязные реальные адреса в нормализованные эквиваленты, подходящие для индексации поиска, хэширования и т. Д.
Вот интерактивный пример с использованием привязки Python:
Libpostal содержит обученный OSM-классификатор языка, чтобы определить, какие языки (ы) используются в данном адресе, чтобы он мог применить соответствующие нормализации. Единственный необходимый вход - это необработанная строка адреса. Вот краткий список некоторых менее простых нормализаций на различных языках.
| Вход | Вывод (может быть множественным в libpostal) |
|---|---|
| Сто двадцать е 96-й ул. | 120 East 96th Street |
| C/ ocho, pi 4 | Calle 8 Polígono Industrial 4 |
| V XX Settembre, 20 | через 20 settembre 20 |
| Quatre Vingt Douze R. de L'Eglise | 92 rue de lglise |
| uolcareTnый -raind, d 4, stroEnee -7 | uliцa karetnы |
| uolcareTnый -raind, d 4, stroEnee -7 | Ulitsa Karetnyy Ryad Dom 4 Stroyeniye 7 |
| MarktStraße 14 | Маркт Страсс 14 |
В настоящее время Libpostal поддерживает эти типы нормализаций на 60+ языках , и вы можете добавить больше (без необходимости писать C).
Для дальнейшего чтения и некоторых странных границ адреса адреса см. В: «Программисты ложь» считают адресами.
Вот пример, использующий привязки Python для краткости (большинство языковых привязков более высокого уровня похожи):
from postal . expand import expand_address
expansions = expand_address ( 'Quatre-vingt-douze Ave des Champs-Élysées' )
assert '92 avenue des champs-elysees' in set ( expansions )CAPI -эквивалент - еще несколько линий, но все же довольно прост:
#include <stdio.h>
#include <stdlib.h>
#include <libpostal/libpostal.h>
int main ( int argc , char * * argv ) {
// Setup (only called once at the beginning of your program)
if (! libpostal_setup () || ! libpostal_setup_language_classifier ()) {
exit ( EXIT_FAILURE );
}
size_t num_expansions ;
libpostal_normalize_options_t options = libpostal_get_default_options ();
char * * expansions = libpostal_expand_address ( "Quatre-vingt-douze Ave des Champs-Élysées" , options , & num_expansions );
for ( size_t i = 0 ; i < num_expansions ; i ++ ) {
printf ( "%sn" , expansions [ i ]);
}
// Free expansions
libpostal_expansion_array_destroy ( expansions , num_expansions );
// Teardown (only called once at the end of your program)
libpostal_teardown ();
libpostal_teardown_language_classifier ();
}После строительства Libpostal:
cd src/
./libpostal "Quatre vingt douze Ave des Champs-Élysées"
Если у вас есть текстовый файл или поток с одним адресом на строку, интерфейс командной строки также принимает ввод от Stdin:
cat some_file | ./libpostal --json
После строительства Libpostal:
cd src/
./address_parser
address_parser - это интерактивная оболочка. Просто введите адреса, и Libpostal будет проанализировать их и напечатать результат.
Libpostal предназначен для использования языками более высокого уровня. Если вы не видите выбора, или если вы пишете общение языка, сообщите нам об этом!
Официально поддерживаемые языковые привязки
Неофициальные языковые привязки
Расширения базы данных
Неофициальный REST API
Libpostal Rest Docker
Libpostal Zeromq Docker
Libpostal использует наибольшее для автоматического тестирования. Чтобы запустить тесты, используйте:
make check
Добавление тестовых случаев легко, даже если ваш C ржавый/несуществующий, и мы будем рады вклады. Мы используем в основном функциональные тесты, проверяющие вход строки на вывод строки.
Либпостал также периодически испытывает боевые действия по миллионам адресов от OSM (чистый), а также анонимные запросы от производственного геокодера (не так чисто). Во время этого процесса мы используем Valgrind для проверки утечек памяти и других ошибок.
Libpostal должен загрузить некоторые файлы данных с S3. Основные файлы представляют собой представления о структурах данных, необходимых для выполнения расширения. Для анализа адреса, поскольку модельное обучение занимает несколько дней, мы публикуем полностью обученную модель для S3 и обновляем ее автоматически, когда новые адреса добавляются в OSM, OpenAddresses и т. Д. То же самое касается модели классификатора языка.
Файлы данных автоматически загружаются при запуске Make. Чтобы проверить и загрузить любые новые файлы данных, вы можете либо запустить make , либо запустить:
libpostal_data download all $YOUR_DATA_DIR/libpostal
И замените $ your_data_dir на все, что вы передали, чтобы настроить во время установки.
Libpostal содержит ряд словарей на языку, которые влияют на расширение, языковой классификатор и анализатор. Чтобы изучить словаря или внести свой вклад в сокращения/фразы на вашем языке, см. Ресурсы/Словарии.
В машинном обучении большие объемы обучающих данных часто необходимы для получения хороших результатов. Многие проекты машинного обучения с открытым исходным кодом либо выпускают только код модели (результаты воспроизводимы в то время и только тогда, когда вы Google), или предварительно выпеченную модель, где условия обучения неизвестны.
Libpostal немного отличается, потому что он обучен открытым данным, доступным для всех, поэтому мы выпустили весь учебный конвейер (пакет Geodata в этом репо), а также полученные данные обучения в интернет -архиве. Это более 100 ГБ незаметно.
Данные обучения хранятся на Archive.org до даты, когда они были созданы. Есть также файл, хранящийся в основном каталоге этого репо, называемого current_parser_training_set , в котором хранится дата самого последнего созданного обучающего набора. Чтобы всегда указывать на последние данные, попробуйте что -то вроде: latest=$(cat current_parser_training_set) и используйте эту переменную вместо даты.
Все файлы можно найти по адресу https://archive.org/download/libpostal-parser-taring-data-yyyymmdd/$file как файлы gzip'd tab-sparated values (tsv), отформатированные как: languagetcountrytaddress .
Если анализатор не работает так же хорошо, как вы надеялись на конкретный тип адреса, лучше всего использовать GREP/AWK для просмотра учебных данных и попытаться определить, есть ли какой -то шаблон/стиль адреса, который не запечатлен.
Расширение аббревиатуры : например, расширение "rd" => «Дорога», но практически для любого языка. Libpostal поддерживает> 50 языков, и его легко добавить новые языки или расширить текущие словаря. Поддерживаются идеографические языки (не разделенные пробелом, например, китайцы), а также германские языки, где типы магистралей объединяются на конец строки и могут быть при желании разделены, чтобы Rosenstraße и Rosen Straße эквивалентны.
Международное определение адреса : условное случайное поле, которое анализирует «123 Main Street New York New York» в {«house_number»: 123, «Дорога»: «Мейн -стрит», «Город»: «Нью -Йорк», «Государство»: «Нью -Йорк»}. Сигнал работает на широкий спектр стран и языков, а не только для США/английского. Модель обучена более чем 1 миллиардам адресов и адреса, подобных адресам, используя шаблоны в форматировании адреса Addrage OpenCage для построения форматированных, помеченных примеров транирования для каждой населенной страны в мире. Многие типы нормализаций выполняются, чтобы сделать учебные данные, напоминающие настоящий грязный ввод геокодера как можно более близко.
Классификация языка : многономиальная логистическая регрессия, обученная (с использованием метода FTRL-проксимального для индукции редкости) во всех способах OpenStreetMap, Addr:* Теги, топонимы и форматированные адреса. Метки получены с использованием испытаний на пункт полигонов как для стран, так и для официальных/региональных языков для стран и границ администратора 1 соответственно. Так, например, испанский язык - это язык по умолчанию в Испании, но в разных регионах, например, Каталуния, Галисия, Баскская область, соответствующие региональные языки - дефолт. Несчастный случай, основанный на словаре, используется в тех случаях, когда региональный язык не является деко-по умолчанию, например, валлий, Бретон, Октян. Словари также используются для сокращения канонических фраз, таких как «Calle» => «c/» (выполняется как на языковом классификаторе, так и на учебных наборах анализации адреса))
Числовое отображение выражения («двадцать первый» => 21-й, "Quatre-vingt-douze" => 92, опять же, используя данные, представленные в CLDR), поддерживает> 30 языков. Обрабатывает языки с конкатенированными выражениями, например, Milleottocento => 1800. При желании нормализуют римские цифры независимо от языка (IX => 9), которые встречаются в именах многих монархов, пап и т. Д.
Быстрая, точная токенизация / лексинг : такта на> 1M токенах / сек, реализует спецификацию TR-29 для сегментации слов UTF8, токенизирует языки восточноазиатских языков по характеру, а не на пробеле.
Нормализация UTF8 : необязательно разложить UTF8 в форму нормализации NFD, положительные знаки акцента, например, à => a и/или применяют транслитерацию латинской Аска.
Транслитерация : например, uliцa => ulica или ulitsa. Использует все преобразования CLDR, то же самое исходное данные, используемые ICU, хотя Libpostal не требует вытягивания во всех ITS (может противоречить версии вашей системы). Примечание. Некоторые языки, особенно иврит, арабский язык и тайский язык, могут не включать гласные и, следовательно, не часто будут соответствовать транслитерации, сделанной человеком. Возможно, можно реализовать статистические транслитераторы для некоторых из этих языков.
Обнаружение сценариев : обнаруживает, какой сценарий использует данную строку (может быть множественным, например, бесплатная форма Гонконга или Адрес Макао может использовать как HAN, так и латинские сценарии в одном и том же адресе). В транслитерации мы можем использовать все применимых трансляторов для данного скрипта Unicode (например, греческий, например, будет транслитерирован с греко-латиновым, греко-латин-BGN и греко-латиновым Ungegn).
Либпостал был первоначально создан в рамках проекта OpenVenues для решения проблемы Defuping. В Openvenues у нас есть набор данных из миллионов мест, полученных из терабайт веб -страниц из общего ползания. Общий ползание публикуется ежемесячно, и поэтому даже слияние результатов двух ползаний дает значительные дубликаты.
Deduping-это относительно хорошо изученная область, и для текстовых документов, таких как веб-страницы, академические документы и т. Д. Существуют довольно приличные приблизительные методы сходства, такие как Minhash.
Однако для физических адресов частое использование обычных сокращений, таких как Road == Rd, California == CA или Нью -Йорк == NYC немного усложняет вопросы. Даже используя такую технику, как Minhash, которая хорошо подходит для приблизительных матчей и эквивалентно сходству Jaccard двух наборов, нам приходится работать с очень короткими текстами, и часто тот случай, когда два эквивалентных адреса, один из которых сокращался и один полностью указан, не совпадает с очень близкими с точки зрения N-граммового набора. В нелатиновых сценариях, скажем, российский адрес и его транслитерированный эквивалент, возможно, что два адреса, относящиеся к одному и тому же месту, могут не соответствовать ни одному персонажу.
В качестве мотивирующего примера рассмотрите следующие два эквивалентных способа написать конкретный адрес улицы Манхэттена с различными соглашениями и степенями условности:
Очевидно, что '30 W 26th St FL #7! = '30 West Twency Sdixth Street Пол № 7 'в смысле сравнения струны, но человек может Grok, что эти два адреса относятся к одному физическому местоположению.
Libpostal стремится создать нормализованные географические строки, проанализированные в компоненты, так что мы можем более эффективно рассуждать о том, насколько хорошо два адреса на самом деле соответствуют и принимают автоматические решения на стороне сервера о Dups.
Если вышеперечисленное звучит очень похоже на геокодирование, это потому, что это в некотором смысле, только в случае OpenVenues, мы должны геокоду без пользовательского интерфейса или пользователя, чтобы выбрать правильный адрес в выпадании автозаполнения. Учитывая базу данных исходных адресов, таких как OpenAddresses или OpenStreetMap (или все вышеперечисленное), Libpostal может использоваться для реализации таких вещей, как вывод адреса и геокодирование на стороне сервера в таких настройках, как MapReduce или обработка потоков.
Теперь вместо того, чтобы пытаться испечь конвенции, специфичные для конкретного адреса, в традиционные поисковые системы документов, такие как Elasticsearch, используя гигантские файлы синонимов, сценарии, пользовательские анализаторы, токенизаторы и тому подобное, геокодирование может выглядеть так:
Таким образом, Libpostal может выполнять нечеткий сопоставление адресов в постоянное время по сравнению с размером набора данных.
Libpostal написан в C по трем причинам (в порядке важности):
Портативность/вездесущность : либпостал нацелен на языки более высокого уровня, которые люди фактически используют повседневные: python, go, ruby, nodejs и т. Д. Красота C заключается в том, что практически любой язык программирования может привязаться к нему, а C, компиляторы C везде, выбирайте свой любимый сервер, и вы можете использовать Libpostal непосредственно в своем применении без необходимости выдерживать отдельный сервер. Мы поддерживаем Mac/Linux (Windows не является приоритетом, но с удовольствием принимает патчи), имеем стандартную сборку AutoTools и формат файлов-эндсионе, алкоголя, для файлов данных. Привязки Python поддерживаются как часть этого репо, поскольку они необходимы для построения учебных данных.
Эффективность памяти : Libpostal предназначен для запуска в настройке MapReduce, где мы можем быть ограничены <1 ГБ оперативной памяти на процесс в зависимости от конфигурации машины. Как можно больше либерально использует смежные массивы, попытки (построенные на смежных массивах), цветущие фильтры и сжатые разреженные матрицы, чтобы поддерживать низкое использование памяти. Можно использовать Libpostal на мобильном устройстве с моделями, обученными на одной стране или в нескольких странах.
Производительность : это последнее в списке по причине. Большая часть оптимизации в Libpostal предназначена для использования памяти, а не для производительности. Либпостал довольно быстрый, учитывая объем работы, которую он выполняет. Он может обрабатывать 10-30 тыс. Адрес / второй в одном потоке / процессе на платформах, которые мы протестировали (это означает обработку каждого адреса на планете OSM чуть более часа). Проверьте простую программу Benchmark, чтобы проверить вашу среду и различные типы ввода. В настройке MapReduce производительность для каждого ядра не так важна, потому что все делается параллельно, но в Mapzen есть некоторые приложения для проглатывания потокового вещания, где это необходимо работать в процессе.
Либпостал написан в современном, разборчивом, C99 и использует следующие соглашения:
Пакет Geodata Python в Libpostal Repo содержит конвейер для предварительной обработки различных наборов данных GEO и создания данных обучения для использования C. Этот пакет не должен потребоваться не для большинства пользователей, но для тех, кто заинтересован в создании новых типов адресов или улучшении данных обучения Libpostal, вот куда искать.
При удерживаемых данных тестирования (что означает маркированные анализы, которые модель не была видела ранее), анализатор адреса достигает 99,45% полной точности анализа.
Для некоторых задач, таких как названное распознавание сущности, предпочтительнее использовать что-то вроде оценки F1 или вариантов, в основном потому, что существует проблема смещения класса (большинство слов-это не въезд, а система, которая просто предсказывала невозможность для каждого токена, на самом деле справится с точностью достоверности). Это не тот случай для анализа адреса. Каждый токен имеет ярлык, и в учебных данных есть миллионы примеров каждого класса, поэтому точность предпочтительнее, поскольку это чистая, простая и интуитивная мера производительности.
Здесь мы используем полную точность анализа, то есть мы даем парсеру только «точку» в числителе, если он получает правильный токен каждый токен. Это должно быть лучшей мерой, чем просто взглянуть на то, был ли каждый токен правильным.
Хотя текущий анализатор работает довольно хорошо для большинства стандартных адресов, все еще есть место для улучшения, особенно в том, чтобы убедиться, что используемые нами учебные данные были как можно ближе к адресам в дикой природе. Существует два основных способа, которыми анализатор адреса может быть улучшен еще дальше (в порядке сложности):
Отчеты об ошибках, проблемы и запросы на тягу приветствуются. Пожалуйста, прочитайте руководство по применению перед отправкой вашей проблемы, отчетом об ошибках или запросе на вытягивание.
Отправить выпуски по адресу: https://github.com/openvenues/libpostal/issues.
Особое спасибо @Benk10 за начальную сборку Windows и @Aeroxuk за беспрепятственную интеграцию в проект и настройку сборки приложения.
Программное обеспечение доступно как открытый исходный код в условиях лицензии MIT.