翻译设计文档0530Word文档下载推荐.docx
《翻译设计文档0530Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《翻译设计文档0530Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
3.程序输出应为txt格式文件,文件名为输入文件名+(汉),例如:
eng1(汉).txt。
4.待扩展。
。
第二部分:
总体算法描述
翻译工作,简单的理解就是对好入座,读到一个单词,对应输出一个汉语解释。
解决问题在于复杂问题简单化,要完成对号入座,需要几个模块来完成。
一、读取单词。
从待翻译的文本中读取一个单词。
二、寻找单词。
从数据库中寻找这个单词。
(若数据库中不存在这个单词,可以简单的做原单词输出,也可考虑寻找词根并分析)
三、寻找词根。
(可选择的扩展功能)
三、分析单词,得到词义。
依据适当的方法,选出单词适当的词义作为汉语解释输出。
选择方法:
1.查看单词有几种词义,分属何词性,依据句子中前后单词的词性,选择适当的词性。
2.依据上下文语义,选择适当词义。
(比较难,需要构成句子后,再对个别待定单词进行确定词义)
3.待扩展。
以后讲到C++后,我可能更愿意构建一个单词分析类、语句分析类来实现,那样让人感觉更舒服,但现在我们先使用作为基础的C来解决问题,以后用到C++解决就会体会到二者在解决问题时的不同感觉,而这种感觉,不亲自去做,是不行的。
四、分析句子。
翻译的词句构成句子后,简要分析汉语句子是否存在问题。
1.简要分析,例如是否有不该有的重复汉字?
2.综合分析,是否需要调整汉字顺序?
五、当然能做分析的前提是拥有一个好的数据库,而我们现有的只是一个简单粗糙的单词表,我们需要构建适合的数据库。
第三部分:
构建数据结构
通过分析,算法的主要难点在于三、四两点。
必须构建一个合适的数据结构来为这两个模块更好的服务。
一、单词数据结构:
1.能够描述单词本身,当然最好还能记录词根。
2.能够记录不同词性的词义。
struct单词_1
{
charszDanCi[32];
//单词本身
charszCiGen[32];
//词根
词性词义1;
词性词义2;
}
其中词性词义1,2,3.。
可用一个词性词义数组代替,那么结构体将是:
struct单词_2
intiNumCiXing;
//此单词的词性总数,即此单词有多少种词性。
词性词义[10];
//用以描述各个词性词义的结构体数组
};
如此以来,可以依据词性总数来从词性词义数组中依次查询各个词义。
词性词义结构体可定义类似如下:
struct词性词义
intidCiXing;
//词性ID,名词,动词,代词,形容词等10种词性分别用1-10数字来代替。
charszCiYi[64];
//存储汉字词义。
这里面存储字符数组都是用32作为大小,有些长单词或词义可能会越界,这个问题要记在心中,以免以后出现问题而不知所措,
举例说明:
例如单词attack有个动词词义“袭击”,和名词词义“攻击”,当然还有其他许多词义。
在它的词性词义数组中有,元素1的词性词义{idCiXing为1,szCiYi为“攻击”}
元素2的词性词义{idCiXing为2,szCiYi为“袭击”}
二、句子数据结构
如果说单词结构是为了存储数据库,并更好的为单词分析服务,那么句子结构就是为分析特定的一句话服务的。
注定要有许多份单词结构,因为单词本身数量就有几千个,把它们全部存下来,就需要一个很大的结构体数组。
而句子结构主要是分析句子的,通常说来,我们这些不负责任的分析家在分析完一句后就输出分析结果转向下一句的分析了,如果这个分析是实时的一句句的,那么实际上只需要1个句子结构用来分析当前句子即可,除非你想分析完后再依据整段话的核心思想和上下文思想再对各个句子进行含义调整。
struct句子
charszHanZi[128];
//已初步翻译好的一句汉话。
intiNumDanCi;
//此句子中单词数目,
单词信息[32];
//用以存储句子中各个单词的信息,使用固定数32表面一个句子中最多包含32个单词。
这,是我们程序的限制,如果输入文件中句子中单词数太多了,我们程序只能说“不行,句子太长了”,或者只能半句半句的分析了。
关于单词信息结构:
struct单词信息
intidDanCi;
//单词在单词结构数组中的索引,例如attack是单词数据库中的第100个单
//词,那么在这里的值就是100,表明了引用了单词表中第100个的单词。
intidCiXingCiYi;
//词性词义索引,表明使用此单词的哪个词性词义。
};
举例:
句子:
Iwanttoattack。
这个句子的句子结构将是:
{iNumDanCi为4,
单词信息[0].idDanCi为30(假设I在单词表中的顺序),
单词信息[0].idCiXingCiYi为1(使用了名词“我”的词义)
单词信息[1].idDanCi为5000(假设want在单词表中的顺序),
单词信息[1].idCiXingCiYi为2(使用了动词“想”的词义)
单词信息[2].idDanCi为5550(假设to在单词表中的顺序),
单词信息[2].idCiXingCiYi为6(使用了介词“向”的词义)
单词信息[3].idDanCi为100(假设attack在单词表中的顺序),
单词信息[3].idCiXingCiYi为2(使用了动词“袭击”的词义)
整句话翻译结果:
szHanZi[]为:
“我想向袭击”。
第四部分:
所需函数即模块接口
一、由粗糙单词表构建数据库部分
相信大家已经在我昨天布置的问题作业的尝试中找到了适当的难度,甚至很多人感觉无从下手,我们来分析一下问题。
原始的数据库文件是由3种类型的字符串构成,一是单词本身,二是它的某种词性,三是对应的汉语词义。
直接从文件中读取并分辨出来总是感觉困难的,使用库函数怎么样?
可是库函数除了读取字符串或读取整行字符串外没有更多的功能了。
这里,大家要逃出一个圈,从只作为库的使用者升华出来,成为库的构建者,既然库本身没有合适解决这个问题的,我们为何不自己构建一些“库”呢?
其实这里说的库,就是模块的意思。
模块就是化繁为简。
原始单词库文件既然包含3种类型的字符串,想象一下,如果有这么一个函数,它能从文件中获取一个字符串,并能识别出是哪种类型,我们是不是会很受用呢?
于是我们构建了第一个函数。
intGetChuan(FILE*p,char*pc);
该函数返回值标示了返回串的类型,0:
代表错误的串,1:
代表单词串,2:
代表词性串,3:
代表词义串。
你是否还为库函数或类库中没有这样的功能模块感到失望呢?
学会构建吧,不要只做库或类库的使用者,而要做构建者,如果你能构建通用功能的模块或类库,让全世界的人去使用它,那会是什么感觉呢。
就像我们现在一直在使用别人的模块或类库一样,而我们国家的程序员,大多数倒还沉浸在这种使用别人类库的喜悦中,那些类库的构建者会怎么想呢?
你总会比他们低一个档次。
除非你从这种沉浸的喜悦中走出来,攀上那层构建者的台阶,那时才会得到真正的尊重。
C和C++本是自由的构建模式,然而库和类库的使用却容易把人禁锢起来,学会使用类库是必要的,但不应到此为止,这可不是终点。
现代国内热爱计算机的大学生们,未来的程序员们:
学会使用库,但不要被库的使用所禁锢,特别是不能禁锢你们的思想,仅会使用库永远是三流程序员。
当然,如果大家感觉这个函数实现起来还有些难度的话,可以把内部分解为2个小模块:
voidGetSZ(FILE*p,char*pc);
//读取一个串,从开始有效字符,直读到无效字符或标志结尾字符为止。
intFenXiSZ(char*pc);
分析上面得到的那个串,判断到底是无效?
单词?
词性?
词义?
串
当然,实现这些子模块还可能用到分析字符的子模块。
例如:
BoolZiFu_YouXiao(charc);
//判断字符是否是有效字符,例如空格,回车之类应作为无效字符,这样,就可以依据函数返回结果决定如何读取文件。
BoolZiFu_JieShuFu(charc);
//判断字符是否是字符串的结束符,例如每个词性后面都有一个.作为结束符。
BoolZiFu_IsZiFu(charc);
判断这个字符是否为字符,即’a’-‘z’或’A’-‘Z’;
(存在这个库函数isalpha(charc),用于判断字母是否为字符,头文件#include<
ctype.h>
,但我在使用时发现,有些时候这个库函数竟然判断出错了,可能是巧合,也可能是我的编译器版本问题,于是干脆自己去构建一个,也不是很麻烦的事。
BoolZiFu_IsHanZi(charc);
判断字符是否为汉字。
等等。
其实构建好了intGetChuan(FILE*p,char*pc);
这个函数模块后,由“粗糙字典”构建我们的数据库就很容易了,只需要将文件指针和一个字符串缓冲传给函数,就可以从文件中得到一个字符串,并且知道是什么类型的字符串。
依据类型插入到我们数据库结构体数组中的适当位置就可以了,然后从文件中继续去读取下一个字符串,直到文件的结束。
可以写个模块boolLoadZiDian(char*pcName);
来完成整个字典的加载工作。
第一部分数据库构建,到此结束。
接下来转入对单词的搜索,及解释。
二、分析单词对号入座部分
(待定)
第五部分:
源代码
(代码在vc6下编译运行正常)
#include<
stdio.h>
string.h>
conio.h>
以下是词性词义的结构体定义
struct_CiXingCiYi
这里面存储字符数组都是用32作为大小
以下是单词结构体定义
struct_DanCi
charszDanCi[32];
charszCiGen[32];
intiNumCiXing;
_CiXingCiYiCiXingCiYi[10];
5月30增加的句子结构体定义
struct_DanCiXi