Опции для японского токенизатора MeCab на iOS?

Я использую библиотеку iPhone для MeCab, которую можно найти по адресу https://github.com/FLCLjp/iPhone-libmecab < / а>. У меня проблемы с тем, чтобы он размечал все возможные слова. В частности, я не могу разделить «吉 本 興業» на две части «吉 本» и «興業». Есть ли какие-нибудь варианты, которые я мог бы использовать, чтобы это исправить? Библиотека iPhone ничего не предоставляет, но использует C ++ под оболочкой objective-c. Я предполагаю, что должна быть какая-то настройка, которую я мог бы изменить, чтобы дать более детальный контроль, но я не знаю, с чего начать.

Кстати, если кто-то захочет пометить этот «мекаб», это, вероятно, будет уместно. Мне пока не разрешено создавать новые теги.

ОБНОВЛЕНИЕ: библиотека iOS вызывает функцию mecab_sparse_tonode2 (), определенную в libmecab.cpp. Если бы кто-нибудь мог указать мне на какую-нибудь англоязычную документацию по этому файлу, этого могло бы быть достаточно.


person arsenius    schedule 04.02.2013    source источник
comment
吉 本 興業 - существительное собственное и одно слово. Вы просите, как токенизировать Facebook в лицо и книгу. Вы действительно этого хотите?   -  person akky    schedule 05.02.2013
comment
@akky В зависимости от цели токенизации могут быть веские причины разделить 吉 本 и 興業. Например, когда токенизатор используется для построения индекса поисковой системы, пользователи обычно ожидают найти документы, содержащие 本 興業, даже если они ищут только 興業. Если не используется полный индекс с включенным поиском по подстроке, это означает, что вам нужно разделить составные существительные на их части.   -  person jogojapan    schedule 05.02.2013
comment
Это непростая задача, но вы можете попробовать адаптировать iPhone-libmecab для использования более нового, современного Словарь Unidic вместо Ipadic; если я правильно помню (с тех пор, как я прочитал исследование, прошел год), это позволяет вам размечать короткие единичные слова или длинные единичные слова.   -  person Jamie Birch    schedule 21.05.2017


Ответы (1)


В этом нет ничего специфичного для iOS. Словарь, который вы используете с mecab (возможно, ipadic), содержит запись для названия компании 吉 本 興業. Хотя обе части имени также указаны как отдельные существительные, mecab сильно предпочитает помечать составное имя как одно слово.

В Mecab отсутствует функция, позволяющая пользователю выбирать, следует ли разделять соединения на части. Обратите внимание, что такую ​​функцию, как правило, сложно реализовать, потому что не все согласны с тем, какие соединения можно разделить, а какие - нет. Например. 容 疑 者 - это соединение, состоящее из 容 疑 и 者? С чисто морфологической точки зрения, возможно, да, но для большинства практических приложений, вероятно, нет.

Если у вас есть список соединений, которые вы хотите сегментировать, быстрое решение - создать пользовательский словарь для частей, из которых они состоят, и заставить mecab использовать его в дополнение к основному словарю.

Документацию на японском языке о том, как это сделать, можно найти здесь. В вашем конкретном примере это будет включать следующие шаги.

  1. Сделайте пользовательский словарь с двумя записями, одна для 吉 本, а другая для 興業:

    吉本,,,100,名詞,固有名詞,人名,名,*,*,よしもと,ヨシモト,ヨシモト
    興業,,,100,名詞,一般,*,*,*,*,こうぎょう,コウギョウ,コウギョウ
    

    Я подозреваю, что обе записи уже существуют в словаре по умолчанию, но, добавив их в словарь пользователя и указав относительно низкий показатель специфичности (я использовал 100 для обоих - чем ниже, тем выше вероятность разделения), вы можете заставить mecab иметь тенденцию предпочитать части целому.

  2. Скомпилируйте пользовательский словарь:

    $> $MECAB/libexec/mecab/mecab-dict-index  -d /usr/lib64/mecab/dic/ipadic -u mydic.dic -f utf-8 -t utf-8 ./mydic
    

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

    1. Mecab был установлен из исходников в $MECAB. Если вы используете mecab, установленный менеджером пакетов, у вас могут возникнуть трудности с поиском инструмента mecab-dict-index. Лучшая установка из исходников.

    2. Словарь по умолчанию находится в /usr/lib64/mecab/dict/ipadic. Это не часть пакета mecab; он поставляется как отдельный пакет (например, this), и у вас могут возникнуть трудности с его поиском.

    3. mydic - это имя пользовательского словаря, созданного на шаге 1. mydic.dic - имя скомпилированного словаря, который вы получите в качестве вывода (не обязательно).

    4. И системный словарь (опция -t), и пользовательский словарь (опция -f) кодируются в UTF-8. Это может быть неправильно, и в этом случае вы получите сообщение об ошибке позже, когда будете использовать mecab.

  3. Измените конфигурацию mecab. В общесистемной установке это файл с именем /usr/lib64/mecab/dic/ipadic/dicrc или аналогичный. В вашем случае он может быть где-то еще. Добавьте следующую строку в конец файла конфигурации:

    userdic = home/myhome/mydic.dic
    

    Убедитесь, что абсолютный путь к составленному выше словарю верен.

Если вы затем запустите mecab против вашего ввода, он разделит соединение на части (я тестировал его, используя mecab 0.994 в системе Linux).

Более тщательным решением было бы получить исходный код словаря по умолчанию и вручную удалить все составные существительные, которые вы хотите разделить, а затем перекомпилировать словарь. Как общее замечание, использование токенизатора CJK для серьезного приложения в производственном режиме в течение более длительного периода времени обычно требует регулярного обслуживания определенного словаря (добавления / удаления записей).

person jogojapan    schedule 05.02.2013
comment
Спасибо @jogojapan, ваше объяснение превосходное. Мы делаем индивидуальные карточки для изучающих язык на основе их собственных текстов, поэтому я не думаю, что пользовательские словари помогут нам решить эту проблему. Прямо сейчас они разделены на нашем веб-сервере в соответствии с моим вопросом, но при токенизации на iPhone это не работает так же. Я посмотрю, использует ли наш сервер другой словарь. Однако на самом деле, вероятно, со стороны учащихся будет ошибкой думать, что, как в вашем примере, Facebook должен быть личным кабинетом. - person arsenius; 05.02.2013
comment
Это был пример Акки, а не мой. В любом случае, учащиеся могут захотеть разделить состав, потому что так им легче запомнить. Я бы лучше сравнил это с Нью-Йорком, чем с лицом + книжкой. Это, конечно, одно слово, а не два, но любой, кто увидит его впервые, будет рад понять, что это сочетание прилагательного и названия другого города. В конце концов, именно поэтому он пишется с пробелом между ними. Но позвольте мне понять: ваши учащиеся могут ставить пробелы между словами на карточке, и вы надеетесь, что mecab предложит такую ​​же лексему, что и учащийся? - person jogojapan; 05.02.2013
comment
@arsenius Или вы просто говорите, что mecab на сервере генерирует вывод, отличный от mecab на телефоне? - person jogojapan; 05.02.2013
comment
Секунда. Поэтому, не зная, что это на самом деле имя собственное, пользователи иногда интерпретируют его как два слова. Я думаю, это верно для всех наших языков, а не только для японского. Мне сказали, что наш сервер использует версию mecab для Python. (Кстати, я понятия не имел, что означало это слово выше, мне просто сказали, что iPhone не разделяет его на две части) - person arsenius; 05.02.2013
comment
@arsenius Понятно. Затем, если на сервере и телефоне используются одни и те же версии mecab, необходимо установить другой словарь. Как упоминалось в ответе, словарь отделен от реализации. Есть ipadic, а также jumandic и, возможно, другие. Важно убедиться, что на обоих концах используется один и тот же словарь. - person jogojapan; 05.02.2013
comment
Отличный ответ. В примере ввода CSV в пользовательский словарь, почему вы оставили второй и третий аргументы (идентификаторы левого / правого контекста) пустыми? Что они делают? - person Ahmed Fasih; 01.01.2015
comment
@AhmedFasih Согласно японской документации, эти аргументы являются целыми числами и используются для указания идентификатора внутреннего статуса, когда слово встречается в режиме слева направо (второй аргумент) и режиме справа налево (третий аргумент). Если у вас есть доступ к встроенному системному словарю и вы хотите, чтобы ваша новая запись обрабатывалась внутри так же, как существующее слово из системного словаря, вы можете скопировать идентификаторы из существующей записи. В противном случае оставьте их пустыми, и инструмент создания словарей назначит их автоматически (не знаю, как это сделать). - person jogojapan; 01.01.2015