7

我有一个想法,可以编写一些网络应用程序来帮助我和其他人更好地学习日语,因为我正在学习日语。

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

但是,我的问题出在实际编码中。我需要的是操作假名的文本字符串。一个例子是:

けす 我需要把那个动词转换成 te 形式的 けして。我更喜欢在 javascript 中执行此操作,因为这将有助于进行更多操作,但如果我必须进行 DB 调用并将所有内容保存在 DB 中。

我的问题不仅是如何用 javascript 来做,还有用其他语言做这些事情的一些技巧和策略。我希望更多地参与语言学习应用程序,但在这方面我迷失了。

4

7 回答 7

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

MeCab(最初在SourceForge 上)很棒:它允许您获取文本,例如,

「日本语は、とても难しいです。」</pre>

并获得各种重要信息

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 文档的帮助或其他任何问题,也可以随时询问。汉字一开始可能会很吓人。

于 2009-05-03T17:05:41.660 回答
4

我的问题不仅是如何在 javascript 中做到这一点,还有在其他语言中做这些事情的一些技巧和策略。

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

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

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

所以 Unicode 感知编程的“秘密”是这样的:学会识别字符串/字符何时何地转换为字节和从字节转换,并确保在所有这些地方使用正确的编码,即将使用相同的编码用于反向转换,并且可以对您正在使用的所有字符进行编码。UTF-8 正在慢慢成为事实上的标准,通常应该在您有选择的任何地方使用。

典型示例(非详尽):

  • 使用非 ASCII 字符串文字编写源代码时(在编辑器/IDE 中配置编码)
  • 编译或解释此类源代码时(编译器/解释器需要知道编码)
  • 读取/写入字符串到文件时(编码必须在 API 中的某处或文件的元数据中指定)
  • 将字符串写入数据库时​​(必须在数据库或表的配置中指定编码)
  • 通过网络服务器交付 HTML 页面时(必须在 HTML 标头或页面的元标头中指定编码;表单可能更加棘手)
于 2009-05-03T17:58:45.713 回答
2

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

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

于 2009-05-04T04:55:00.173 回答
1

你的问题对我来说完全不清楚。

但是,我有一些使用日语的经验,所以我会给我 2 美分。

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

一旦你得到文本分割,使用“普通”工具更容易操作它。

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

编辑:在使用 w 语言时始终使用 unicode。

于 2009-05-02T20:00:30.343 回答
0

如果我没记错的话(我在学日语的那一年偷懒了很多,所以我可能是错的),你想要做的替换是由单词中的最后一个或两个符号决定的。以您的第一个示例为例,以“す”结尾的任何动词在以这种方式共轭时将始终具有“して”。む -> んで 也是如此。您能否建立最后一个字符的映射 -> 共轭形式。您可能必须考虑例外情况,例如与 xxって 共轭的任何内容。

至于语言之间的可移植性,您必须根据它们的工作方式以不同的方式实现逻辑。这个解决方案对于西班牙语也很容易实现,因为变位取决于动词是否以 -ar、-er 或 -ir 结尾(有些动词需要逻辑中的例外)。不幸的是,这是我的多语言技能的限制,所以我不知道超出这两个技能会做得如何。

于 2009-05-02T18:39:06.530 回答
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.

不规则动词当然是特例。

这种情况的一些变体适用于任何其他相当常规的语言(即不是英语)。

于 2009-05-07T05:14:34.067 回答
-2

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

gem install rom2jap

打开你的终端并输入:

require 'rom2jap'
于 2016-01-28T00:17:53.027 回答