Как использовать CFStringTokenizer с китайским и японским языками? - PullRequest
3 голосов
/ 26 ноября 2011

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

Есть ли способ, которым код может быть изменен для правильной разметки японского и китайского языков? В документации говорится, что эти языки поддерживаются, но, похоже, они не разбивают слова в нужных местах. Например, когда он токенизирует «新 し い», он разбивает его на два слова «新 し» и «い», когда он должен быть один (я не говорю по-японски, поэтому я не знаю, действительно ли это правильно, но Образец у меня говорит, что все это должно быть одним словом). В других случаях он пропускает слова.

Я попытался создать китайские и японские локали, используя kCFStringTokenizerUnitWordBoundary. Результаты улучшились, но все еще недостаточно хороши для того, что я делаю (добавление гиперссылок к словарным словам).

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

[ОБНОВЛЕНИЕ] Мы закончили тем, что некоторое время использовали mecab с определенным пользовательским словарем для японского языка, и теперь перешли к выполнению всего этого на стороне сервера. Может быть, он не идеален, но у нас стабильные результаты на всех платформах.

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

Если вы знаете, что анализируете конкретный язык, вы должны создать свой CFStringTokenzier с правильным CFLocale (или, по крайней мере, предположением CFStringTokenizerCopyBestStringLanguage) и использовать kCFStringTokenizerUnitWordBoundary.

К сожалению, идеальная сегментация слов китайского и японского текста остается открытой и сложной проблемой, поэтому любая используемая вами библиотека сегментации будет иметь некоторые недостатки.Для японского языка CFStringTokenizer использует внутреннюю библиотеку MeCab и Граничный анализ ICU (только при использовании kCFStringTokenizerUnitWordBoundary, поэтому вы получаете забавный разрыв с "新 し い" безэто).

2 голосов
/ 09 сентября 2014

Также взгляните на NSLinguisticTagger. Но само по себе не даст вам намного больше.

По правде говоря, эти два языка (и некоторые другие) действительно трудно точно програмировать.

Вы также должны увидеть видео WWDC на LSM. Скрытое семантическое отображение. Они охватывают тему стволовых и лемм. Это искусство и наука более точного определения того, как значимо маркировать.

То, что ты хочешь сделать, сложно. Поиск одних только границ слов не дает достаточного контекста, чтобы передать точное значение. Это требует рассмотрения контекста, а также определения идиом и фраз, которые не следует разбивать на слова. (Не говоря уже о грамматических формах)

После этого снова посмотрите на доступные библиотеки, затем найдите книгу по Python NLTK, чтобы узнать, что вам действительно нужно узнать о NLP, чтобы понять, насколько вы действительно хотите заниматься этим.

Большие объемы текста по своей природе дают лучшие результаты. Там нет учета опечаток и плохой грамматики. Большая часть контекста необходима для управления логикой в ​​неявном контексте анализа, который не написан напрямую как слово. Вы можете строить правила и обучать вещи.

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

Чтобы провести аналогию, это все равно, что много заглядывать в будущее и оглядываться назад в регулярных выражениях.

...