[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创代码] WSH - JS 使用OpenCC词库实现词汇级别的繁简转换(By Yu2n)

本帖最后由 yu2n 于 2014-4-6 11:52 编辑

WSH - JS 使用OpenCC词库实现词汇级别的繁简转换(By Yu2n)
  
示例:词汇级别简转繁

  输入:
    中华人民共和国是工人阶级领导的、以工农联盟为基础的人民****的社会主义国家。
    干活 干杯  西太后   后天
    划过来
   
  输出:
    中華人民共和國是工人階級領導的、以工農聯盟爲基礎的人民**專政的社會主義国家。
    幹活 乾杯  西太后   後天
    划過來

OpenCC-WSH.js
  1. // 载入字库字符串
  2. var dictionary_path = WScript.ScriptFullName.substr(0, WScript.ScriptFullName.length -WScript.ScriptName.length);
  3. var TSCharacters = ReadText(dictionary_path + "TSCharacters.txt");
  4. var TSPhrases = ReadText(dictionary_path + "TSPhrases.txt");
  5. var STCharacters = ReadText(dictionary_path + "STCharacters.txt");
  6. var STPhrases = ReadText(dictionary_path + "STPhrases.txt");
  7. // 测试
  8. Test();
  9. function Test() {
  10.   var str1 = "中华人民共和国是工人阶级领导的、以工农联盟为基础的人民****的社会主义国家。";
  11.       str1 += "\r\n干活 干杯  西太后   后天";
  12.       str1 += "\r\n划过来";
  13.   var str2 = "中華人民共和國是工人階級領導的、以工農聯盟爲基礎的人民**專政的社會主義国家。";
  14.       str2 += "\r\n幹活 乾杯  西太后   後天";
  15.       str2 += "\r\n划過來";
  16.   WScript.Echo(new Date() + "\t TC2SC() ");
  17.   WScript.Echo(new Date() + "\r\n" + str1 + "\r\n ==> ");
  18.   WScript.Echo(new Date() + "\r\n" + SC2TC(str1) + "\r\n\r\n");
  19.   
  20.   WScript.Echo(new Date() + "\t TC2SC() ");
  21.   WScript.Echo(new Date() + "\r\n" + str2 + "\r\n ==> ");
  22.   WScript.Echo(new Date() + "\r\n" + TC2SC(str2) + "\r\n");
  23. }
  24. // 载入词库是否完成
  25. function isInitDic(){
  26.   var isInit = !(STCharacters=="" || STPhrases=="" || TSCharacters=="" || TSPhrases=="");
  27.   if (!isInit) WScript.Echo("正在载入词库,请稍等……");
  28.   return(isInit);
  29. }
  30. // 简转繁
  31. function SC2TC(str){
  32.   if (isInitDic()) {
  33.     return(TCSCConverter(STPhrases + "\n" +STCharacters, str));
  34.   } else {
  35.     return("");
  36.   }
  37. }
  38. // 繁转简
  39. function TC2SC(str){
  40.   if (isInitDic()) {
  41.     return(TCSCConverter(TSPhrases + "\n" +TSCharacters, str))
  42.   } else {
  43.     return("");
  44.   }
  45. }
  46. // 使用 OpenCC 词库转换
  47. function TCSCConverter(strDictionaryOpenCC, strSrc) {
  48.   // 数组排序:按字符串长度排序 SortHelper.BubbleSort(array)
  49.   SortHelper = {
  50.     BubbleSort: function(arr) {
  51.       var sortNumber = function(a, b) { return  b[0] - a[0] }
  52.       for(i=0; i<arr.length; i++)
  53.         arr[i]=[arr[i].split("\t")[0].length, arr[i]];
  54.       arr.sort(sortNumber);
  55.       for(i=0; i<arr.length; i++)
  56.         arr[i]=arr[i][1];
  57.     }
  58.   }
  59.   // 词组库排序替换:按字符串长度降序排序
  60.   var arr_Phrases = (strDictionaryOpenCC).split("\n");
  61.   SortHelper.BubbleSort(arr_Phrases);     // 将数组按字符串长度降序排序
  62.   
  63.   // 词组替换
  64.   var arr_find = new Array();
  65.   for (var i=0; i<arr_Phrases.length; i++) {
  66.     var str_SrcPhrases = arr_Phrases[i].split("\t")[0];
  67.     var str_DesPhrases = arr_Phrases[i].split("\t")[1];
  68.     if ((strSrc.indexOf(str_SrcPhrases) != -1) && (str_SrcPhrases != "")) {
  69.       strSrc = strSrc.replace(str_SrcPhrases, "<[?" + arr_find.length + "?]>");  // 增加替换标记
  70.       arr_find.push(["<[?" + arr_find.length + "?]>", str_DesPhrases.split(" ")[0]]);
  71.     }
  72.   }
  73.   
  74.   // 还原替换标记
  75.   for (var i=0; i<arr_find.length; i++) {
  76.     if ((strSrc.indexOf(arr_find[i][0]) != -1) && (arr_find[i][0] != "")) {
  77.       strSrc = strSrc.replace(arr_find[i][0], arr_find[i][1]);  // 还原替换标记
  78.     }
  79.   }
  80.   return(strSrc);
  81. }
  82. // 使用 utf-8 编码读写文本文件
  83. function ReadText(FileName){ return Pfile(FileName, "utf-8", "ForReading", ""); }
  84. function SaveText(FileName, TextString){ return Pfile(FileName, "utf-8", "ForWriting", TextString); }
  85. function LogText(FileName, TextString){ return Pfile(FileName, "utf-8", "ForAppending", TextString); }
  86. function Pfile(FileName, FileCode, strType, TextString){
  87.   var fso = new ActiveXObject("Scripting.FileSystemObject");
  88.   var objStream = new ActiveXObject("ADODB.Stream");
  89.   objStream.Type = 2;
  90.   objStream.Mode = 3;
  91.   objStream.Charset = FileCode;     //不同编码时自己换,Chinese (Simplified) (GB2312),中文 GBK ,繁体中文 Big5 ,日文 EUC-JP ,韩文 EUC-KR,charset=UTF-8(国际化编码),ANSI,Unicode,unicode big endian
  92.   if (fso.FileExists(FileName)==true) {
  93.     objStream.Open();
  94.     objStream.LoadFromFile(FileName);
  95.     if (strType=="ForReading") TextString = objStream.ReadText();
  96.     if (strType=="ForAppending") TextString += objStream.ReadText();
  97.     objStream.Close();
  98.   }
  99.   if (strType=="ForWriting" || strType=="ForAppending") {
  100.     objStream.Open();
  101.     objStream.WriteText(TextString);
  102.     objStream.SaveToFile(FileName, 2);
  103.     objStream.Close();
  104.   }
  105.   objStream = null;
  106.   if (strType=="ForReading"){return(TextString)};
  107.   if (strType=="ForWriting" || strType=="ForAppending"){return(0)};
  108. }
复制代码
OpenCC.html 在线繁简转化(纯Web客户端模式):http://yu2n.sinaapp.com/file/tools/OpenCC/OpenCC.html
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

全文替换的法子简单直接,但用在词汇上可能不够严谨,以楼主按长度排序依次替换的思路为例,假设:
比如 AB 翻译成 12,CD 翻译成 34,而 BCD 应该翻译成 bcd
那么 ABCD 不是就成了 Abcd 吗?

而要加上语法解析的话。。。这工作量太口怕了

TOP

返回列表