Советы по программированию на японском языке / Иероглифами [закрыто]
-
03-07-2019 - |
Вопрос
У меня есть идея написать несколько веб-приложений, которые помогут мне и, возможно, другим лучше выучить японский, поскольку я изучаю этот язык.
Моя проблема в том, что сайт будет в основном на английском языке, поэтому в нем нужно свободно использовать японские иероглифы, обычно хиригану и катакану, но позже кандзи.Я становлюсь ближе к достижению этой цели;Я выяснил, что страницы и исходные файлы должны иметь типы контента unicode и utf-8.
Однако моя проблема заключается в самом кодировании.Что мне нужно, так это манипулировать текстовыми строками, которые являются kana.Одним из примеров является:
けす Мне нужно взять этот глагол и преобразовать его в te-форму け文て.Я бы предпочел сделать это в javascript, поскольку это поможет в дальнейшем выполнять больше манипуляций, но если мне придется, я просто выполню вызовы DB и сохраню все в DB.
Мой вопрос заключается не только в том, как это сделать на javascript, но и в том, каковы некоторые советы и стратегии для выполнения подобных действий и на других языках.Я надеюсь больше заниматься созданием приложений для изучения языка, но теряюсь, когда дело доходит до этого.
Решение
Мой вопрос заключается не только в том, как это сделать на javascript, но и в том, каковы некоторые советы и стратегии для выполнения подобных действий и на других языках тоже.
То, что вы хотите сделать, - это довольно простые манипуляции со строками - за исключением пропущенных разделителей слов, как отмечает Барри, хотя это не техническая проблема.
В принципе, для современного языка программирования с поддержкой Unicode (которым, я полагаю, является JavaScript начиная с версии 1.3) нет реальной разницы между японской каной или кандзи и латинской буквой - все это просто символы.А строка - это просто, ну, строка символов.
Где это становится трудным, так это когда вам приходится конвертировать между строками и байтами, потому что тогда вам нужно обратить внимание на то, какую кодировку вы используете.К сожалению, многие программисты, особенно носители английского языка, склонны замалчивать эту проблему, потому что ASCII является де-факто стандартной кодировкой для латинских букв, а другие кодировки обычно стараются быть совместимыми.Если латинские буквы - это все, что вам нужно, тогда вы можете пребывать в блаженном неведении о кодировках символов, верить, что байты и символы - это по сути одно и то же, и писать программы, которые искажают все, что не является ASCII.
Итак, "секрет" программирования с поддержкой Unicode заключается в следующем:научитесь распознавать, когда и где строки / символы преобразуются в байты и из них, и убедитесь, что во всех этих местах используется правильная кодировка, т.е.тот же, который будет использоваться для обратного преобразования, и тот, который может кодировать все используемые вами символы.UTF-8 постепенно становится стандартом де-факто и обычно должен использоваться везде, где у вас есть выбор.
Типичные примеры (неисчерпывающие):
- При написании исходного кода с использованием строковых литералов, отличных от ASCII (настройте кодировку в редакторе / IDE)
- При компиляции или интерпретации такого исходного кода (компилятор / интерпретатор должен знать кодировку)
- При чтении / записи строк в файл (кодировка должна быть указана где-то в API или в метаданных файла)
- При записи строк в базу данных (кодировка должна быть указана в конфигурации базы данных или таблицы)
- При доставке HTML-страниц через веб-сервер (кодировка должна быть указана в заголовках HTML или мета-заголовке страниц;формы могут быть еще более сложными)
Другие советы
- Везде придерживайтесь Unicode и utf-8.
- Держитесь подальше от родных японских кодировок:euc-jp, shiftjis, iso-2022-jp, но имейте в виду, что вы, вероятно, столкнетесь с ними в какой-то момент, если продолжите.
- Познакомьтесь с сегментатором для выполнения сложных задач, таких как анализ POS, сегментация слов и т.д.стандартные инструменты, используемые большинством людей, занимающихся НЛП (обработкой естественного языка), работают с японским языком в порядке популярности / мощности.
МеКаб (первоначально на Кузница источника) это потрясающе:это позволяет вам брать текст, подобный,
「日本語は、とても難しいです。」
и получить обратно всевозможную полезную информацию
kettle:~$ echo 日本語は、難しいです | mecab
日本語 名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
、 記号,読点,*,*,*,*,、,、,、
難しい 形容詞,自立,*,*,形容詞・イ段,基本形,難しい,ムズカシイ,ムズカシイ
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS
который в основном представляет собой подробное изложение частей речи, прочтений, произношений и т.д.Это также пойдет вам на пользу при анализе времен глаголов,
kettle:~$ echo メキシコ料理が食べたい | mecab
メキシコ 名詞,固有名詞,地域,国,*,*,メキシコ,メキシコ,メキシコ
料理 名詞,サ変接続,*,*,*,*,料理,リョウリ,リョーリ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
たい 助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
EOS
Однако вся документация на японском языке, и ее немного сложно настроить и выяснить, как форматировать выходные данные так, как вы этого хотите.Есть пакеты, доступные для ubuntu / debian, и привязки на множестве языков, включая perl, python, ruby...
Apt-репозитории для ubuntu:
deb http://cl.naist.jp/~eric-n/ubuntu-nlp intrepid all
deb-src http://cl.naist.jp/~eric-n/ubuntu-nlp intrepid all
Пакеты для установки:$ apt-get install mecab-ipadic-utf8 mecab python-mecab
я думаю, это должно сработать.
Другими альтернативами mecab являются, Чейзен, который был написан много лет назад автором MeCab (который, кстати, работает в Google now), и Какаси, который гораздо менее мощный.
Я бы определенно постарался избежать внедрения ваших собственных процедур сопряжения.проблема с этим заключается только в том, что это потребует тонны и тонны работы, которую другие уже выполнили, и охват всех крайних случаев правилами, в конце концов, невозможен.
MeCab управляется статистически и обучается на большом количестве данных.В нем используется сложная техника машинного обучения, называемая условные случайные поля (CRFs) и результаты действительно неплохие.
Повеселись с японцами.Я не уверен, насколько хорош ваш японский, но если вам нужна помощь с документами для mecab или чего-то еще, не стесняйтесь спрашивать и об этом.Поначалу кандзи могут быть довольно пугающими.
Что вам нужно сделать, так это ознакомиться с правилами грамматики.Имейте массив правил для каждого сопряжения.Давайте возьмем, к примеру, форму 〜て.Псевдокод :
def te_form(verb)
switch verb.substr(-1, 1) == "る" then return # verb minus ru plus te
case "る" #return (verb - る) + て
case "す" #return (verb - す)+して
и т.д.В принципе, разбейте его на глаголы I, II и III типов.
ваш вопрос мне совершенно непонятен.
тем не менее, у меня был некоторый опыт работы с японским языком, поэтому я отдам свои 2 цента.
поскольку в японских текстах нет разделения слов (напримерпробел), самый важный инструмент, который нам пришлось приобрести, - это распознаватель слов на основе словаря.
после того как вы разделили текст, с ним легче манипулировать с помощью "обычных" инструментов.
было только 2 инструмента, которые выполняли вышеуказанное, и в качестве побочного продукта они также работали как теггер (т.е.существительное, глагол и т.д.).
Редактировать:всегда используйте unicode при работе с w languagers.
Если я правильно помню (а я сильно расслабился в тот год, когда изучал японский, так что могу ошибаться), замены, которые вы хотите сделать, определяются одним или двумя последними символами в слове.Если взять ваш первый пример, то любой глагол, оканчивающийся на "す", при таком спрягании всегда будет иметь "して".Аналогично для む -> んで.Не могли бы вы, возможно, установить сопоставление последнего символа (ов) -> сопряженной формы.Возможно, вам придется учитывать исключения, такие как все, что сопряжено с xxって.
Что касается переносимости между языками, вам придется реализовать логику по-разному в зависимости от того, как они работают.Это решение было бы довольно просто реализовать и для испанского языка, поскольку спряжения зависят от того, заканчивается ли глагол на -ar, -er или -ir (с некоторыми глаголами, требующими исключений в вашей логике).К сожалению, это предел моих навыков владения несколькими языками, так что я не знаю, насколько хорошо это будет за пределами этих двух.
Поскольку большинство глаголов в японском языке следуют одному из небольшого набора предсказуемых шаблонов, самый простой и расширяемый способ сгенерировать все формы данного глагола - это заставить глагол знать, какому спряжению он должен следовать, а затем написать функции для генерации каждой формы в зависимости от спряжения.
Псевдокод:
generateDictionaryForm(verb)
case Ru-Verb: verb.stem + る
case Su-Verb: verb.stem + す
case Ku-Verb: verb.stem + く
...etc.
generatePoliteForm(verb)
case Ru-Verb: verb.stem + ります
case Su-Verb: verb.stem + します
case Ku-Verb: verb.stem + きます
...etc.
Неправильные глаголы, конечно, были бы в особом падеже.
Некоторый вариант этого будет работать для любого другого достаточно обычного языка (т.е.не английский).
Попробуйте установить мой gem (rom2jap).Это на ruby.
gem install rom2jap
Откройте свой терминал и введите:
require 'rom2jap'