下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 06:候选词产生

06:候选词产生.doc

06:候选词产生

xufo3ie
2018-09-10 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《06:候选词产生doc》,可适用于IT/计算机领域

本文将要介绍openwnn输入法输入过程中候选词是如何产生的。由于我们只研究前端java代码因此我们只介绍相应的接口。实际上输入法候选词主要是来源于后端(用c代码编写的那部分)这里涉及到一些输入法相关的模型等内容我们在此是不做介绍的。网上流传的openwnn源码后端都没有处理(将c转为so文件)所以都是不可直接生成可运行apk的。我编译了下C代码后的源码下载地址为:http:downloadcsdnnetdetailxianming。、候选词来源      候选词来源分为两种一种是需要复杂变换的一种不需要复杂变换的。这里的定义是:需要复杂变换:需要输入法语言模型经过输入法后端进行变换的。不需要复杂变换:不需要语言模型也不需要经过输入法后端只在前端java代码即可实现变换的。    下面我们就分别来介绍这些内容。这一部分涉及到比较多的类列出来如下:·简单变换LetterConverterjavaRomkanjavaRomkanFullKatakanajavaRomkanHalfKatakanajavaKanaConverterjava·复杂变换WnnEnginejavaOpenWnnEngineJAJPjavaOpenWnnClauseConverterJAJPjavaOpenWnnDictionaryImpljavaOpenWnnDictionaryImplJnijava·辅助类ComposingTextjava、ComposingText    这是一个比较关键的类在很多代码中都有涉及到。所以我们拿出来介绍一下。    该类实际上是表示的是当前正在编辑的串也就是在输入框有个下划线的那一部分。其类中的变量定义如下:size=  **    *Thecontainerclassofcomposingstring    *    *Thisinterfaceisfortheclassincludesinformationaboutthe    *inputstring,theconvertedstringanditsdecoration    *{linkLetterConverter}and{linkWnnEngine}gettheinputstringfromit,and    *storetheconvertedstringintoit    *    *authorCopyright(C)OMRONSOFTWARECO,LTD  AllRightsReserved    *    publicclassComposingText{        **      *Textlayer      *<br>      *Thistextlayerholdskeystrokes<br>      *(ex)RomajiinJapanese  PartsofHangulinKorean      *        publicstaticfinalintLAYER  =        **      *Textlayer      *<br>      *Thistextlayerholdstheresultoftheletterconverter<br>      *(ex)HiraganainJapanesePinyininChineseHangulinKorean      *        publicstaticfinalintLAYER  =        **      *Textlayer      *<br>      *Thistextlayerholdstheresultoftheconsecutiveclauseconverter<br>      *(ex)theresultofKanatoKanjiconversioninJapanese,      *    PinyintoKanjiconversioninChinese,HangultoHanjaconversioninKoreanlanguage      *        publicstaticfinalintLAYER  =        **Maximumnumberoflayers*        publicstaticfinalintMAXLAYER=            **Composingtext'slayerdata*        protectedArrayList<StrSegment>mStringLayer        **Cursorposition*        protectedintmCursor  size复制代码      这里将词分为三层以日文为例:第一层是你输入的按键信息第二层是假名第三层是汉字信息。第三层由第二层得到第二层由第一层得到。比如上面的两个图第一个图显示的是第二层的信息第二层显示的是第三层的信息(按一下“变换”键)。    另外这一个类还用于编辑文节。因为你按下左箭头或者右箭头可以选择整个串的不同部分。这一部分的具体代码我也没怎么看懂?、复杂变换    需要复杂变换的候选词来源于输入法引擎我们来看一下文本变换的引擎接口(如何从输入获得候选词的接口)。该文件为WnnEngine:size=  **    *TheinterfaceofthetextconverteraccessedfromOpenWnn    *<br>    *Therealizationclassofthisinterfaceshouldbeansingletonclass    *    *authorCopyright(C),OMRONSOFTWARECO,LTD  AllRightsReserved    *    publicinterfaceWnnEngine{        *      *DEFINITIONOFCONSTANTS      *        **Theidentifierofthelearningdictionary*        publicstaticfinalintDICTIONARYTYPELEARN=        **Theidentifieroftheuserdictionary*        publicstaticfinalintDICTIONARYTYPEUSER  =            *      *DEFINITIONOFMETHODS      *        **      *Initializeparameters      *        publicvoidinit()            **      *Closetheconverter      *<br>      *      *OpenWnncallsthismethodwhenitisdestroyed      *        publicvoidclose()            **      *Predictwordsphrases      *<br>      *paramtext    Theinputstring      *paramminLen  Theminimumlengthofawordtopredict(  :nolimit)      *parammaxLen  Themaximumlengthofawordtopredict(:nolimit)      *return      Plusvalueiftherearecandidatesifthereisnocandidateminusvalueifaerroroccurs      *        publicintpredict(ComposingTexttext,intminLen,intmaxLen)            **      *Convertastring      *<br>      *Thismethodisusedtoconsecutivesingleclauseconvertin      *Japanese,PinyintoKanjiconvertinChinese,HangultoHanja      *convertinKorean,etc      *      *Theresultofconversionissetintothelayerinthe{linkComposingText}      *Togetothercandidatesofeachclause,call{link#makeCandidateListOf(int)}      *      *paramtext    Theinputstring      *return    Plusvalueiftherearecandidatesifthereisnocandidateminusvalueifaerroroccurs      *        publicintconvert(ComposingTexttext)            **      *Searchwordsfromthedictionaries      *<br>      *paramkey    Thesearchkey(stroke)      *return    Plusvalueiftherearecandidatesifthereisnocandidateminusvalueifaerroroccurs      *        publicintsearchWords(Stringkey)            **      *Searchwordsfromthedictionaries      *<br>      *paramword    Awordtosearch      *return      Plusvalueiftherearecandidatesifthereisnocandidateminusvalueifaerroroccurs      *        publicintsearchWords(WnnWordword)            **      *Getacandidate      *<br>      *After{link#predict(ComposingText,int,int)}or{link#makeCandidateListOf(int)}or      *{codesearchWords()},callthismethodtogetthe      *results  Thismethodwillreturnacandidateindecreasing      *frequencyorderfor{link#predict(ComposingText,int,int)}and      *{link#makeCandidateListOf(int)},inincreasingcharactercodeorderfor      *{codesearchWords()}      *      *return      Thecandidate{code}ifthereisnomorecandidate      *        publicWnnWordgetNextCandidate()    }  size复制代码    以上引用的代码中我们只是将候选词来源的接口列出来了其他一些接口都是用来辅助的所以未予列出。从上面我们可以看出候选词来源包括如下途径:·预测·文节变换(单文节或者多文节变换多文节变换又称为整句变换)·从词典中搜索(预测实际上是以此为基础的预测(词典搜索)      从词典中搜索从字面理解就可以了。但是这里涉及到一个问题:词典格式。openwnn的词典我估计是先用文本文件写好然后再用某一种工具转换为现在的词典样子的。所以你去看词典基本上看不懂。最近我们公司收购了一款基于openwnn的日文输入法现在需要将自己的后端替换掉原来的开源后端。在研究的过程就发现看不懂词典格式所以很多工作就没法做了。      从词典搜索的代码没看但是预计也就是按照词典格式去搜索这个从实现上还是比较简单的。    我们来看一下预测的代码:size=  publicintpredict(ComposingTexttext,intminLen,intmaxLen){          clearCandidates()          if(text==){return}              *setmInputHiraganaandmInputRomaji*          intlen=setSearchKey(text,maxLen)              *setdictionariesbythelengthofinput*          setDictionaryForPrediction(len)                    *searchdictionaries*          mDictionaryJPsetInUseState(true)              if(len==){            *searchbypreviouslyselectedword*            returnmDictionaryJPsearchWord(WnnDictionarySEARCHLINK,WnnDictionaryORDERBYFREQUENCY,                                  mInputHiragana,mPreviousWord)          }else{            if(mExactMatchMode){                *exactmatching*                mDictionaryJPsearchWord(WnnDictionarySEARCHEXACT,WnnDictionaryORDERBYFREQUENCY,                                mInputHiragana)            }else{                *prefixmatching*                mDictionaryJPsearchWord(WnnDictionarySEARCHPREFIX,WnnDictionaryORDERBYFREQUENCY,                                mInputHiragana)            }            return          }        }  size复制代码      预测实际上就是去词典搜索结果。这里有两种模式一种是完全匹配一种是前缀匹配。前者比如你输入“zhongguo”则可以得到词典中读音为“zhongguo”的结果比如“中国”、“种过”等后者比如你输入“zhongguo”在词典中搜索到“中国人民”“中国人民共和国”等结果。文节变换      文节变换包括两种:单文节变换和多文节变换。单文节变换是指比如输入“かわい”可以变换出“可愛”这个词。多文节变换是指连续输入两个单文节实际上每个单文节都会有很多个结果多文节变换选择其中最合适的组合作为两个单文节的组合结果。    由于这一部分跟语言关系比较大所以没怎么看懂就不多介绍了。、简单变换    这种变换直接在前端java代码中完成。主要包括两部分:、罗马音输入、英数全半角片假名变换。罗马音输入      罗马音输入是指你输入拼音输入法根据拼音生成相应的假名(类似于拼音输入)。比如你输入"kawai"则显示的结果为"かわい"这其中就涉及到将ka变换为か的操作。这种输入方式通常存在于全键盘的情况下。但是我发现我编译的openwnn源码是没有全键盘的所以无法使用这个功能的。我下载了一个simeji日文输入法(基于openwnn开发的)其全键盘形式如下:    这一部分是在这四个类中完成的:LetterConverterjavaRomkanjavaRomkanFullKatakanajavaRomkanHalfKatakanajava      实际上大家看源码就是根据HashMap中国查找得出结果的。比如Romkanjava中romkanTable类的内容为:size=  put("la","ぁ")      put("xa","ぁ")      put("a","あ")          put("li","ぃ")      put("lyi","ぃ")    put("xi","ぃ")          put("xyi","ぃ")    put("i","い")      put("yi","い")  size复制代码      这就是为什么你输入li会得到"ぃ"的原因。英数全半角片假名变换这些东西在类KanaConverterjava中完成。    这个类的具体变换过程我就不介绍了。我介绍一下其中的几个HashMap看完这个大家估计就懂了。mHanSuujiMap的内容类似:size=  put("あ","")          put("い","")          put("う","")          put("え","")          put("お","")          put("か","")          put("き","")          put("く","")          put("け","")          put("こ","")  size复制代码mZenSuujiMap:size=  put("あ","1")          put("い","11")          put("う","111")  size复制代码mHanKataMap:size=  put("あ","ア")          put("い","イ")          put("う","ウ")  size复制代码    然后大家在使用时比如输入“あ”按“英数”键可以得到如下结果:      通过这张图大家可以想得到那几个HashMap的作用了吧。、结语      通过以上的介绍大家应该对openwnn日文输入法候选词的产生有了一定的了解了。      这里还涉及到两个问题:·虽然我们知道了这么多接口。但是输入法是如何使用这些接口并生成CandidatesView的呢?这个问题我们会在后续的文章中介绍·java代码是如何调用后端c代码的。这里涉及jni的内容后续会介绍。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/11

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利