一个网站的诞生,日语分词工具

环境:对日开发语言处理

这篇文件将介绍一下日语单词的检索策略。这些策略一部分已经在MagicDict上使用了,有些策略还在斟酌中。

要求:分析词语,将词语中的日文单词分割,转换形式。

此外,这篇文章所需要一些日语知识,如果对日语不是很清楚的话,请看一个网站的诞生- MagicDict开发总结3 [日语字典数据结构]的简单介绍。可能接下来的文章都是对日语的检索方案的讨论,看起来有点累。

分析:

日语的复杂性造就了日语检索的困难度。英文的检索的话,关键字就是单词[字母的字符串]。中文的检索的话,就是汉字的字符串,另外,还可能用拼音进行检索[字母的字符串]。日语的话,可能用来作为关键字进行检索的东西非常多。

  任务1:词语拆分

1.日语汉字,例如:

  任务2:转换形式

        新聞 開き 遊び

 

2.平假名,平假名,例如:

日文的形式转换可以用kanavetor去实现 非常简单 直接调用Kana类的convert方法就可以,在Kana的官网上可以看到用法(即便看不懂介绍,看到管网的表格应该也就一目了然了~)。

   しんぶん、ひらき、あそび

重点在于词语的拆分上:

   这三个平假名分别对应 1.日语汉字的 三个词语 

词语拆分使用了Kuromoji,Kuromoji是一款非常好用的日语分词工具,并且,分解后的词是可以自动将汉字,平假名等转换成カタカナ的,有类似需要的可以直接用这个而不用再去寻找其他工具了。Kuromoji我找到了两个版本,一个是kuromoji,0.7.7版本,官网上说捐献给了apache,内置在Lucene的4.0,5.0版本里,由于忘记Lucene的用法,暂且不考虑。另外一个版本是kuromoji-ipadic,这个东东和kuromoji都是一个公司出的,但是略有不同,稍微研究了一下,kuromoji在使用的时候是只能找到jar包,找不到源代码文件的,通过maven下载可以,但是gradle是引入不了的。而kuromoji-ipadic则是gradlle也可以引用,并且引入之后可以看到源码。此外kuromoji毕竟是以前的api,还有一些小小的缺陷。

         コーヒー、パソコン

kuromoji官网:

        片假名表示外来语,前者是咖啡,后者是个人电脑

Kuromoji-ipadic官网:

3.罗马字,例如:

Kuromoji用法:

         SHINBUNN,HIRAKI,ASOBI

1         Tokenizer tokenizer = Tokenizer.builder().build();
2         for (Token token : tokenizer.tokenize("寿司が食べたい。")) {
        // token 中存放的是分割后的词 不同的属性可以取到该词的不同内容

              // surfaceForm:原内容

3             System.out.println(token.getSurfaceForm() + "t" + );

              // baseForm:内容词语的基础 例如 食べたい⇒食べ

        System.out.println(token.getBaseForm() + "t" + );

4 }

        这三个平假名分别对应 1.日语汉字的 三个词语的放音的罗马字

↑↑↑这个api对日文汉字的识别率不如下面的api(有些简体日文汉字和特别生僻的识别不出来,毕竟是老版本),并且遇到不认识的汉字时token调用get方法会得到null。。。不建议使用。

4.各种复合词语

Kuromoji-ipadic用法:

        コーヒー豆  

1         Tokenizer tokenizer = new Tokenizer() ;
2         List<Token> tokens = tokenizer.tokenize("お寿司が食べたい。");
3         for (Token token : tokens) {
4             System.out.println(token.getSurface()); // 读取到的原内容
5             System.out.println(token.getReading()); // カタカナ
6         }        

   咖啡豆,コーヒー就是咖啡,咖啡是外来语,写为片假名,不过也有写成汉字的情况。

顺带一提,kuromoji-ipadic由于是用new产生产生实例的,所以如果你的工具或系统需要转换大量词汇,要注意不要做太多的new操作,不然会很慢很慢很慢,此时可以定义成静态常量或者单例模式。

对于1,2,3的情况,可能输入的形式不一样,但是最后检索出来的东西是同一个单词。这样的话,规则化就很重要。

欢迎大家评论和指教。

       首先,对于输入内容,平假名和片假名,罗马字,一律变为平假名,统一作为检索关键字。

 

       片假名转换为平假名,使用的是VB的Strconv函数。

       在C#里面使用VB函数,需要加入库的引用

      

using Microsoft.VisualBasic;

       然后,使用下面的方法进行字符转换

 

    /// <summary>
    /// 日本語のローカルID
    /// </summary>
    const int JapaneseLocaleID = 1041;
    /// <summary>
    /// 平仮名からカタカナに変換
    /// </summary>
    /// <param name="Kana"></param>
    /// <returns></returns>
    public static string ConHira2Kata(String Kana)
    {
        return Strings.StrConv(Kana, VbStrConv.Katakana, JapaneseLocaleID);
    }
    /// <summary>
    /// カタカナから平仮名に変換
    /// </summary>
    /// <param name="Kana"></param>
    /// <returns></returns>
    public static string ConKata2Hira(String Kana)
    {
        return Strings.StrConv(Kana, VbStrConv.Hiragana, JapaneseLocaleID);
    }

 

      罗马字转平假名则是自己根据规则写的函数。

 

    /// <summary>
    /// ロマジから仮名に変換
必威官方最新下载 ,    /// </summary>
    /// <param name="strRoma"></param>
    /// <returns></returns>
    public static String ConvertRomaToKana(String strRoma)
    {
必威体育手机端 ,        strRoma = Strings.StrConv(strRoma, VbStrConv.Lowercase, JapaneseLocaleID);
        strRoma = strRoma.Replace("q", "っ");
        for (int i = Strings.Asc("a"); i <= Strings.Asc("z"); i++)
        {
            strRoma = strRoma.Replace(Strings.Chr(i).ToString() + Strings.Chr(i), "っ" + Strings.Chr(i).ToString());
        }
        for (byte i = 0; i <= 108; i++)
        {
            strRoma = strRoma.Replace(KanaRoma[i, 1], KanaRoma[i, 0]);
        }
        return strRoma;
    }

        通过上面的代码,可以把片假名,罗马字,转换为平假名。检索关键字的统一规范化大大降低了检索的复杂度。

        当然,检索关键字要规范化,但是,检索结果表示的时候,还要正确的表示出来。所以,每个词条有一个表示字段,这个字段是最常用的表示形式。例如,  コーヒー 这个词语,检索用的字段是规范化后的片假名 こーひー 和 日语汉字 珈琲,但是其常用的标准书写形式还是片假名的 コーヒー。所以数据表里面有3个字段,常用标准形式,检索用平假名,检索用汉字。

 

对于复合词语,例如

        コーヒー豆

        它可以分解为 コーヒー[咖啡] 和 豆[豆] 两个基本的词语。由于考虑到检索结果里面也希望可以出现咖啡和豆的词条,所以,复合词语的信息[表格]里面,也需要记录构成它的基本词汇的引用信息。这样的话,查到复合词语的时候,也可以快速的获取基本词汇的主键,进而取得基本词汇的详细检索结果。当然,コーヒー豆 也可以表示为各种形式放在检索入口里面:

コーヒー豆     标准

咖啡豆          全部汉字

こーひーまめ 全部平假名

コーヒーマメ 全部片假名

KOOHIIMAME 罗马字

所以,复合词也需要规则化,以及数据表里面有 常用标准形式,检索用平假名,检索用汉字。当然,以后会将英语的coffee bean 也加入检索词条里面,做到英日的检索。

 

汉字,分为简体和繁体汉字,日本使用的是繁体汉字。

1 有一部份汉字的简体和繁体形式一样

     这样的话,需要在日文词典和中日词典里面做2次检索。必须做2次,中日同词不同意义的东西有很多。

2 有人会使用简体汉字查询日语汉字词汇

     在处理汉字的时候,需要先做简体转繁体的操作,然后再在日文词典里面进行检索。

 

Strings.StrConv(mSearchWord, VbStrConv.TraditionalChinese, 0)

 

这样的话 ,大概将用户的输入关键字的预处理说明了一下。懂日语的可能看得懂,不懂得话,基本上是天书。。。 

 

下一篇文章是介绍检索流程。

 

有兴趣的写信给我 root#magicdict.com   [convert # to @ ]

或者加MSN mynightelfplayer@hotmail.com

网站地址

 

本文由必威官方最新下载发布于联系我们,转载请注明出处:一个网站的诞生,日语分词工具

您可能还会对下面的文章感兴趣: