标题: [原创代码] WSH - JS 使用OpenCC词库实现词汇级别的繁简转换(By Yu2n) [打印本页]
作者: yu2n 时间: 2014-4-6 11:47 标题: WSH - JS 使用OpenCC词库实现词汇级别的繁简转换(By Yu2n)
本帖最后由 yu2n 于 2014-4-6 11:52 编辑
WSH - JS 使用OpenCC词库实现词汇级别的繁简转换(By Yu2n)
示例:词汇级别简转繁
输入:
中华人民共和国是工人阶级领导的、以工农联盟为基础的人民****的社会主义国家。
干活 干杯 西太后 后天
划过来
输出:
中華人民共和國是工人階級領導的、以工農聯盟爲基礎的人民**專政的社會主義国家。
幹活 乾杯 西太后 後天
划過來
- // 载入字库字符串
- var dictionary_path = WScript.ScriptFullName.substr(0, WScript.ScriptFullName.length -WScript.ScriptName.length);
- var TSCharacters = ReadText(dictionary_path + "TSCharacters.txt");
- var TSPhrases = ReadText(dictionary_path + "TSPhrases.txt");
- var STCharacters = ReadText(dictionary_path + "STCharacters.txt");
- var STPhrases = ReadText(dictionary_path + "STPhrases.txt");
-
- // 测试
- Test();
- function Test() {
- var str1 = "中华人民共和国是工人阶级领导的、以工农联盟为基础的人民****的社会主义国家。";
- str1 += "\r\n干活 干杯 西太后 后天";
- str1 += "\r\n划过来";
- var str2 = "中華人民共和國是工人階級領導的、以工農聯盟爲基礎的人民**專政的社會主義国家。";
- str2 += "\r\n幹活 乾杯 西太后 後天";
- str2 += "\r\n划過來";
- WScript.Echo(new Date() + "\t TC2SC() ");
- WScript.Echo(new Date() + "\r\n" + str1 + "\r\n ==> ");
- WScript.Echo(new Date() + "\r\n" + SC2TC(str1) + "\r\n\r\n");
-
- WScript.Echo(new Date() + "\t TC2SC() ");
- WScript.Echo(new Date() + "\r\n" + str2 + "\r\n ==> ");
- WScript.Echo(new Date() + "\r\n" + TC2SC(str2) + "\r\n");
- }
-
- // 载入词库是否完成
- function isInitDic(){
- var isInit = !(STCharacters=="" || STPhrases=="" || TSCharacters=="" || TSPhrases=="");
- if (!isInit) WScript.Echo("正在载入词库,请稍等……");
- return(isInit);
- }
-
- // 简转繁
- function SC2TC(str){
- if (isInitDic()) {
- return(TCSCConverter(STPhrases + "\n" +STCharacters, str));
- } else {
- return("");
- }
- }
-
- // 繁转简
- function TC2SC(str){
- if (isInitDic()) {
- return(TCSCConverter(TSPhrases + "\n" +TSCharacters, str))
- } else {
- return("");
- }
- }
-
- // 使用 OpenCC 词库转换
- function TCSCConverter(strDictionaryOpenCC, strSrc) {
- // 数组排序:按字符串长度排序 SortHelper.BubbleSort(array)
- SortHelper = {
- BubbleSort: function(arr) {
- var sortNumber = function(a, b) { return b[0] - a[0] }
- for(i=0; i<arr.length; i++)
- arr[i]=[arr[i].split("\t")[0].length, arr[i]];
- arr.sort(sortNumber);
- for(i=0; i<arr.length; i++)
- arr[i]=arr[i][1];
- }
- }
- // 词组库排序替换:按字符串长度降序排序
- var arr_Phrases = (strDictionaryOpenCC).split("\n");
- SortHelper.BubbleSort(arr_Phrases); // 将数组按字符串长度降序排序
-
- // 词组替换
- var arr_find = new Array();
- for (var i=0; i<arr_Phrases.length; i++) {
- var str_SrcPhrases = arr_Phrases[i].split("\t")[0];
- var str_DesPhrases = arr_Phrases[i].split("\t")[1];
- if ((strSrc.indexOf(str_SrcPhrases) != -1) && (str_SrcPhrases != "")) {
- strSrc = strSrc.replace(str_SrcPhrases, "<[?" + arr_find.length + "?]>"); // 增加替换标记
- arr_find.push(["<[?" + arr_find.length + "?]>", str_DesPhrases.split(" ")[0]]);
- }
- }
-
- // 还原替换标记
- for (var i=0; i<arr_find.length; i++) {
- if ((strSrc.indexOf(arr_find[i][0]) != -1) && (arr_find[i][0] != "")) {
- strSrc = strSrc.replace(arr_find[i][0], arr_find[i][1]); // 还原替换标记
- }
- }
- return(strSrc);
- }
-
- // 使用 utf-8 编码读写文本文件
- function ReadText(FileName){ return Pfile(FileName, "utf-8", "ForReading", ""); }
- function SaveText(FileName, TextString){ return Pfile(FileName, "utf-8", "ForWriting", TextString); }
- function LogText(FileName, TextString){ return Pfile(FileName, "utf-8", "ForAppending", TextString); }
- function Pfile(FileName, FileCode, strType, TextString){
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var objStream = new ActiveXObject("ADODB.Stream");
- objStream.Type = 2;
- objStream.Mode = 3;
- objStream.Charset = FileCode; //不同编码时自己换,Chinese (Simplified) (GB2312),中文 GBK ,繁体中文 Big5 ,日文 EUC-JP ,韩文 EUC-KR,charset=UTF-8(国际化编码),ANSI,Unicode,unicode big endian
- if (fso.FileExists(FileName)==true) {
- objStream.Open();
- objStream.LoadFromFile(FileName);
- if (strType=="ForReading") TextString = objStream.ReadText();
- if (strType=="ForAppending") TextString += objStream.ReadText();
- objStream.Close();
- }
- if (strType=="ForWriting" || strType=="ForAppending") {
- objStream.Open();
- objStream.WriteText(TextString);
- objStream.SaveToFile(FileName, 2);
- objStream.Close();
- }
- objStream = null;
- if (strType=="ForReading"){return(TextString)};
- if (strType=="ForWriting" || strType=="ForAppending"){return(0)};
- }
复制代码
作者: CrLf 时间: 2014-4-6 23:56
全文替换的法子简单直接,但用在词汇上可能不够严谨,以楼主按长度排序依次替换的思路为例,假设:
比如 AB 翻译成 12,CD 翻译成 34,而 BCD 应该翻译成 bcd
那么 ABCD 不是就成了 Abcd 吗?
而要加上语法解析的话。。。这工作量太口怕了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |