标题: LookLike 过滤/获取相似内容 [打印本页]
作者: CrLf 时间: 2014-4-28 05:56 标题: LookLike 过滤/获取相似内容
实际上是 jscript.net,用 jsc.exe 编译的,需要 .net 2.0 支持
链接: https://pan.baidu.com/s/128f__u0EPAMNbZ_nSULrWQ?pwd=sqc6
源代码在此,可以直接以 jscript 脚本运行:
链接: https://pan.baidu.com/s/1b25UR16KU9QncuxoFwF-6g?pwd=q7jc
2014/06/20 修正了一个非常规数组赋值导致的排序异常问题,并用条件编译语句改写成既能编译又能作为 js 脚本运行的两栖源代码,作为脚本运行时效率会比 exe 低很多
2014/12/06 修正了两处异常,并添加 /Blank /Only /To 开关
---------------------------------------------------------------------------
在jscript原形的基础上增加了许多开关
原理见搜索引擎技术:标题去重 如何快速判断两个字符串的相似度
帮助信息:- Usage: LookLike.exe
- [/All] [/Uniq] [/Include] [/Length=Number]
- [/Format[=(chs|en|num|RegExp)]] /To=String
- [/Rate=Number] [/Series=Number]
- [/Get] [/Only] [/Blank] [/Verbose]
- [/Key=String] [[drive:][path]filename]
- [/Help] [/Debug]
-
- All 不将输入的内容分行,将用整个文件进行比较
- Uniq 开启后将排除每行内容里重复的分段
- 若分段长度为 4,则 1111211111.... 等价于 11112111
-
- Include 过滤被包含项
- Length=Number
- 将内容划分成指定长度的分段,Number 为大于 0 的正整数,默认为 4
-
- Format[=(def|chs|en|num|RegExp)]
- 在判断前先将文件根据自定义的选项处理一遍,可选子参数含义为:
- def-基础规则 chs-简体中文 en-英文和数字 num-仅数字
- RegExp-捕获或替换一个正则表达式对应的内容
- 格式为 /pattern/mode,如指定了 /To 开关,则为替换
-
- Rate[=Number]
- 自定义筛选阀值必须大于 0 小等于 1,若不设置 Number 则动态计算
-
- Series[=Number]
- 过滤连续匹配次数超过阀值的内容,若不设置 Number 则动态计算
-
- Get 将排除改为获取
- Only 对相似行保留一行
- Blank 不处理预处理后的为空的行
- Verbose 显示详细信息,格式为:来源|行号|长度|原始字符串
- Key=String 根据给定的字符串进行筛选,支持以 %var% 的格式解析变量
- [drive:][path]filename
- 指定输入文件,如未指定则从管道或重定向输入获取内容
-
- Help 显示帮助信息
- Debug 用错误输出句柄显示调试信息
-
- 注: 一、如未用 Rate 和 Series 指定阀值,默认将动态计算,行越短则越严格:
- Rate = Math.sin(2/(Math.sqrt(length+5)))
- Series = 1/Math.sqrt(length+1)
- 二、在开关中,
- 1、前缀可用 / 或 -,如 /Help 等价于 -Help
- 2、开关名不分大小写且可简写为首字母,如 /Get 等价于 /get 和 /G
- 3、= 与 : 等价,如 /Length=4 等价于 /Length:4
- 4、开关如重复出现,只以最后一个为准
复制代码
示例代码:- dir | LookLike
- ::从 dir 输出中获取不相似的行
-
- LookLike /get /include <输入.txt
- ::从 输入.txt 中获取相似的行和完全被其他行包含的行
-
- LookLike /get /verbose 输入1.txt 输入2.txt
- ::从 输入1.txt 和 输入2.txt 获取相似的行,并打印详细信息
-
- set "变量=一下"
- LookLike /format:chs /key=测试%%变量%% 输入.txt
- ::为简体中文进行预格式化,将中文标点、英文字符、数字等内容预先处理为空格
- ::然后以 "测试一下" 为关键词在 输入.txt 中搜索相似的行
-
- set "字符串=bbs.bathome.net"
- for %%a in (*.txt) do LookLike /k:%字符串% /f /g /u /i /s "%%a" >nul||echo 在 "%%a" 中找到和 %字符串% 的内容
- ::以 bbs.bathome.ne 为关键词,判断在 *.txt 中是否有相似的行
-
- ::自行发挥。。。。。。
复制代码
作者: PowerShell 时间: 2014-6-20 11:58
1 感谢分享
2 你这个帖子有个重大bug,没有名词解释,何谓相似,何谓不相似。“abbbc” 和“abbc”相似么?论坛论坛,你得先说出论点,然后才说如何编程实现。你木有主题,谁知道相似是干嘛使得呢?这是你的缺点,我既然指出了,你就不要不承认。
3 作为脚本运行时效率会比 exe 低很多---对你这句我挺感兴趣,不知道证据在哪?你愿意详谈么?。net我略有了解。凡是用。net的,最终要调用。net类,用方法,属性。
4 潜在的,我还有个疑惑,我心底认为你,【1 你认为。net太占内存。2你认为。net性能不如awk,sed】而今你竟然开始编写。net程序,古怪,古怪。
作者: CrLf 时间: 2014-6-20 16:28
本帖最后由 CrLf 于 2014-6-20 17:25 编辑
回复 2# PowerShell
1、感谢关注~
---------------------------------------------------------------------------------------------------------
2、
事实上,顶楼 4、5 两行的链接分别指向了本贴中“相似”的标准与算法实现,而且源代码中每块功能都有注释,应该把判定相似的依据都说清楚了
延伸一下,相似是什么?
monday 和 星期一 是否相似?碳60 与 60个碳原子是否相似?人与老鼠DNA相似度达90%,这又是否相似?a 与 aaaaaa 是否相似?窃以为相似是个逼近相同的概念,很多时候像不像得看角度,横看成岭侧成峰,只有更相似,没有最相似
感觉楼上比较喜欢一棒子打死(此处无意攻击,如有冒犯,请见谅),但世界不是非黑即白,脚本好与不好也是没有分数线的,全看用在哪与怎么用
扯远了,链接中楼主所要求的相似其实是“逼近相同,容忍范围尽量大”。让我想起齐白石对美的概述是“妙在似与不似之间”,按集合论的说法补集相加原本应为全集,那“似与不似之间”是什么呢?他的要求和“在似与不似之间”一样是理性上有矛盾但感性上可以理解的条件,既然非理性,那就没有一个准确的答案,只能找到一个“似与不似”的平衡点,就像老人摔倒要不要扶...个中微妙,难以言说,某些平衡点上 a 与 aaaaaa 相似,在其他平衡点上也许就不相似,但一定是谁错了吗?内事不决问百度、外事不决问谷歌,baidu 和 google 搜索引擎孰优孰劣能有定论吗?他们有向我们解释相似的标准吗?相似原本就是个范围,如果感觉不好,换一个就行了...
---------------------------------------------------------------------------------------------------------
3、
测试所得,亦与经验相合,故有此一说
---------------------------------------------------------------------------------------------------------
4、
这个程序是先有 jscript 版,再有 jscript8.0 版,之所以用 .net 编译是因为下载了 jscript8.0.chm,其中有提到 js 可以用 .net2.0 编译,尝尝鲜,况且现在把源代码小改成二用的了,不需要 .net 也可运行,如果再改一下,可能还可以跨平台。如果不是嫌 .net 目前还不如 jscript 通用,何必费这个事呢?
但个人还是比较喜欢当前依赖度低一些的语言,毕竟通用性摆在那里,即使不为别人考虑,我自己常用的工作环境也不是很统一,所以无论是选择软件还是语言,有得选的话都比较偏向更通用的那种
本人从未说过 .net 性能与 gawk、sed 等相较如何,不是同类没有可比性,但同水平下,依赖 .net 的 powershell 运行效率和资源占用确实比 c语言写出来 gnu 工具差一些,所以 powershell(以下简称 ps)虽确实有过人之处,但处理文本时我还是首选 sed/gawk/perl,需要面对对象或其他特殊情况时再到 jscript/vbscript/ps 中选择。ps 我也用,但事实上作为普通用户,并不需要经常修改系统设置,所以移动复制改名文件、文件夹常会用 ps,偶尔查询系统信息可以用 ps,其他时候真心用不上,并非它做不到,而是因为我知道有其他工具更合适罢了。个人最经常用的是工作中需要的自动化操作和最普遍的文本处理,前者首选 ahk,后者还是优先选择 batch/shell 系列,至于手机上,那就是 shell/lua 鸟。所以不是说 ps 不好,只是确实不太用得着...客观来说,我所掌握的脚本,每个都不怎么“用得着”,只是按自己的理解把好钢用在刀刃上,工具生来为人服务,人不必向工具效忠
作者: DAIC 时间: 2014-6-20 17:32
回复 3# CrLf
搞技术的,你要说自己用百度,都不好意思跟别人打招呼,google必须的
作者: CrLf 时间: 2014-6-20 17:38
回复 4# DAIC
那是外事不决问谷歌~话说还有一句房事不决问天涯,这tm是什么引擎...
作者: PowerShell 时间: 2014-6-20 18:27
建议坛主鉴定此为废帖,转入垃圾站,理由如下:
1 没说何谓相似。
1.1 示例代码中,没有程序输出的结果,无法从示例中看出哪些被筛选成相似,哪些不相似。
1.2 在我明确告知的情况下,还不改正。让我看源码,看其他帖子,这是在说不过去。---例如:我新买台【手机】,不知咋用,看看说明书,说明书上写着【请参见xx相机】或者【请把手机拆散研究下零件就懂了】
1.3 他根本不知道怎样发帖,还说出一大套。玄之又玄的东西。---monday 和 星期一 是否相似?碳60 与 60个碳原子是否相似?----浪费论坛资源,浪费大家时间不说,让我感觉疯了!
2 这是一个程序,而不是一个例子,一个介绍,程序必然有性能。但 【作为脚本运行时效率会比 exe 低很多】
根本拿不出,证据支持。
最终,我说,一个帖子是一个完整的东西,就好像一个人一个头一样。纵然,两个人头中的内容有重复,浪费了些许空间,那也是难免的。不可能【我没有头,想看我长啥样,还要从别人头上看到。】
你写贴要么没【头】,要么【尾巴】想强制接到别的帖子上去,我觉得这或多或少扰乱了论坛。
唉~,熊孩子,你就不能好好写贴跟帖么?
作者: CrLf 时间: 2014-6-20 18:47
回复 6# PowerShell
你的逻辑,我实在搞不懂,不想解释什么,如果兄台在网内网外都是这副德性,想必过得不咋地吧?
作者: 回家路上 时间: 2015-8-15 13:07
请问,js中的- @if (@_jscript_version<6)
- var i
- @else
- var i:int
- @end
复制代码
这些@符号是干什么的呀。
作者: CrLf 时间: 2015-8-15 14:50
回复 8# 回家路上
条件编译语句
作者: 回家路上 时间: 2015-8-17 10:03
回复 9# CrLf
请问,想学这个JScript的话你有没有好的文档啊。我看你的JScript学的特好。O(∩_∩)O!
作者: CrLf 时间: 2015-8-17 14:59
回复 10# 回家路上
w3school 有入门教程,基础语法是一样的
入门后,查查脚本技术手册就熟了
作者: 回家路上 时间: 2015-8-24 12:50
回复 11# CrLf
我这有一个问题,可以的话抽空解决一下,谢谢。O(∩_∩)O!
http://www.bathome.net/viewthread.php?tid=37044&extra=
作者: 回家路上 时间: 2015-8-26 11:30
本帖最后由 回家路上 于 2015-8-26 12:29 编辑
回复 11# CrLf
昨天学到了正则表达式。然后回头又去理解了你的mshta宿主方式混编的解析参数的正则(O(∩_∩)O~以前根本看不懂)- var argv = getopts(mshta.commandLine)
- for(var i=0;i<argv.length;i++)alert(argv[i])
-
- function getopts(strArg){
- var re = /([^"\s,;=]*"[^"]*(?:"[^"\s,;=]*")*[^"]*(?:"[^"\s,;=]*|$))|[^"\s,;=]+/g
- var argv = []
- strArg.replace(re,function($0,$1){argv.push($1?$1.replace(/^"(.*)"$/,'$1'):$0)})
- return argv
- }
复制代码
然后我也试写了一个正则表达式- (".+?"(?=[\s,;=]|$))|[^\s,;=]+
复制代码
用你的那个方法测了测。好使哈。分享一下。- <!-- :
- @echo off
- mshta "%~0" 11111 111111,1111111; 1111"1"1"11=1111"11"111 "1111111111" "11"1"1"1111"" "1111,1111"
- pause
- -->
-
- <HTA:APPLICATION id=mshta></HTA>
-
- <script>
- var argv = getopts(mshta.commandLine);
- alert(argv.join("\r\n"));
- close();
-
- function getopts(strArg){
- var re = /(".+?"(?=[\s,;=]|$))|[^\s,;=]+/g;
- var argv = [];
- strArg.replace(re,function($0,$1){argv.push($1?$1.replace(/^"(.*)"$/,'$1'):$0)});
- return argv;
- }
- </script>
复制代码
作者: CrLf 时间: 2015-8-26 13:50
本帖最后由 CrLf 于 2015-8-26 16:30 编辑
回复 13# 回家路上
你好像没考虑到 getopts('断" "断"续"续') 的情况...不过突然发现我的正则也有点不对
(例子有误,已修改)
作者: 回家路上 时间: 2015-8-26 14:31
回复 14# CrLf
getopts('"断" 断"续"续') 这样的是应该返回【断】【断】【续】【续】四个字符串吗?
我以为这种的是要返回【断】【断"续"续】这两个字符串呢。(⊙﹏⊙)b
作者: CrLf 时间: 2015-8-26 14:41
本帖最后由 CrLf 于 2015-8-26 20:49 编辑
回复 15# 回家路上
那应该只回一个参数才对
再改一下,还是可以用正则搞定的:- getopts('1" "2" "3" "4" "5" "6 a" "b" "c" "d')
-
- function getopts(strArg){
- var re = /[^"\s,;=]*"([^"]*("[^"\s,;=]*")*)*("[^"\s,;=]*|$)|[^"\s,;=]+/g
- var argv = []
- strArg.replace(re,function($0){argv.push($0.replace(/^"(.*)"$/g,'$1'))})
- return argv
- }
复制代码
作者: CrLf 时间: 2015-8-26 16:30
回复 15# 回家路上
哦,例子切错地方了,原来那样确实是两截,已修改。我是想说明分割参数得兼容双引号内含有空格的情况
作者: 回家路上 时间: 2015-8-26 16:32
回复 17# CrLf
哦,允许用双引号将分割符转义的意思。好的。我也想想。
作者: CrLf 时间: 2015-8-26 18:38
回复 18# 回家路上
又想了一下,发现之前想错了,其实也很简单,已修改
作者: 回家路上 时间: 2015-8-26 20:46
回复 19# CrLf
赞一个,我想了好久都没想出来。
其实那个while不用覆盖的,思路也好呀。都搁这儿多好。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |