日语/字符编程技巧

时间:2009-05-02 18:00:20

标签: javascript language-agnostic unicode nlp cjk

我有一个想法是写一些网络应用程序来帮助我,也许其他人,因为我正在学习这门语言,所以更好地学习日语。

我的问题是这个网站主要是英文,所以它需要流利地混合日文字符,通常是hirigana和片假名,但后来是汉字。我越来越接近完成这个;我已经发现页面和源文件需要是unicode和utf-8内容类型。

然而,我的问题出在实际编码中。我需要的是操纵假名的文本串。一个例子是:

けす我需要把那个动词转换成te-formけして。我宁愿在javascript中这样做,因为它会帮助我做更多的操作,但是如果我必须只做数据库调用并将数据保存在数据库中。

我的问题不仅仅是如何在javascript中完成,还有一些提示和策略,用其他语言来做这些事情。我希望能够更多地学习语言学习应用程序,但是在这方面我很失落。

7 个答案:

答案 0 :(得分:26)

  • 到处都坚持使用Unicode和utf-8。
  • 远离日本本土编码:euc-jp,shiftjis,iso-2022-jp,但请注意,如果继续,您可能会在某些时候遇到它们。
  • 熟悉分段器,用于处理复杂的东西,如POS分析,分词等。大多数使用NLP(自然语言处理)工作的人使用的标准工具是按照受欢迎程度/权力的顺序。

MeCab(最初在SourceForge上)非常棒:它可以让你拍摄文字,

「日本語は、とても難しいです。」

并获得各种好消息

kettle:~$ echo 日本語は、難しいです | mecab 
日本語 名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
、   記号,読点,*,*,*,*,、,、,、
難しい 形容詞,自立,*,*,形容詞・イ段,基本形,難しい,ムズカシイ,ムズカシイ
です  助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS

这基本上是对词性,读数,发音等的详细说明。它也会帮助你分析动词时态,

kettle:~$ echo メキシコ料理が食べたい | mecab 
メキシコ    名詞,固有名詞,地域,国,*,*,メキシコ,メキシコ,メキシコ
料理  名詞,サ変接続,*,*,*,*,料理,リョウリ,リョーリ
が   助詞,格助詞,一般,*,*,*,が,ガ,ガ
食べ  動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
たい  助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
EOS

但是,文档全部都是日文的,设置和弄清楚如何按照您希望的方式格式化输出有点复杂。有一些可用于ubuntu / debian的软件包,以及一系列语言的绑定,包括perl,python,ruby ......

ubuntu的Apt-repos:

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的其他替代方法是ChaSen,这是MeCab的作者多年前写的(现在谷歌偶然在谷歌工作)和Kakasi,它的功能要小得多。

我肯定会尽量避免滚动你自己的共轭例程。这个问题只是它需要大量的工作,而其他人已经完成了,并且在一天结束时用规则覆盖所有边缘情况是不可能的。

MeCab受统计驱动,并对大量数据进行了培训。它采用了一种称为条件随机场(CRF)的复杂机器学习技术,结果非常好。

与日本人玩得开心。我不确定你的日语有多好,但是如果你需要mecab的文档帮助或任何随意问这个问题。汉字在开始时可能非常令人生畏。

答案 1 :(得分:4)

  

我的问题不仅仅是如何做到这一点   在javascript中,但有一些提示   和做这些的策略   其他语言中的事物也是如此。

你想要做的是非常基本的字符串操作 - 除了缺少的单词分隔符,正如Barry所说,尽管这不是技术问题。

基本上,对于一种现代的Unicode感知编程语言(我认为,自从版本1.3以来,JavaScript一直存在),日语假名或汉字与拉丁字母之间没有真正的区别 - 它们都只是字符。一个字符串就是一串字符。

当你必须在字符串和字节之间进行转换时,很难实现,因为那时你需要注意你正在使用的编码。不幸的是,许多程序员,特别是母语为英语的人倾向于掩盖这个问题,因为ASCII是拉丁字母的事实标准编码,其他编码通常试图兼容。如果您只需要拉丁字母,那么您可以相处而言对字符编码一无所知,相信字节和字符基本上是相同的 - 并编写程序来破坏任何不是ASCII的字符。

因此,支持Unicode的编程的“秘密”是:学会识别字符串/字符何时何地转换为字节,并确保在所有这些位置使用正确的编码,即相同将用于反向转换,并且可以编码您正在使用的所有角色。 UTF-8正逐渐成为事实上的标准,通常应该在您可以选择的任何地方使用。

典型例子(非详尽无遗):

  • 使用非ASCII字符串文字编写源代码时(在编辑器/ IDE中配置编码)
  • 编译或解释此类源代码时(编译器/解释器需要知道编码)
  • 读取/写入文件的字符串时(必须在API的某处或文件的元数据中指定编码)
  • 将字符串写入数据库时​​(必须在DB或表的配置中指定编码)
  • 通过网络服务器提供HTML页面时(必须在HTML标题或页面的元标题中指定编码;表格可能更加棘手)

答案 2 :(得分:2)

您需要做的是查看语法规则。每个共轭都有一系列规则。我们以〜て形式为例。 Psudocode:

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型动词。

答案 3 :(得分:1)

我的问题完全不清楚。

然而,我有一些使用日语的经验,所以我会给我2分。

由于日语文本没有单词分隔(例如空格字符),我们必须获得的最重要的工具是基于字典的单词识别器。

一旦你进行了文本拆分,用“普通”工具操作就更容易了。

只有2个工具可以完成上述任务,作为副产品,它们还可以作为标记器(即名词,动词等)。

编辑: 在使用w语言时总是使用unicode。

答案 4 :(得分:0)

如果我没记错的话(我在一年中放松了很多,因此我可能会错了),你想要做的替换是由单词中的最后一个或两个符号决定的。以你的第一个例子为例,任何以'す'结尾的动词在以这种方式结合时总是会有'して'。同样地,对于む - >んで。你可以建立一个最后一个字符的映射 - >共轭形式。您可能需要考虑异常,例如与xxって结合的任何内容。

至于语言之间的可移植性,您必须根据它们的工作方式不同地实现逻辑。这个解决方案对于西班牙语来说也是相当简单的,因为结合取决于动词是以-ar,-er还是-ir结尾(有些动词需要在你的逻辑中有异常)。不幸的是,这是我多语言技能的极限,所以我不知道除了这两种技能之外它会有多好。

答案 5 :(得分:0)

由于日语中的大多数动词都遵循一小组可预测模式中的一种,因此生成给定动词的所有形式的最简单和最可扩展的方法是让动词知道它应该遵循什么样的共轭,然后编写函数来生成每种形式取决于结合。

伪代码:

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.

不规则动词当然是特殊的。

其中一些变体适用于任何其他相当规则的语言(即非英语)。

答案 6 :(得分:-2)

尝试安装我的gem(rom2jap)。它是红宝石。

gem install rom2jap

打开终端并输入:

require 'rom2jap'