Board logo

标题: [共同参与][挑战思路][批处理:轻松译单词] [打印本页]

作者: redtek     时间: 2006-10-10 21:50    标题: [共同参与][挑战思路][批处理:轻松译单词]

[共同参与][挑战传统][批处理:轻松译单词]

) 此贴为抛砖引玉,大家扩展思路,互动式共同参与批处理学习~:)

) [轻松译单词]
  例如: E.Bat   computer [回车]
  结果: Computer    计算机
  

  规则: 没有太多规则,
      主要体现在让DOS批处理以更快捷的方式帮助我们更好生活!
      让DOS批处理完成一些实用、且在命令行就能完成的查询工作--翻译不懂的单词。
      纯DOS批处理的单词翻译系统目前国际上还没有(别问为什么,嘻嘻……),
      纯DOS批处理的单词翻译来自于好玩、挑战、趣味、创新并最终落实为实用的想法,
      
      跟我一起想像:
        
        当我看到一些美丽的单词而我不懂它,于是我在DOS命令窗口中打个 e net回车,
        系统提示我: net  网络 ,"噢!,明白了"!

        2008奥运全民学英语,我们认为更要让单词翻译系统诞生在DOS批处理的脚本之下!
        这将是献给奥运和 cn-dos.net 与所有DOS爱好者的最纯的礼物!它完全用批处理实现!

        ……某某报纸刊载一条消息:
          某某某几位大侠,使用一种最原始的批处理开发了想都不敢想像的单词翻译系统……
          我们把它当做挑战吧~:)
          好的思路与优秀的算法只要实现了,用什么语言那都不是重要的事,它是一通百通的。

  思考: 这最终是一个实现方法和算法的问题,很多单词翻译软件都要求极高的效率来检索单词。
      如果拥有20万词汇,用 for /f ... 一条一条枚举可能出现的20万条记录这简直就是……

      但是,如果单词以 A-Z 来划分成26个首字母的区域,
      也就是将检索范围精确缩减到了一个较少的范围,在这个范围内还可以进行某种算法……

      纯批处理开发的英文单词翻译系统对于DOS批处理外行或批处理半懂不懂的网友来说:
      简直是不可能完成的任务!

      实际上,这看上去我们给 %1 一个参数:“ Internet”,然后批处理代码自动翻译成:互联网
      像是很简单的样子,实际上却一点也不简单:

        最快速度的检索算法
        要实现最快速度的检索算法是否还需要辅助标记?
        这个标记如编码?如何利用批处理的一些特殊的地方与辅助标记来达到尽可能方便的检索?
        几十万的词汇量的查找、定位、提取的挑战
      
      这些可行吗?可行,我是在思考了几天之后并做了6万行for以及for..skip等简单测试后得出可行

的结论。


  素材: 可以参考现成的词库等,一般均有以“单词  单词的翻译内容”等为基础的文本词库文件。
      因为算法不一样,词库的格式也不一样,早期的单词翻译软件甚至都用上了foxpro现在的数据库

做检索。
      (单词库我现在暂时没有,如有一定上传上来:)
      (如果你找到,请让大家分享下载地址)

  目的: 拓展思路、增加批处理兴趣、增加大家互动学习亲自动手玩、
      通过我们大家不断的交互让批处理的使用让每个人都能参与共同进步:)

  方向: 这只是其中一个内容,更多的内容需要网友们共同发现、版主支持:)
      大家可以用任何异想天开的任何想法实现上面问题~:)


  为什么要出现此贴: 只有互动每个人都参与,自己的水平才能提高更快。
            将遇到问题时才问、平时不主动学习批处理的方式变成大家主动一步一步共同提高

:)
            我们为创新!为创新这个新世界而活着!

  奖励: 优秀的解题与不同思路的观点解题,由版主象神一样的指导、示范,
      然后给大家加分奖励以示激励~:)

  其它: 等待大家有更好想法和非常实用的互动学习与应用的题目,大家一起参与:)


===================================
  上一期参考:[共同参与][挑战思路][批处理处理浮点运算]
         http://www.cn-dos.net/forum/viewthread.php?tid=23568&fpage=1
         希望我们每一天都为梦想而创新的生活!
     感动: 经过数位版主与大侠的精心创造与开发,批处理解决了浮点运算,
         并由版主与几位大侠创新的完成了理论上无限进位的算法机制,非常精彩!
     获得: 我们在没有更多的类库或函数库的最原始最基础的环境下,
         能够以算法和创新的想法来解决一些平时高级编程里只有函数才能完成的事!
         理论上说:这些用最简单指令完成复杂的操作过程,就是卓越!
         这种思路它可以应运到任何一种语言的开发上,并已经超越了那些普通程序员。
         通过底层进位的模拟与合并计算以及计算结果插入浮点标置的方式,
         早已超越了那些大多数离开了函数库或类库就活不下去的程序员们:)
         
===================================
  以上的想法仅为一个好玩的创新的建议,它献给酷爱批处理的每一位爱好者~:)
===================================

  词典转换工具 与 部分索引 的说明在 第 10楼 由 无奈何版主提供~:)

===================================

[ Last edited by redtek on 2006-10-10 at 23:56 ]
作者: redtek     时间: 2006-10-10 21:58
如果一个文本文件有6万行数据,通过Skip跳过5万9千9百97行,只列出最后几行,
它的速度测试如下:
C:\TEMP>copy con t.bat
@echo off
echo %time%
for /f "skip=59997" %%i in (a.txt) do echo %%i
echo %time%
^Z
已复制         1 个文件。

C:\TEMP>t
9:51:09.64
59998
59999
60000
9:51:09.65
提示: for ... Skip 跳过n行的参数也可以变通为一种快速索引方式:)

具体的开发思路希望更酷的看到大家各显神通,
活越 cn-dos.net!
我们永远要越超的是我们自己!
作者: redtek     时间: 2006-10-10 22:02
它还可以引发为好玩的 “轻松背单词” 的纯批处理:)
作者: NaturalJ0     时间: 2006-10-10 22:19
可以发个词汇表看看吗
作者: electronixtar     时间: 2006-10-10 22:54
觉得还是用vbs+bat直接读取 百度 的翻译最爽
作者: zh159     时间: 2006-10-10 22:55
一个构思:

单词以 A-Z 来划分成26个首字母的字典文件 A.txt-Z.txt

C.txt
Computer=计算机
bat
set "name$=Computer"
for /f "tokens=1* delims==" %%i in (%name$:~0,1%.txt) do if "%%i"=="%name$%" echo %%i:&echo   %%j
这样的字典文件分类、增加方便,只是数量稍多

修改一下,可以有包含空格的短句

[ Last edited by zxcv on 2006-10-10 at 11:14 ]
作者: redtek     时间: 2006-10-10 23:02
精彩~~给 zxcv +2分~:)

单词的长度、单词首字母、偏移量索引表……都是要考虑的内容~:)
希望有更多的网友有更多的想法~:)

可惜没找到词典文件:)
作者: NaturalJ0     时间: 2006-10-10 23:13
直接取百度的,我觉得这主意很好。
作者: vkill     时间: 2006-10-10 23:24


  Quote:
Originally posted by electronixtar at 2006-10-10 22:54:
觉得还是用vbs+bat直接读取 百度 的翻译最爽

这个原理上是可以实现的~是最佳选择
作者: 无奈何     时间: 2006-10-10 23:40
这个议题是很有新意并极具挑战性,个人觉得如果查询时间大于 5 秒就不具有应用性。好像一般的翻译软件词典都定义二进制索引位,而批处理读取二进制文件几乎不太现实。
        关于词典可以参考一下“星际译王”的词典,一下链接为词典格式及创建说明:
http://stardict.sourceforge.net/DICTFILE_FORMAT
http://stardict.sourceforge.net/HowToCreateDictionary

还有可以提取金山词霸的词典,可以用 dwing 大侠制作的转换软件。见附件:
附件 1: KSDrip.zip (2006-10-10 23:40, 10.46 K, 下载附件所需积分 1点 ,下载次数: 70)

作者: pengfei     时间: 2006-10-11 00:05
这里我有一个思路, 没有经过测试:

搜索代码:
@echo off
:: 标签的使用是提高数据检索的关键.
:: 一:
:: 条件是字典文件中已经对26个字母开始的单词开始的位置做了准确的记录.
:: 如A开头的单词在第一行, B开关的单词从1000行开始, N开头的单词从80000行开始...
:: 二:
:: 对标签做进一步的化分, 如所有以A开头的单词, 我们再将他们第二个字母进行标记. 如Ak中的K::记录了第二个字母k到第一个字母A的行数
:: 还可以对标签做进一步的细分.
:: 这样输入单词, 批处理自动分析他的前几个字母, 再准确地计算出他们的开始位置, 跳过前面的行再执行搜索.

:: 标签的使用: 第一个字母开头的行数为标签名A:(起始行数跟在标签的后面,以空格作为分隔符), Ac开头的单词第二个字母的标签为c::(他后面记录了从A: 起始行数到ac开始的单词的行数值).
:: 如果需要第三个字母就以a::: b:::作为标签.

set name=auto
for /f "tokens=1,2 delims= " %%i in (data.txt) do (
    if /i "%%i"=="%name:~0,1%:" set one=%%j
    if /i "%%i"=="%name:~1,1%::" set two=%%j
)
set /a result=%one%+%two%
echo %name%单词搜索的起始行为:%result%
pause

for /f "skip=%result% tokens=1* delims= " %%c in (English.txt) do (
    if "%%i"=="%name%" (
        echo %%i:
        echo %%j
        goto fulfill
    )
)
:fulfill
echo.
pause >nul
date.txt(记录字典中字母的行数的资料):
A: 8
a:: 1
b:: 221
c:: 653
d:: 982
e:: 1203
f:: 1543
g:: 1828
h:: 2356
i:: 2820
j:: 3321
k:: 3925
l:: 4428
m:: 5243
n:: 5892
o:: 6024
p:: 6231
q:: 7120
r:: 8418
s:: 8942
t:: 9531
u:: 9942
v:: 12358
w:: 12903
x:: 13615
y:: 14032
z:: 15482
[ Last edited by pengfei on 2006-10-11 at 00:12 ]
附件 1: 单词检索.rar (2006-10-11 00:11, 987 bytes, 下载附件所需积分 1点 ,下载次数: 45)

作者: vkill     时间: 2006-10-11 01:05
wget.exe  down_url:http://www.xfocus.net/tools/200305/403.html
mplayer.exe  down_url:http://www1.mplayerhq.hu/MPlayer ... mingw32-1.0pre8.zip


思路:下载www.iciba.com上查询单词的源代码,for /f实现
@echo off
:: 需要wget支持(也可以用vbs来实现),还需要mplayer支持
ping -n 1 www.iciba.com>nul &&goto start ||echo www.iciba.com网站不能连接&pause>nul&goto :eof
:start
set search=
set /p search=请输入要翻译的单词:
set search_x=%search:~0,1%
if not exist d:\wget_temp md d:\wget_temp
wget.exe --output-document=d:\wget_temp\%search%.txt --append-output=d:\wget_temp\down_temp.txt "http://www.iciba.com/search?s=%search%" &&goto d_txt_ok ||echo 文件没有下载成功&pause>nul&goto :eof
:d_txt_ok
wget.exe --output-document=d:\wget_temp\%search%.swf --append-output=d:\wget_temp\down_temp.txt "http://www.iciba.com/resource/a/en/%search_x%/%search%.swf" &&goto d_swf_ok ||echo 文件没有下载成功&pause>nul&goto :eof
:d_swf_ok
echo.
echo 读音 and 释义
mplayer.exe D:\wget_temp\%search%.swf>nul
set var=</div>
for /f "skip=? tokens=? delims=!var!" %%a in ("d:\wget_temp\%search%.txt") do echo %search%释义为%%a
pause>nul

[ Last edited by he200377 on 2006-10-11 at 03:08 ]
作者: electronixtar     时间: 2006-10-11 01:13
用vbs的话有两种,一种是 InternetExplorer.Application 获得 document(DOM)然后直接输出 InnerText,第二种是用 xmlhttp + htmlfile ,需要产生零时文件,不爽
作者: namejm     时间: 2006-10-11 01:23
   redtek的点子一个接一个,想法非常不错,很能促进本论坛的繁荣,个人给他+4分。希望各位能多出好点子,多写好代码。
作者: 3742668     时间: 2006-10-12 07:25
纯粹地用批处理来处理本主题的要求的话,搞定了效率就难以搞定词库格式,如果降低词库的要求那么效率又不堪入目。在二者不可得兼的情况下,一般我都会把这个包袱丢给cmd去做:
@echo off
    echo @echo off >x.bat
    echo :start >>x.bat
    echo     set /p xxx=输入单词: >>x.bat
    echo     call :%%xxx%%  >>x.bat
    echo     pause  >>x.bat
    echo goto :eof >>x.bat
    for /l %%i in (1,1,100000) do (
        echo :%%i >>x.bat
        echo echo %%i >>x.bat
        echo goto :eof >>x.bat
    )
上面十万条记录,我的电脑上搜索到结尾需要大概3秒,不过和findstr比起来却又低了不少:
findstr /nirc:"^:9399 .*" x.bat


  Quote:
C:\Documents and Settings\%username%\桌面>findstr /nirc:"^:9399 .*" x.bat
28201::9399

结果包含行号,搜索也用了不到1秒。而有了行号对于处理起词库来说就比较简单了。
所以,个人认为在不使用其他工具的情况下,用findstr无疑是最好的选择。
作者: namejm     时间: 2006-10-12 08:02
  正如3742668所说的那样,词库的格式是非常重要的,要用CMD查找词库的匹配内容,非findstr莫属。初步写了一段代码,要求词库的格式是:单词独占一行(不区分大小写);翻译的内容另起一行(不允许出现纯字母行),可以有多行。

  代码:
@echo off
:begin
cls
set input=
set /p input=请输入要查找的单词(要退出请直接回车):
if not defined input exit
for /f "tokens=1,2 delims=:" %%i in ('findstr /n . test.txt') do (
    if /i "%%j"=="%input%" (set line=%%i&&goto display)
)
echo _________________________________
echo.
echo 没有找到 %input% 的记录
echo _________________________________
echo.
pause
goto begin

:display
echo _________________________________
echo.
echo %input%:
for /f "skip=%line% tokens=*" %%i in (test.txt) do (
    echo %%i|findstr "^[a-zA-Z]*$">nul &&goto end||echo     %%i%
)
:end
echo _________________________________
echo.
pause
goto begin
测试内容格式举例:
China
n.
中国, 瓷器

DOS
n.
磁盘操作系统

name
n.
名字, 名称, 姓名, 名誉
vt.
命名, 提名, 叫出, 指定
adj.
姓名的, 据以取名的

who
pron.
谁, 那...的(人)
  有兴趣的请用更多的内容来进行测试。

[ Last edited by namejm on 2006-10-12 at 08:19 ]
作者: 3742668     时间: 2006-10-12 08:38
Re namejm:
    记得上次在某个帖子里就提到过,把findstr防止循环外面和防在循环里面两种方法的效率会大不一样。 用你上面的方法在处理起数万行记录的时候效率就非常低下了,所以最好是先findstr,再for。时间关系,写个流程:
@echo off
    for /f "delims=:" %%i in ('findstr /nirc:"^%单词% .*" 词库.txt') do set /a col=%%i + 1
    for /f "delims= skip=%col%" %%i in (词库.txt) do echo %%i && goto :next
    :next
    .
    .
    .
上面的方法效率应该会高很多,兄弟买了新手机,我去帮下音乐去了,闪了。
作者: namejm     时间: 2006-10-12 08:56
  呵呵,是的,放在for内部和外部的效率差别是很大的,因为杀软刚换成卡巴,更新频繁,一更新CPU占用往往达到100%,卡得很,那个代码我只测试了一小段内容,看来我得把卡巴禁用一下再测试。
作者: lxmxn     时间: 2006-10-12 09:12

    namejm兄的代码不错,顶一个先.......

作者: namejm     时间: 2006-10-12 09:52
  修改了16楼的代码如下,在本机上测试3W行内容,结果转瞬间就出来了。请各位测试更多更复杂的内容,看看效率和准确性如何:
@echo off
:: 要求词库的格式是:单词独占一行(不区分大小写);
:: 翻译的内容另起一行(不允许出现纯字母行),可以有多行。
:begin
cls
set input=
set line=
set /p input=请输入要查找的单词(要退出请直接回车):
if not defined input exit
for /f "tokens=1* delims=:" %%i in ('findstr /nirc:"^%input%" 词库.txt') do (if /i "%%j"=="%input%" set line=%%i)
if not "%line%"=="" (goto display) else (
echo _________________________________
echo.
echo 没有找到 %input% 的记录
echo _________________________________
echo.
pause
goto begin)

:display
echo _________________________________
echo.
echo %input%:
for /f "skip=%line% delims=" %%i in (词库.txt) do (
    echo %%i|findstr "^[a-zA-Z]*$">nul &&goto end||echo     %%i
)
:end
echo _________________________________
echo.
pause
goto begin

作者: redtek     时间: 2006-10-12 09:53


  Quote:
Originally posted by 3742668 at 2006-10-12 07:25:
纯粹地用批处理来处理本主题的要求的话,搞定了效率就难以搞定词库格式,如果降低词库的要求那么效率又不堪入目。在二者不可得兼的情况下,一 ...

『第 15 楼』这个真有意思~:)
连未来的词库录入原理都做出来了,哈哈……

[ Last edited by redtek on 2006-10-12 at 09:54 ]
作者: 3742668     时间: 2006-10-12 11:44
建议做成双向翻译的。不光阴译汉,还能汉译阴。
另外关于20F的代码觉得似乎存在一些瑕疵:
第一个for语句中,建议在%input%后面加上$,否则可能导致搜索结果出错。
for /f "delims=:" %%i in ('findstr /nirc:"^%input%$" 词库.txt') do if not defined line set line=%%i
纸上谈兵而已,均未实践。
作者: namejm     时间: 2006-10-12 12:16


  Quote:
Originally posted by 3742668 at 2006-10-12 11:44:
建议做成双向翻译的。不光阴译汉,还能汉译阴。
另外关于20F的代码觉得似乎存在一些瑕疵:
第一个for语句中,建议在%input%后面加上$,否则可能导致搜索结果出错。

  应该不会出错的,因为我在do后用if /i "%%j"=="%input%"来完全匹配了。之所以不采用加$的格式,是因为最开始测试的时候加了却没有成功,后来发现,如果最后一行的内容为要查找的%input%的话,则不会检测到单词,应该是findstr正则表达式在匹配最后一行的时候有bug,所以换成了if的格式——虽然加$的方法在这个具体的应用中没什么问题。

  至于做成汉译英,这个就有点超高难度了,我甚至有点怀疑CMD能否完成这个任务。如果可以的话,那还得在词库的格式上找到突破点。
作者: redtek     时间: 2006-10-12 13:12
如果在词库格式上找突破,
就越来越像是在寻找并重新研究突破一个最适合批处理使用的 纯文本数据库系统 了~:)
作者: redtek     时间: 2006-10-12 13:26
如果做成汉译英功能,
那么同一文件内的英文单词所对应的中文解释里可能会含有任何中文词汇,
如:“是”、“代表”、“含意”等这些中文词或小到中文的单字,
它们几乎遍及了每一个英文单词的中文翻译内,
findstr整个文件查找一个中文词或中文字所对应的英文,
很可能会找到一大堆不相关的别的单词解释内所含有的相混的内容:)


除非,让英文单词与它的中文解释各占一个文件,
即英文单词库存一个文件,每个单词占一行。
英文单词的中文解释也存一个文件,中文解释必须也仅占一行。

然后,这个英文单词与它的中文解释虽不在同一文件内,但它们必须是相同的行号。

这样,在找到任何一个行号内的中文解释时,或找到任何一个英文词,
只要知道它的行号,就可以 for /f "skip=来直接跳过多少行在另一个文件中直接提取内容。


但是,一个英文可能有多个中文解释,
而这多个中文解释的词汇很可能在多达十万条英文单词的中文解释的内容中产生极大雷同,Findstr很可能一查某个中文词就会找到非常多……
作者: redtek     时间: 2006-10-12 13:58
做一个小实验:)


============ 实验版中译英/英译中互译   ===============
e.bat
@echo off
echo.
echo =======================================
echo     实验版,只能翻译如下内容:
echo.
echo     中国 美国 日本 计算机
echo     china  usa  japan  computer
echo =======================================
echo.

set /p go=[汉译英/英译汉]请输入要翻译的词:
goto :%go%


:china
:中国
        echo china : 中国
        goto :eof

:usa
:美国
        echo usa : 美国
        goto :eof

:japan
:日本
        echo japan : 日本
        goto :eof

:computer
:计算机
        echo computer : 计算机
执行过程:
C:\TEMP>e.bat

=======================================
    实验版,只能翻译如下内容:

    中国 美国 日本 计算机
    china  usa  japan  computer
=======================================

[汉译英/英译汉]请输入要翻译的词:美国
usa : 美国

C:\TEMP>e.bat

=======================================
    实验版,只能翻译如下内容:

    中国 美国 日本 计算机
    china  usa  japan  computer
=======================================

[汉译英/英译汉]请输入要翻译的词:china
china : 中国

C:\TEMP>e.bat

=======================================
    实验版,只能翻译如下内容:

    中国 美国 日本 计算机
    china  usa  japan  computer
=======================================

[汉译英/英译汉]请输入要翻译的词:中国
china : 中国
批处理支持中文标签goto(好奇,正好瞎试出来的),
反正:computer标签执行完它后面也没GOTO,
:计算机的标签也会跟着执行,干脆把多个标签放一块!
不管输入的是中文还是英文什么的,
怎么都能让它指正确了:)
这一堆相关连的标签只有遇到goto的时候才能出去,哈哈:)


(权当玩笑,哈哈……)

[ Last edited by redtek on 2006-10-12 at 14:04 ]
作者: pengfei     时间: 2006-10-13 01:04
各位的讨论很精彩, 如果进行单词检索, 现实生活中翻字典就是一个非常好的算法.

中文字典就有拼音和笔画查找等.

而英语字典就是按开始的字母一个个的查找其对应的页码. 这样的算法人工查找都非常地快, 如果计算机来完成相信速度一定不错.
作者: redtek     时间: 2006-10-13 01:08
于是诞生了DOS版新华字典,哈哈……
作者: pengfei     时间: 2006-10-13 01:13
呵呵~ 这里如果把所有的英文单词都做为标签, 速度也不可能太快, 原因搜索这么多的标签也是要一定时间的.

而给单词分类跳过前面的数据从匹配行开始查找, 这样计算前几个字母的相应位置后再搜索, 可能只需要搜索几十几百个单词就会出现你要查找的结果.
作者: namejm     时间: 2006-10-13 01:39
  终于找到了一个适合汉译英的词库格式,请看下面的初步代码及格式举例。测试3W行数据依然只是转瞬间的工夫,目前只做出了精确查询模式。因时间关系,来不及仔细测试,各位有时间有兴趣的可以拿来折磨一下自己的机器^_^。


代码:
@echo off
:: 功能:从词库中查询汉语词汇对应的英文
:: 要求词库的格式是:
:: 文件第一行内容必须为空,或者不出现要查找内容的正文
:: 一个段落块的首行必须为纯英文词汇
:: 中文翻译内容另起一行(不允许出现纯字母行),可以有多行
:: 翻译之下可以有举例内容
:: 每个解释前后分别加空格和中文半角状态下的分号,此解释可以在同一行,也可在不同行
:: 解释之下的举例内容尽量避免出现空格和中文半角状态下的分号连用的情况
:: 每个段落块允许使用空行分隔

:begin
cls
set input=
set line=
set /p input=请输入要查找的汉语词汇(要退出请直接回车):
if not defined input exit
for /f "tokens=1* delims=:" %%i in ('findstr /nrc:" %input%;" 词库.txt') do if not "%%j"=="" set /a line=%%i-2&& goto display
echo _________________________________
echo.
echo 没有找到 %input% 的记录
echo _________________________________
echo.
pause
goto begin

:display
echo _________________________________
echo.
echo %input%:
:loop
for /f "skip=%line% delims=" %%i in (词库.txt) do (
    echo %%i|findstr "^[a-zA-Z]*$">nul &&(echo     %%i&&goto end)||(set /a line=%line%-1&& goto loop)
)
:end
echo _________________________________
echo.
pause
goto begin
格式举例:
(此行为顶行,不允许出现要查找内容的正文)
china
n.
中国; 瓷器;
说明:……
china

DOS
n.
磁盘操作系统;
DOS
  优化了代码的算法,使得词库内容的英文单词行不用重复标记,可以使词库的体积得到减少。

[ Last edited by namejm on 2006-10-13 at 06:31 ]
作者: pengfei     时间: 2006-10-13 02:44
不知哪位兄台能搞到文本格式的英汉字典, 这样做起来更爽...
作者: namejm     时间: 2006-10-13 06:34
  字典的格式需要自己来定义,不用找现成的字典,否则,很难用CMD来处理。

  如果只要字典的内容的话,可以用无奈何兄所发的金山词霸字典提取工具来提取内容,不过提取出来的内容比较凌乱。
作者: namejm     时间: 2006-10-13 12:42    标题: 2006-10-14更新

  贴一个中英文互译的初步代码出来,能初步检测一些出错的情况。

  由于加入了显示具有相同头部或具有相同词义的所有单词的功能,不能再用 for /l %%i in (1,1,10000) do (>>词库.txt echo var) 的方法创建上万行的词库文件来测试,所以只做了功能测试而没做效率测试,如果哪位兄弟可以搞到能满足这个代码格式要求的词库文件,请告诉我方法或者放出文件,不胜感激。

  再次强调,成败的关键在于词库文件的格式。
@echo off
:: 功能:
::
::   ① 输入英文,显示该英文条目下的所有内容;
:: 同时显示词库中存在的、词义相同或头部相同的其他单词;
::     ② 输入汉语,显示词义中包含该汉语词汇的所有英文
::
:: 词库文件的格式要求:
::
::   文件第一行内容必须为空,或者不能出现要查找内容的正文
::   一个段落块的首行必须为纯英文词汇
::   中文翻译内容紧接着另起一行(不允许出现纯字母行),可以有多行
::   翻译之下可以有举例内容
::   每个解释后面加中文半角状态下的分号和空格
::     解释内容可以在同一行,也可以在不同行
::   解释之下的举例内容尽量避免出现中文半角状态下的分号和空格连用的情况
::   每个段落块允许使用空行分隔
::
::             code by JM 2006-10-11~14    http://www.cn-dos.net  Thanks to 3742668

:input_var
title 英汉互译器
cls
set line=
set postil=
set postil_content=
set similar=
set input=
set /p input=请输入要查询的内容(要退出请直接回车):
if "%input%"=="" exit

ren ============== 判断输入类型 ==============
cls
echo %input%|findstr "^[a-zA-Z]*$">nul && goto letters || goto not-letters

ren ============== 英译汉 ==============
:letters
title 英汉互译器-英译汉
:: 先提取匹配单词的第一条记录的行数,然后再从这行之下查找第一次出现的单词
:: 两个单词之间的内容就是英文的翻译
for /f "tokens=1* delims=:" %%i in ('findstr /nirc:"^%input%" 词库.txt') do (
    if /i "%%j"=="%input%" set line=%%i&goto word_finded
)
if "%line%"=="" goto no-item
:word_finded
echo _________________________________
echo 要查找的单词:%input%
echo.
setlocal enabledelayedexpansion
for /f "skip=%line% delims=" %%i in (词库.txt) do (
    echo %%i|findstr "^[a-zA-Z]*$">nul &&(goto no-postil)||(
        echo     %%i&if not "%%i"=="" set postil=exist
        echo %%i|findstr /c:"; ">nul &&(
            set postil_content=!postil_content!%%i
        )            
    )
)
:no-postil
if "%postil%"=="" (echo     %input% 条目下没有任何内容 & goto end)
echo _________________________________
echo 词义类似的单词:
echo.
for /f "tokens=1* delims=:" %%i in ('findstr /nr "%postil_content%" 词库.txt') do (
    if not "%%j"=="" set /a line=%%i-2&& call :check_similar
)
if "%similar%"=="" echo     暂无。
echo _________________________________
echo 头部相同的其他词汇:
echo.
set similar=
for /f "tokens=1* delims=:" %%i in ('findstr /nirc:"^%input%" 词库.txt') do (
    echo %%j|findstr "^[a-zA-Z]*">nul && (
        if not "%%j"=="%input%" set similar=exist&echo     %%j
    )
)
if "%similar%"=="" echo     暂无。
:end
echo _________________________________
echo.
pause
goto input_var

:check_similar
:: 查找词义中含有%postil_content%的所有英文词汇
for /f "skip=%line% delims=" %%i in (词库.txt) do (
    echo %%i|findstr "^[a-zA-Z]*$">nul &&(
        if not "%%i"=="%input%" (
            echo     %%i&set similar=exist&goto :eof
            ) else (goto :eof)
    )||(set /a line=%line%-1& goto check_similar)
)
goto :eof

ren ============== 汉译英 ==============
:not-letters
title 英汉互译器-汉译英
:: 先提取包含该汉语词汇的第一条记录的行数,然后再查找位于该行之上的纯字母行
:: 则第一次找到的纯字母行就是要查找的英文单词
:: 重复以上过程就可以查找到词义中包含这个汉语词汇的所有英文词汇
echo _________________________________
echo.
echo %input%:
echo.
for /f "tokens=1* delims=:" %%i in ('findstr /nrc:"%input%; " 词库.txt') do (
    if not "%%j"=="" set /a line=%%i-2&& call :check_word
)
if "%postil%"=="" goto no-item
echo _________________________________
echo.
pause
goto input_var

:check_word
:: 查找词义中含有%input%的所有英文词汇
set postil=exist
for /f "skip=%line% delims=" %%i in (词库.txt) do (
    echo %%i|findstr "^[a-zA-Z]*$">nul &&(echo     %%i&&goto :eof)||(
        set /a line=%line%-1&& goto check_word
    )
)
goto :eof

ren ============== 出错提示 ==============
:no-item
cls
echo _________________________________
echo.
echo %input%:
echo   没有找到该条目!
echo _________________________________
echo.
pause
goto input_var
[ Last edited by namejm on 2006-10-15 at 00:40 ]
作者: namejm     时间: 2006-10-17 12:11
  今天突然想到,用33F的思路可以写一个公交线路信息查询器之类很实用的东西,预计可以实现如下两个功能:
  

  Quote:
① 输入线路名称,显示该线路的所有站点及发车收车时间;
② 输入上车站点和下车站点,显示可搭乘的车次,并显示每条线路中这两个站点及其之间的所有站点及发车收车时间;

  有兴趣的不妨尝试着去做一做。

——————————————————————————————————————

  公交线路信息查询器的代码已经放出来了,请点 这里 查看。

[ Last edited by namejm on 2006-11-15 at 01:37 PM ]
作者: zh159     时间: 2006-10-17 13:43


  Quote:
② 输入上车站点和下车站点,显示可搭乘的车次,并显示每条线路中这两个站点及其之间的所有站点及发车收车时间;

这个复杂了,要判断这些车次的交汇点估计不是易事,而且有可能有3次以上车次
作者: vkill     时间: 2006-10-18 05:49
不管做什么."数据库"txt的格式很重要
作者: redtek     时间: 2006-10-18 07:14


  Quote:
Originally posted by namejm at 2006-10-17 12:11:
  今天突然想到,用33F的思路可以写一个公交线路信息查询器之类很实用的东西,预计可以实现如下两个功能:
  

  有兴趣的不妨尝试着去 ...

namejm这想法有意思,可要记在本上留好~:)
到处都是公交查询系统,还有学生毕业设计,但是DOS批处理版的估计除了少数DOS高手之外没有什么人可以想像的到DOS照样可以做这些,并且很快:)

给版主加上1分~:)
作者: redtek     时间: 2006-10-18 07:20


  Quote:
Originally posted by zxcv at 2006-10-17 13:43:


这个复杂了,要判断这些车次的交汇点估计不是易事,而且有可能有3次以上车次

这些好的思想和创造它的工具可以影响很多人对某一件事情的想法和了解的深度~:)

再难的东东还可以留给 “批处理大赛活动” 中使用~:)

这真是开始接触从底层考虑和分析一些东东了,哈哈……
有多少程序员每天用着SQL查询着n多的东东,并且命令玩得很炫!
但是,又有多少程序员知道他们正在用的SQL或其它查询的底层里到底做的什么……

这些可能对99%的都不重要,应用就是生产的过程:)
相信还有创造的过程也是非常精彩,它将留给更喜欢它的人去做得更精彩~:)

zxcv有什么好想法和算法快说出来啊~:)
作者: goodfile     时间: 2006-10-23 01:02
多谢~~~~~
作者: zh159     时间: 2006-10-28 12:39
20F namejm 版主的脚本查找 10W 行未发现问题,结果转瞬间就出来了。

[ Last edited by zxcv on 2006-10-29 at 02:02 AM ]
作者: zouzhxi     时间: 2006-11-15 07:43
只要把namejm版主的BAT稍稍改了一下,就成了DOS版的通讯录了...
下面我把截图给大家看看...

  Quote:
第一张

第二张是 增加和删除窗口

第三张是 查询窗口

第四张是 所以需文件

这样是主文件和一个库文件。
Tel.db文件一开始是没有的。只有用户增加了联系人才会出现。

暂时还不能实现修改功能,只能手工去库里边修改。
作者: namejm     时间: 2006-11-15 08:21


  Quote:
Originally posted by zouzhxi at 2006-11-14 18:43:
只要把namejm版主的BAT稍稍改了一下,就成了DOS版的通讯录了...
下面我把截图给大家看看...

暂时还不能实现修改功能,只能手工去库里边修改。

  请问你想修改成什么样子?是用某些字符去替换另外一些字符,还是增添内容,或者删除记录?我所问到的这些功能,有些是可以在批处理里解决的。

[ Last edited by namejm on 2006-11-14 at 07:23 PM ]
作者: zh159     时间: 2006-11-15 09:29
他的意思是修改或删除某人的资料,添加倒是很方便,echo>>就OK了
作者: namejm     时间: 2006-11-15 09:47
  删除某项记录也挺方便的,只不过是要生成临时文件,思路是:用 findstr /v 来过滤你要删除的内容,然后把要保留的内容 echo 到临时文件中去,再用这个临时文件覆盖掉当前数据库。难点有两处:1:如何精确地过滤掉想删除的记录。可通过 findstr 的正则表达式来解决;2、如何获取要过滤的信息块。可配合 for 语句中的 skip 来解决。
作者: zh159     时间: 2006-11-15 13:12
删除某项电话本记录:

bat
@echo off
echo.
set /p 删除人员=  删除人员:
>TelN.db echo ::电话本数据库
>>TelN.db echo --------------------------------------------------
>>TelN.db echo.
setlocal EnableDelayedExpansion
for /f "delims=" %%i in (Tel.db) do (
  if "%%i" == "::" set /a Num+=1
)

set Delete=echo
for /f "skip=3 delims=" %%i in (Tel.db) do (
  if "%%i" == "%删除人员%" set Delete=rem&&set /a N-=1
    !Delete! %%i>>TelN.db
  if "%%i" == "::" !Delete!.>>TelN.db&&set /a N+=1&&cls&&echo.&&echo   !N!/%Num%&&set Delete=echo
)
pause
exit
Tel.db
::电话本数据库
--------------------------------------------------

张三
联系人姓名:张三
联系人电话:张三
联系人地址:张三
联系人单位:张三
::

李四
联系人姓名:李四
联系人电话:李四
联系人地址:李四
联系人单位:李四
::

王五
联系人姓名:王五
联系人电话:王五
联系人地址:王五
联系人单位:王五
::
[ Last edited by zxcv on 2006-11-15 at 09:24 AM ]
作者: redtek     时间: 2006-11-15 21:03
建议《通讯录》可以单做出一个成品来新贴发布~:)

以后这个《通讯录》也是世人注目的论坛优秀资源啊~:)
作者: ccwan     时间: 2006-11-15 21:30
确实是不错的精华贴。我上传一个计算机与网络英汉对照词典大家凑合用用,实在没有全本字典的资料了。

[ Last edited by ccwan on 2006-11-15 at 11:22 PM ]
附件 1: 计算机与网络英汉对照词典.txt (2006-11-15 23:19, 26.83 K, 下载附件所需积分 1点 ,下载次数: 45)

作者: namejm     时间: 2006-11-16 02:06
  多谢 ccwan 兄提供词典文本。能不能说一下你是怎么弄到这个东西的——网上下的还是自己提取的?曾经在一些英语论坛上看到过有人说可以从大型词典软件中提取到纯文本格式的词库来自己加工,很想知道是如何做到的。

  看了一下词典格式,发现有些是单词组,中间带了空格的,看来我的翻译器还得修改一些代码才能适应这种情况。
作者: ccwan     时间: 2006-11-16 02:19
re:namejm版主
东西是网上下的。
象我等E文不好的人,很关注此类话题。这东西我在网上搜了时间不短了,可惜没有更全的了。
至于从大型词典软件中提取到纯文本格式的词库来自己加工,有时间的话我会试试,希望可以帮助大家。
作者: hxuan999     时间: 2006-11-23 06:59
收藏
作者: mrxuanfeng     时间: 2007-11-23 15:00
都是高手呀!!!顶!!!!
作者: ygxcxy     时间: 2007-12-20 08:46


  Quote:
Originally posted by pengfei at 2006-10-11 12:05 AM:
这里我有一个思路, 没有经过测试:

搜索代码:
[code]
@echo off
:: 标签的使用是提高数据检索的关键.
:: 一:
:: 条件是字典文件中已经对26个字母开始的 ...

:P
作者: zerocq     时间: 2007-12-20 11:31
curl的简单应用,在线提交给页面查询

不产生临时文件

可以设置多语言翻译

langpair=en_zh是英汉
langpair=zh_en是汉英
以此类推


curl.bat
-----------------------------------------
@echo off
set /p word=请输入要查询的单词:
if "%word%"=="" goto :eof
for /f "tokens=1-10 delims=<>" %%a in ('curl -A "Mozilla/4.0" -d "from_content=%word%&langpair=en_zh" "http://trans.netat.net/index.php"^|find "textarea"') do @echo %%c
pause

[ Last edited by zerocq on 2007-12-20 at 11:48 AM ]
作者: dx069855     时间: 2008-2-7 01:18
值得学习 非常感谢
作者: mediagao     时间: 2010-8-24 11:22
值得学习 非常感谢
作者: mini2324     时间: 2010-8-25 04:07
好复杂啊!