微软新一代输入法框架 TSF - Text Service Framework 小小的研究
虽说是转载的,但是其中,有很多我自己的评论,我会用红色的字标出来,参考的博文有:
TSF架构:http://blog.csdn.net/mspinyin/article/details/6137709
TSF代码实例:http://www.dotblogs.com.tw/code6421/archive/2010/09/27/17909.aspx
TSF的一个C# Wrapper库:http://social.technet.microsoft.com/Forums/office/zh-CN/002efcfc-8d21-4674-b93b-53c8424d448e/vista-api-immgetdescription?forum=2087
下面内容来自第一篇被引用的文章,TSF架构:
几个关于TSF的术语
TIP (Text Input Processor), a Text service in TSF
Cicero,TSF的开发代号,所以微软内部通常称呼TSF框架为Cicero
CUAS (Cicero Unaware Application Support),为所有应用程序和控件提供基本的TIP支持
AIMM(Active Input Method Manager),和CUAS一起工作
输入法框架
先讲一点点历史,Windows提供了两套输入法框架: Windows XP及之前,是IMM (Input Method Manager),基于纯函数API的。目前市面上非微软中文输入法基本上都是只实现IMM框架。
Windows XP开始及以后,Windows提供新的输入框架TSF,是基于COM的。实际上,到了Windows Vista,Windows 7,所有的应用程序和各种输入控件都是优先使用TSF的实现。但之所以Windows Vista,Windows 7用户还能使用各种基于IMM的输入法,是因为Windows提供了一个组件来将所有TSF的请求转为IMM的API。(PunCha:难道Win8开始就不提供了吗?!很有可能,因为Win8下很多Imm的函数都不能使用了)
按照微软的说法,TSF会最终取代IMM框架。而微软拼音基于兼容,功能和性能方面的原因,将这两个框架都实现了。(PunCha:Win8下,只有你们一家还能用Imm的API,很厚道!)
下面主要介绍TSF框架的输入法及与应用程序的交互。
TSF框架
Cicero它的目标是提供一套简单通用并易扩展的框架,用于高级文本输入和自然语言处理。一个TSF text service能够提供多语言支持和处理:键盘输入(我们通常讲的输入法),手写识别,语言识别等。
TSF的构架图
从上面构架图可以看到,TSF提供一个位于应用和输入法实现的间接层(一个Text service/TIP可以是一个输入法,或语音识别,PunCha:记住,TIP就是一个输入法提供的一个服务,比如百度输入法提供“语音、手写、键盘”输入,那就是3个Tip,但是一般我们都是用键盘输入,所以可以简单认为Tip是一种输入法。)。所以,TSF的优点在于,它是一个设备无关,语言中立,可扩展的系统;同时给用户提供一致的输入体验。任何TSF-enabled应用程序都能从任何text service接受文字输入,而不用考虑Text source的具体细节。同时,Text service也不用考虑各种不同应用的差别。譬如下面的应用场景:
上图可以看出, 应用程序收到”The boy ate the red apple”这段文字, 但是它不知道这些字是哪个TIP输入的,有可能是”Keyboard TIP”, 或是”Speech TIP”等。
与应用程序的交互
那么,这个框架是如何工作的?看看下面的组件交互图
在windows XP下,默认是CUAS关闭的,其交互如下
从上图可见,所有“edit control”(包括Notepad)都是直接调用IMM的API,最后调用IMM输入法,而4.1版本后的“RichEdit control”(包括WordPad等)是直接用TSF实现的输入法)
(PunCha:注意,是TSF依赖于Imm)
在Windows XP下如果打开CUAS,或者在Windows Vista和Windows 7下,则如下交互:
可以看到,IMM32和CUAS中多了一条交互,这意味着如果一个输入法实现了TIP,在Windows Vista和Windows 7,或CUAS打开的Windows XP下,应用程序的所有输入由TIP实现完成。
(PunCha:注意,Imm依赖于CUAS了!即可以使用用TSF实现的输入法了,应该就是高级输入)
下面内容来自第二篇被引用的文章的一条注释,使用TSF COM API获得输入法信息:
#include <windows.h> #include <msctf.h> int _tmain(int argc, TCHAR* argv[]) { CoInitialize(0); HRESULT hr = S_OK; //PunCha:创建Profiles接口被 ITfInputProcessorProfiles *pProfiles; hr = CoCreateInstance( CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, IID_ITfInputProcessorProfiles, (LPVOID*)&pProfiles); if(SUCCEEDED(hr)) { IEnumTfLanguageProfiles* pEnumProf = 0; //PunCha:枚举所有输入法咯 hr = pProfiles->EnumLanguageProfiles(0x804, &pEnumProf); if (SUCCEEDED(hr) && pEnumProf) { TF_LANGUAGEPROFILE proArr[2]; ULONG feOut = 0; //PunCha:其实proArr这里应该写成 &proArr[0],因为里面只需要一个TF_LANGUAGEPROFILE变量!而且,proArr[1]都没用到过! while (S_OK == pEnumProf->Next(1, proArr, &feOut)) { //PunCha:获取他的名字 BSTR bstrDest; hr = pProfiles->GetLanguageProfileDescription(proArr[0].clsid, 0x804, proArr[0].guidProfile, &bstrDest); OutputDebugString(bstrDest); wprintf(bstrDest); printf("\n"); BOOL bEnable = false; hr = pProfiles->IsEnabledLanguageProfile(proArr[0].clsid, 0x804, proArr[0].guidProfile, &bEnable); if (SUCCEEDED(hr)) { printf("Enabled %d\n", bEnable); } SysFreeString(bstrDest); } } pProfiles->Release(); } CoUninitialize(); return 0; }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
吴恩达《Machine Learning Yearning》总结(21-30章)
21.偏差和方差举例 前提:对于人类而言,可以达到近乎完美的表现(即人类去做分类是误差可以接近0)。 (1)假设算法的表现如下:训练误差率:1%,开发误差率:11%;此时即为高方差(high variance),也被称为过拟合(overfitting)。 (2)假设算法的表现如下:训练误差:15&,开发误差率:16%;此时即为高偏差(high bias),也被称为欠拟合(underfitting)。 (3)假设算法的表现如下:训练误差:15%,开发误差率:30%;此时即为高偏差和高方差。 (4)假设算法的表现如下:训练误差:0.5%,开发误差率:1%;此时算法已经非常完美。 22.与最优误差率比较 举例:当一个连人类都很难完成(如很多噪音的语音识别)的分类任务,人类的误差率达到14%,此时最完美的误差为14%,该误差称为最优误差率,也称为贝叶斯错误率(Bayes error rate)。以上的最优错误率是可以确定的,但是有些问题如电影推荐,很难去确定其最优误差率是多少。 此时偏差和进一步细化:偏差=最优误差率+可避免偏差;其中可避免偏差高时才值得去优化。 23..处理偏差和方差...
- 下一篇
吴恩达《Machine Learning Yearning》总结(31-40章)
31.解读学习曲线:其他情况 下图反映了高方差,通过增加数据集可以改善。 下图反映了高偏差和高方差,需要找到一种方法来同时减少方差和偏差。 32.绘制学习曲线 情况:当数据集非常小时,比如只有100个样本,这时绘制出来的学习曲线可能噪声非常大。 解决方法: (1)与其只使用10个样本训练单个模型,不如从你原来的100个样本中进行随机有放回抽样,选择几批(比如3-10)不同的10个样本进行组合。在这些数据上训练不同的模型,并计算每个模型的训练和开发错误,最终计算和绘制平均训练集误差和平均开发集误差。 (2)如果你的训练集偏向于一个类,或许它有许多类,那么选择一个“平衡”子集,而不是从100个样本中随机抽取10个训练样本。例如,你可以确保这些样本中的2/10是正样本,8/10是负样本。更常见的做法是,确保每个类的样本比例尽可能的接近原始训练集的总体比例。 33.为何与人类表现水平进行对比 对于人类擅长的事情,例如图像识别,语音识别等。 (1)易于从认为标签中获取数据。 (2)基于人类直接进行误差分析。 (3)使用人类表现水平来估计最优错误率,并设置可达到的“期望错误率”。 对于人类也不擅长...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8编译安装MySQL8.0.19