[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
原帖由 Batcher 于 2010-9-15 09:21 发表
可以尝试一下支持自动缩进的编辑器,比如:Notepad++


       平时偶尔也用 notepad++ 啊,但没弄出8L的效果来。 notepad++ 看起来眼花缭乱的,怕不小心出错就不敢用,除非为了查找和替换。
       平常都是直接用系统的记事本,习惯了竖着看代码。虽然缩进很有诗歌的形式美,也希望那样做,可我不习惯,每次看人家缩进的代码,我非得取消缩进才好理解——矣,人贱没办法。

TOP

回复 9楼 的帖子

可以尝试一下支持自动缩进的编辑器,比如:Notepad++
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 netbenton 于 2010-9-15 01:40 发表
批处理的效率虽然是比不上其它的XX,但是,也因为批处理的特点,往往是可以取巧的!!

下面的代码,实现词拆分查表功能,可以在一秒内完成:
注意:dictionary.txt 词库,需以较长的词在前,短在后的顺序排列@ec ...

谢谢netbenton兄的代码,有空慢慢研究,尝试了一下,似乎效果特别快,但不知道是否按既定要求执行,等我写完两篇论文在做答复,谢谢!~
______________________
netbenton兄,你把切分出来的词语做下处理,用空格隔开或者用其它标记标记一下,否则不知道你切分出来的词语在哪里!
代码很深奥,有空再慢慢研究,呵呵

[ 本帖最后由 cjiabing 于 2010-9-15 11:16 编辑 ]

TOP

原帖由 随风 于 2010-9-15 01:17 发表

批处理作这个也许是真的存在效率问题,但也应该不至于这么慢吧,本想研究下你的代码,但看到了上面这一堆,就有种想吐的感觉,起码的分行和缩进都不会吗?你的代码不打算让别人看的吗?不知道你的 dictionary.txt  ...

       随风大哥,我解析一下你引用的代码,这四行用于截取输入的句子中的词语,第一个是截取四字词,如“肆无忌惮”,第二个是三字句,如“天安门”,第三个是二字词,如“北京”,第三个是一字词,如“门”。截取之后进行词语的匹配,就是将截取出来的词语查询词库,如果查询到就表示该成语成立,是一个多字词。在这里使用的是FOR,我知道FOR的效率不高,改用FINDSTR,但没改好。所以效率打折扣了,因时间关系,我希望大家帮忙优化,所以,你看到想吐是可以理解的。
       至于缩进,我知道看起来很美观,可是我很不适应,你如果知道每次我看到缩进的代码我都会取消缩进你就知道我多么讨厌缩进了,因为缩进仅仅是为了美观,有层次,但实际上对于一个懂得代码的人来说那毫无意义。而为了达到缩进而不停的敲击空格键更是浪费时间。我不反对缩进,但我本身是不习惯缩进的,请见谅。
       另外,我自己制作的词典很小,所以查询速度比较快,我下载的是去除拼音字母的标准词库213663词条.TXT,有1.60M,所以用四个FOR解析就有效率问题了。我知道有问题,因技术和时间的问题,现在无法优化,所以请大家帮忙……谢谢!~

[ 本帖最后由 cjiabing 于 2010-9-15 02:32 编辑 ]

TOP

批处理的效率虽然是比不上其它的XX,但是,也因为批处理的特点,往往是可以取巧的!!

下面的代码,实现词拆分查表功能,可以在一秒内完成:
注意:dictionary.txt 词库,需以较长的词在前,短在后的顺序排列
  1. @echo off&setlocal enabledelayedexpansion
  2. :lp
  3. set str=
  4. echo;
  5. echo;直接回车退出测试
  6. set /p str=输入一个字符串:
  7. if "!str!" equ "" goto :eof
  8. setlocal enabledelayedexpansion
  9. set/a z=8180,x=0&for /l %%a in (1,1,14) do (set/a "y=(z-x)/2+x"
  10.     for %%b in (!y!) do if "!str:~%%b,1!" equ "" (set/a z=y) else (set/a x=y)
  11. )
  12. ::计算输入串的长度
  13. ::sap 存入同等长度的空格串
  14. set sap=
  15. (for /l %%i in (0,1,!z!) do (
  16.     set "spa= !spa!"
  17.     set/a x=z-%%i
  18.     for /l %%j in (1,1,!x!) do (
  19.         echo;!str:~%%i,%%j!
  20.         set/a y=%%i+%%j
  21.         for %%a in ("!str:~%%i,%%j!") do (
  22.             set ##%%~a=%%i-!y!-%%j !##%%~a!
  23.         )
  24.     )
  25. ))>fen.tmp
  26. ::进行排列拆分到临时文件fen.tmp,同时取各分词的长度,及在原句中的起址位置,并按一定的规则保存
  27. set var=!str!
  28. for /f "tokens=*" %%a in ('findstr /x /i /g:fen.tmp dictionary.txt') do (
  29.   for %%k in (!##%%a!) do (
  30.     if "!var:%%a=!" neq "!var!" (
  31.       for /f "tokens=1,2,3 delims=-" %%b in ("%%k") do (
  32.         if "!var:~%%b,1!" neq " " (
  33.           echo;截取过程:[!var!]  %%a
  34.           set var=!var:~0,%%b!!spa:~,%%d!!var:~%%c!
  35.           set $$%%b=%%a
  36.         )
  37.       )
  38.     )
  39.   )
  40. )
  41. ::搜索词库,并做已经截取过记号,同时为恢复分词在原句中的位置做准备
  42. echo;
  43. if "!var: =!" neq "" (
  44.   echo;词库中没有的:
  45.   for %%a in (!var!) do (
  46.     for %%k in (!##%%a!) do (
  47.       if "!var:%%a=!" neq "!var!" (
  48.         for /f "tokens=1,2,3 delims=-" %%b in ("%%k") do (
  49.           if "!var:~%%b,1!" neq " " (
  50.             echo;截取过程:[!var!]  %%a
  51.             set var=!var:~0,%%b!!spa:~,%%d!!var:~%%c!
  52.             set $$%%b=%%a
  53.           )
  54.         )
  55.       )
  56.     )
  57.   )
  58. ) else (echo;所有字符均可在词库中到)
  59. ::对在词库中找不到的分词,也进行同样的处理
  60. echo;
  61. set dest=
  62. for /l %%a in (0,1,!z!) do set dest=!dest! !$$%%a!
  63. echo;最终拆分:!dest!
  64. endlocal&goto :lp
复制代码

[ 本帖最后由 netbenton 于 2010-9-15 03:32 编辑 ]

TOP

for /l %%i in (0,1,100) do (
set strdd=!inf:~%%i,4!&if defined strdd set strddo=!strdd:~3,1!&if defined strddo   for /f "tokens=1,*" %%a in (dictionary.txt) do if "%%a"=="!strdd!" echo 4 %%i %%a %%b      %%i,4
set strcc=!inf:~%%i,3!&if defined strcc set strcco=!strdd:~2,1!&if defined strcco   for /f "tokens=1,*" %%e in (dictionary.txt) do if "%%e"=="!strcc!" echo 3 %%i %%e %%f      %%i,3
set strbb=!inf:~%%i,2!&if defined strbb set strbbm=!strbb:~1,1!&if defined strbbm   for /f "tokens=1,*" %%x in (dictionary.txt) do if "%%x"=="!strbb!" echo 2 %%i %%x %%y      %%i,2
set straa=!inf:~%%i,1!&if defined straa for /f "tokens=1,*" %%m in (dictionary.txt) do if "%%m"=="!straa!" echo 1 %%i %%m %%n       %%i,1
)>>S.TXT

批处理作这个也许是真的存在效率问题,但也应该不至于这么慢吧,本想研究下你的代码,但看到了上面这一堆,就有种想吐的感觉,起码的分行和缩进都不会吗?你的代码不打算让别人看的吗?不知道你的 dictionary.txt 文件有多大,这样循环嵌套速度快才是怪事。有兴趣的话最好把意图用文字描述清楚,看看别人是否能写出比你效率高的代码来。。
技术问题请到论坛发帖求助!

TOP

原帖由 Batcher 于 2010-9-14 20:49 发表
可以学习一下sed和gawk,大多时候比BAT高效。
Perl脚本一般来说更加高效,但缺点是需要安装一个环境才能执行,不像sed和gawk直接复制一下exe文件就行。
关键还是看自己对哪个方面更加感兴趣吧。

很好!谢谢!~
当时也想过用SED,但想想还是用纯P。因为SED没用过,需要重头去学。而当时我比较有想法了就先写P了,也是想从另外的角度试试看批处理是否能做这件事情,虽然我相信批处理能做,但结果效率太差了。
————————————————————————————————
感觉我的分词准确率比一些由C、java等的写的分词小程序要高——一次性通过一些公开的测试题目检测。但速度就不敢恭维了,我的一句话就用时一两分钟,人家的1万字才1秒,10000字以内的文章完全切分,用时间不超过1秒!——看来真的要改行才行,否则辜负了聪明!~

TOP

回复 3楼 的帖子

可以学习一下sed和gawk,大多时候比BAT高效。
Perl脚本一般来说更加高效,但缺点是需要安装一个环境才能执行,不像sed和gawk直接复制一下exe文件就行。
关键还是看自己对哪个方面更加感兴趣吧。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

=.= 那句话就是建议……

TOP

原帖由 Batcher 于 2010-9-14 19:05 发表
大文本处理,Perl脚本可能比较高效。

谢谢!~
我想学点其他处理大文本的技术,大大给点建议,如何?

TOP

大文本处理,Perl脚本可能比较高效。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表