回复 20# cjiabing
经过几天的拖拉断续(除了那个交集bat没看懂先放着),终于弄出一个自己性格的分词bat样本...自己的XP测试可用,请指点...
传送点:CS=初始,D=点(用于跳出重复)
变量:A=开始断句位置,Y=语句,C=分出来的词,C1=测试C是否为理想对象而临时出现
For变量:%%a=断句位,%%b=先四字后三字后...,%%c=为了比b小1而临时出现
文件:C%%b=就是上面说的分词库,H=缓存,或者说历史记录
注:rem 是后来加的,并没有测试是否兼容.
刚刚突然想到先准确判断句长再分词,但貌似又没必要,请指点...弄完这个就完成分词,回话,联网三阶段之一啦...
至于后生可畏...其实我只是感兴趣而且此bat系统自带并有较完整(刚刚突然发现help里没有ping!竟然还有隐藏!)的说明所以尝试了一下...- @echo off & setlocal enabledelayedexpansion
- &rem 关闭显示与解决变量延迟问题,也可以用两种相应符号玩变量中的变量
- :CS
- rem 一个回头的传送点
- set A=0
- rem 默认为从句首开始断句
- cls
- rem 清屏
- set /p Y=输入:
- rem 获取句子
- echo 输出:>>H
- rem 提前注入"输出:"到缓存
- if exist H cd.>H
- rem 清空缓存空间
- :D
- rem 一个让截词不重复的传送点
- for /l %%a in (!A!,1,100) do (
- rem 从楼主那看来的截词法
- for /l %%b in (4,-1,1) do (
- rem 先截四字再三字再二.....
- set C=!Y:~%%a,%%b!
- rem 截出一个词并给予调用方法
- if defined C (
- rem 判断是否截到词
- set /a b=%%b-1
- rem 为了获取一个比%%b小1的数
- for %%c in (!b!) do (
- rem 为了让此数字成功融入变量成为变量从的变量
- set C1=!C:~%%c,1!
- rem 为了判断,截出C的末词
- if defined C1 (
- rem 判断接出的词是否理想
- for /f "tokens=1,*" %%d in (C%%b) do (
- rem 获取词库里的词
- if "%%d"=="!C!" (
- rem 判断是否截词成功
- echo %%d
- rem 显示成功截出的词(因为后面放进了"缓存",所以不再显示,但也需要)
- set /a A=%%a+%%b
- rem 设置跳过重复的量
- goto D
- rem 跳过重复
- )))))))>>H
- rem 上面用了几个大句子,这里结清并将结果放入"缓存"
- for /f %%a in (H) do set /p Y=%%a <nul
- rem 显示分词的结果,如果词库内不存在的字就会消失
- echo.
- rem 差不多就算回车一下
- pause
- rem 稍等以便查看结果
- goto CS
- rem 开始新的轮回
复制代码 突然想起还要分库的,马上去弄了个...并加上附件..- @echo off & setlocal enabledelayedexpansion
- rem 虽然不确定变量中的变量是否高效,但个人不是很喜欢基本重复的句子
- for /f "tokens=1,*" %%a in (C) do (
- rem 提取词库每一行
- for /l %%c in (1,1,4) do (
- rem 分别识别单字,双字,三.....
- set /a S=%%c-1
- rem 获取小一数
- for %%d in (!S!) do (
- rem 变量中的变量
- set C=%%a
- rem 获取词语
- set C1=!C:~%%d,1!
- rem 截应该出现的词末
- set C2=!C:~%%c,1!
- rem 截不应该出现的词末末
- if defined C1 (
- rem 判断词语是否够长
- if not defined C2 (
- rem 判断词语是否超长
- echo %%a %%b >>C%%c
- rem 将匹配词语放入相应词库
- )))))
复制代码
|