精华内容
下载资源
问答
  • 如何eclipse软件里面查找自己写的文档存放路径或位置,自己操作过程中遇到的问题,此与大家分享,希望可以帮助他人。
  • 查找与替换,通过这个工具可以找到jar里面的东西,及文档里面的写入的内容.rar,64位使用
  • Linux如何搜索查找文件里面内容
  • 最近想做一个java相关的项目,系统下有许多world文档或者其他文档,然后实现一个程序,可以输入某个关键字可以查询包含该关键词的文档。希望是秒级别的。现在懂java相关的知识,大神可以提供一下解决该问题思路,...
  • 1、MongoDB集合里面文档,相当于关系型数据库表里面的记录 2、MongoDB集合里面文档的插入 db.c2.insert( { id:"1",name:"zhejiang" } ); 3、利用JavaScript脚本,批量插入文档 for( var i=1; i; i++){ db.c3....

    1、MongoDB集合里面文档,相当于关系型数据库表里面的记录

    2、MongoDB集合里面文档的插入

    db.c2.insert( { id:"1",name:"zhejiang"   }  );


    3、利用JavaScript脚本,批量插入文档

    for( var i=1; i<=1000; i++){
       db.c3.insert( { id:i,name:i }  );
    }


    4、统计一个集合里面的文档数量 (类属于统计关系型数据库,表的记录数)

     db.c3.find().count();

    5、跟新文档里面的键值内容(相当于跟新关系型数据库的字段的内容)

          1、mongodb的基本语法                                                                                        2、关系型数据库的语法                                     

           db.collection.update( condition , objNew,upsert,multi)                 update  tableName  set  xxx = objNew   where   condition ;
           参数说明:

          1、condition,用于设置更新的条件
          2、objNew用于设置更新的内容
          3、默认,只更新符合条件的第一条记录

          4、upsert:如果记录已经存在,更新它,否则新增一个记录,取值为0或1 (取数值1,表示更新一个记录)

          5、multi:如果有多个符合条件的记录,是否全部更新,取值为0或1(取数值1更新全部,取数值0更新第一条)

          6、更新语句的一般用法

    db.collection.update(criteria,objNew,0,1); #表示没有这个记录不插入,更新的时候,更新全部文档内容
       

         2、更新集合中的文档,将集合中name为user1的文档改成name为jack------->注意不加$set的更新数据,其他的键值会丢失
           

    db.c3.find(); 
    db.c3.update( { name:"user1" },{ name:"jack" },0,1 );
    db.c3.find();
       

        3、利用$set来更新文档的键值,不会导致其他的键值丢失------>利用$set更新键值,不会导致其他的键值丢失

       

    db.c3.find(); 
    db.c3.update( { name:"user1" },{ $set:{ name:"jack" }},0,1 );
    db.c3.find();



         4、更新一个集合里面文档的键值时,一定要用$set   ( 存在这个键值就更新,不存在就加入到符合条件的文档里面  )  ----->  相当于给表增加新的字段

              解释:更新集合中的文档, $set 用来指定一个键的值,如果这个键不存在,则创建它,如果这个键存在,则更新它的值
           4.1 给name为user1的文档添加address,
                  命令为:

     db.c1.update({name:”user1”},{$set:{address:”bj”}},0,1)


          4.2 将name为user1的文档修改address为tj, 其它键值对不变,
                 命令为:
    db.c1.update({name:”user1”},{$set:{address:”tj”}},0,1)


       5、更新集合中的文档, $unset 用来删除某个键  ------>相当于删除表里面的某个字段

          5.1 例如删除name为user1的文档中的address键,可以使用命令:
                              

    db.c1.update({name:”user1”},{$unset:{address:1}},0,1)
    


    5、更新集合中的文档,$inc表示使某个键值加减指定的数值

           5.1 使用 $inc 将集合中name为user1的age加1,其它键不变
                             

     db.c1.update( {name:"user1"},{$inc:{age:1}} )

          

         5.2 使用 $inc 将集合中name为user1的age减8,其它键不变               

     db.c1.update({name:"user1"},{$inc:{age:-8}})

    展开全文
  • 那我们能不能实现用Java语言在线打开word文档的同时,将指定内容通过程序查找替换成我们想要的内容呢?这是可以的。 但是这需要开发者具备将activex控件集成到Java环境的能力。对于大部分Java开发工程师来说,仅仅...

    前言:

    我们都知道word中有一个查找替换功能,也就是将文档中相同的字符都替换成其他字符。那我们能不能实现用Java语言在线打开word文档的同时,将指定内容通过程序查找替换成我们想要的内容呢?这是可以的。

    但是这需要开发者具备将activex控件集成到Java环境的能力。对于大部分Java开发工程师来说,仅仅解决单一的功能就要掌握activex控件,未免学习成本太大。

    所以我们今天就要介绍一个中间件技术——pageoffice,此中间件技术已经将 在web系统操作office文档的大部分功能整合完毕,大家只需要关注自己web系统的业务逻辑即可,学习成本低,且功能很丰富。下面我们来实战用pageoffice实现一下用Java语言在线打开word文档的同时,将指定内容通过程序查找替换成我们想要的内容。

    先看效果:

    这里的部门、李四、日期信息均为后台代码通过查找替换功能实现的。

     部署步骤(只需4步)

    1.官网http://www.zhuozhengsoft.com/dowm/下载集成文件,引入jar包,配置web.xml

    去刚才下载的集成文件中找到lib,将里面的内容放在项目web-inf的lib中引入jar包,然后将web.xml的pageoffice配置引入到自己项目的wb.xml中

    2.在父页面aaa.jsp(需要打开文档的页面)放一个a标签或者button

    写a标签之前先引入pageoffice需要的js文件

    <script type="text/javascript" src="/jquery.min.js"></script>
    <script type="text/javascript" src="/pageoffice.js" id="po_js_main"></script>

    然后添加a标签 

    <a href="javascript:POBrowser.openWindowModeless('DataTag.jsp' , 'width=1200px;height=800px;');">使用数据标签(DataTag)给Word文件填充带格式的数据</a>

    3.在父页面同级目录下创建一个名为DataTag.jsp的文件

    <%@ page language="java" import="java.util.*"
    	import="java.util.* ,java.awt.* ,com.zhuozhengsoft.pageoffice.*,com.zhuozhengsoft.pageoffice.wordwriter.*,java.text.SimpleDateFormat,java.util.Date"
    	pageEncoding="utf-8"%>
    <%
    	//PageOffice组件的使用
    	//设置服务器页面
    	PageOfficeCtrl pCtrl = new PageOfficeCtrl(request);
    	pCtrl.setServerPage(request.getContextPath()+"/poserver.zz");
    	//定义WordDocument对象
    	WordDocument doc = new WordDocument();
    	
    	//定义DataTag对象
    	DataTag deptTag = doc.openDataTag("{部门名}");
    	//给DataTag对象赋值
    	deptTag.setValue("B部门");
    	deptTag.getFont().setColor(Color.GREEN);
    	
    	DataTag userTag = doc.openDataTag("{姓名}");
    	userTag.setValue("李四");
    	userTag.getFont().setColor(Color.GREEN);
    	
    	DataTag dateTag = doc.openDataTag("【时间】");
    	dateTag.setValue(new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString());
    	dateTag.getFont().setColor(Color.BLUE);
    	
    	pCtrl.setWriter(doc);
    	//打开Word文件
    	pCtrl.webOpen("test.doc", OpenModeType.docNormalEdit, "张佚名");
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
    
        <title>My JSP 'DataTag.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    
      </head>
      
      <body>
               <%=pCtrl.getHtmlCode("PageOfficeCtrl1")%>
      </body>
    </html>
    

    4.新建文件

    新建一个名为test.doc的word文件(如果新建的是docx文件就将第三步的pCtrl.webOpen("test.doc", OpenModeType.docNormalEdit, "张佚名");代码改为pCtrl.webOpen("test.docx", OpenModeType.docNormalEdit, "张佚名");

    将新建的test.doc文件随意编辑点内容放在DataTag.jsp同级目录下。同时向文档中添加步骤三中的特殊字符

       {部门名}      {姓名}    【时间】 

    然后启动项目直接访问aaa.jsp点击链接.此时会提示安装插件,点击安装成功后提示注册,填写相关信息,填写注册码Q37LN-W8NI-KFSQ-LEY3Y就可以打开文档.

    注意:如果需要更丰富的功能,大家可以去pageoffice官网下载示例代码直接将samples4文件夹扔到Tomcat的webapps下,启动Tomcat,浏览器访问http://localhost:8080/Samples4/index.html,查看示例中的下面一个链接,直接看samples4文件夹下WordDataTag文件夹里面的代码.

    刚开始接触pageoffice的话,也可以看视频快速上手http://www.zhuozhengsoft.com/Technical/

    如有侵权,请联系博主

    展开全文
  • 可以通过这个工具,对文件,文件夹,或者文档里面内容机型查找
  • 相似文档查找算法之 simHash

    千次阅读 2017-04-27 17:02:31
    摘要: 海量文章排重的具体实践方法,主要是介绍工程当中如何使用。 基于simhash的海量文章排重的实践 简单介绍 simhash是一种能计算文档相似度的hash算法。通过simhash能将一篇文章映射成64bit,再比较两篇...

    转自:介绍一个基于simhash作海量文章排重的库:simhashpy


    摘要: 海量文章排重的具体实践方法,主要是介绍在工程当中如何使用。

    基于simhash的海量文章排重的实践

    简单介绍

    simhash是一种能计算文档相似度的hash算法。通过simhash能将一篇文章映射成64bit,再比较两篇文章的64bit的海明距离,就能知道文章的相似程序。若两篇文章的海明距离<=3,可认为这两篇文章很相近,可认为它们是重复的文章。

    这篇博客有详细的介绍

    simhash-py

    要更准确的对文章进行排重,需要找到好的simhash算法。目前我知道的有python-hashes,simhash-py。两个库通过简单的修改,再加上中文分词库,可以比较好的对中文文章计算hash。simhash-py可使用我fork的版本以支持中文文章的simhash (通过里面的hash_token或hash_tokenpy两个函数实现对切词之后的中文文章进行simhash计算)。

    simhash算法

    simhash算法最简单实现的库应该是python-hashes库了。使用过程当中发现,对于排重的使用目的来说,这个库的simhash算法有缺点是:只考虑到文章存在哪些词,没有考虑到词的顺序。不过相应的优点是,可以实现海量文章相似度计算。文章相似度计算忽略词的顺序之后效果更好。

    simhash-py内部实现了simhash算法。它里面的simhash使用了cyclic hash算法,这个算法考虑到N(可以在3~5)个词之间的顺序。考虑到词的顺序的hash算法在排重过程当中会更准确,不过这个我也没有特别好的测试:)

    simhash加快搜索

    若看过本文推荐的simhash的原理讲解那篇文章,发现可以通过“shard”方式加快simhash值的搜索,从而能快速的知道是否存在重复的文章。而simhash-py库通过C++的Judy库实现了这一点。

    simhash集群处理

    既然可以通过“shard”方式,那么很容易把这个思路拓展到集群上。所以相应的,simhashpy的作者实现了simhash-cluster。

    过程当中有疑问可加我开源项目交流QQ群:27498_3126 欢迎对数据处理有兴趣的同学多多交流。


    转自:相似文档查找算法之 simHash 简介及其 java 实现

    传统的 hash 算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。产生的两个签名,如果相等,说明原始内容在一定概 率 下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别极大。从这个意义 上来 说,要设计一个 hash 算法,对相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始内容是否相等的信息外,还能额外提供不相等的 原始内容的差异程度的信息。
    而 Google 的 simhash 算法产生的签名,可以满足上述要求。出人意料,这个算法并不深奥,其思想是非常清澈美妙的。

    1、Simhash 算法简介

    simhash算法的输入是一个向量,输出是一个 f 位的签名值。为了陈述方便,假设输入的是一个文档的特征集合,每个特征有一定的权重。比如特征可以是文档中的词,其权重可以是这个词出现的次数。 simhash 算法如下:  
    1,将一个 f 维的向量 V 初始化为 0 ; f 位的二进制数 S 初始化为 0 ;  
    2,对每一个特征:用传统的 hash 算法对该特征产生一个 f 位的签名 b 。对 i=1 到 f :  
    如果b 的第 i 位为 1 ,则 V 的第 i 个元素加上该特征的权重;  
    否则,V 的第 i 个元素减去该特征的权重。   
    3,如果 V 的第 i 个元素大于 0 ,则 S 的第 i 位为 1 ,否则为 0 ;  
    4,输出 S 作为签名。

    2、算法几何意义和原理

    这个算法的几何意义非常明了。它首先将每一个特征映射为f维空间的一个向量,这个映射规则具体是怎样并不重要,只要对很多不同的特征来说,它们对所对应的向量是均匀随机分布的,并且对相同的特征来说对应的向量是唯一的就行。比如一个特征的4位hash签名的二进制表示为1010,那么这个特征对应的 4维向量就是(1, -1, 1, -1)T,即hash签名的某一位为1,映射到的向量的对应位就为1,否则为-1。然后,将一个文档中所包含的各个特征对应的向量加权求和,加权的系数等于该特征的权重。得到的和向量即表征了这个文档,我们可以用向量之间的夹角来衡量对应文档之间的相似度。最后,为了得到一个f位的签名,需要进一步将其压缩,如果和向量的某一维大于0,则最终签名的对应位为1,否则为0。这样的压缩相当于只留下了和向量所在的象限这个信息,而64位的签名可以表示多达264个象限,因此只保存所在象限的信息也足够表征一个文档了。  


    明确了算法了几何意义,使这个算法直观上看来是合理的。但是,为何最终得到的签名相近的程度,可以衡量原始文档的相似程度呢?这需要一个清晰的思路和证明。在simhash的发明人Charikar的论文中[2]并没有给出具体的simhash算法和证明,以下列出我自己得出的证明思路。

    Simhash是由随机超平面hash算法演变而来的,随机超平面hash算法非常简单,对于一个n维向量v,要得到一个f位的签名(f<<n),算法如下:  
    1,随机产生f个n维的向量r1,…rf;  
    2,对每一个向量ri,如果v与ri的点积大于0,则最终签名的第i位为1,否则为0.  


    这个算法相当于随机产生了f个n维超平面,每个超平面将向量v所在的空间一分为二,v在这个超平面上方则得到一个1,否则得到一个0,然后将得到的 f个0或1组合起来成为一个f维的签名。如果两个向量u, v的夹角为θ,则一个随机超平面将它们分开的概率为θ/π,因此u, v的签名的对应位不同的概率等于θ/π。所以,我们可以用两个向量的签名的不同的对应位的数量,即汉明距离,来衡量这两个向量的差异程度。

    Simhash算法与随机超平面hash是怎么联系起来的呢?在simhash算法中,并没有直接产生用于分割空间的随机向量,而是间接产生的:第 k个特征的hash签名的第i位拿出来,如果为0,则改为-1,如果为1则不变,作为第i个随机向量的第k维。由于hash签名是f位的,因此这样能产生 f个随机向量,对应f个随机超平面。下面举个例子:  
    假设用5个特征w1,…,w5来表示所有文档,现要得到任意文档的一个3维签名。假设这5个特征对应的3维向量分别为:  
    h(w1) = (1, -1, 1)T  
    h(w2) = (-1, 1, 1)T  
    h(w3) = (1, -1, -1)T  
    h(w4) = (-1, -1, 1)T  
    h(w5) = (1, 1, -1)T  


    按simhash算法,要得到一个文档向量d=(w1=1, w2=2, w3=0, w4=3, w5=0) T的签名,

    先要计算向量m = 1*h(w1) + 2*h(w2) + 0*h(w3) + 3*h(w4) + 0*h(w5) = (-4, -2, 6) T,  
    然后根据simhash算法的步骤3,得到最终的签名s=001。  


    上面的计算步骤其实相当于,先得到3个5维的向量,第1个向量由h(w1),…,h(w5)的第1维组成:

    r1=(1,-1,1,-1,1) T;  
    第2个5维向量由h(w1),…,h(w5)的第2维组成:  
    r2=(-1,1,-1,-1,1) T;  
    同理,第3个5维向量为:  
    r3=(1,1,-1,1,-1) T.  
    按随机超平面算法的步骤2,分别求向量d与r1,r2,r3的点积:  
    d T r1=-4 < 0,所以s1=0;  
    d T r2=-2 < 0,所以s2=0;  
    d T r3=6 > 0,所以s3=1.  
    故最终的签名s=001,与simhash算法产生的结果是一致的。  


    从上面的计算过程可以看出,simhash算法其实与随机超平面hash算法是相同的,simhash算法得到的两个签名的汉明距离,可以用来衡量原始向量的夹角。这其实是一种降维技术,将高维的向量用较低维度的签名来表征。衡量两个内容相似度,需要计算汉明距离,这对给定签名查找相似内容的应用来说带来了一些计算上的困难;我想,是否存在更为理想的simhash算法,原始内容的差异度,可以直接由签名值的代数差来表示呢?

    3、比较相似度

    海明距离: 两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。一个有效编码集中, 任意两个码字的海明距离的最小值称为该编码集的海明距离。举例如下: 10101 和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为 3.  


    异或: 只有在两个比较的位不同时其结果是1 ,否则结果为 0 

    对每篇文档根据SimHash 算出签名后,再计算两个签名的海明距离(两个二进制异或后 1 的个数)即可。根据经验值,对 64 位的 SimHash ,海明距离在 3 以内的可以认为相似度比较高。  
    假设对64 位的 SimHash ,我们要找海明距离在 3 以内的所有签名。我们可以把 64 位的二进制签名均分成 4块,每块 16 位。根据鸽巢原理(也成抽屉原理,见组合数学),如果两个签名的海明距离在 3 以内,它们必有一块完全相同。  
    我们把上面分成的4 块中的每一个块分别作为前 16 位来进行查找。 建立倒排索引。



    如果库中有2^34 个(大概 10 亿)签名,那么匹配上每个块的结果最多有 2^(34-16)=262144 个候选结果 (假设数据是均匀分布, 16 位的数据,产生的像限为 2^16 个,则平均每个像限分布的文档数则 2^34/2^16 = 2^(34-16)) ,四个块返回的总结果数为 4* 262144 (大概 100 万)。原本需要比较 10 亿次,经过索引,大概就只需要处理 100 万次了。由此可见,确实大大减少了计算量。 

    4、示例代码:

    /**
     * Function: simHash 判断文本相似度,该示例程支持中文<br/>
     * date: 2013-8-6 上午1:11:48 <br/>
     * @author june
     * @version 0.1
     */
    import java.io.IOException;
    import java.io.StringReader;
    import java.math.BigInteger;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    import org.wltea.analyzer.IKSegmentation;
    import org.wltea.analyzer.Lexeme;
    
    public class SimHash {
    
    	private String tokens;
    
    	private BigInteger intSimHash;
    
    	private String strSimHash;
    
    	private int hashbits = 64;
    
    	public SimHash(String tokens) throws IOException {
    		this.tokens = tokens;
    		this.intSimHash = this.simHash();
    	}
    
    	public SimHash(String tokens, int hashbits) throws IOException {
    		this.tokens = tokens;
    		this.hashbits = hashbits;
    		this.intSimHash = this.simHash();
    	}
    
    	HashMap<String, Integer> wordMap = new HashMap<String, Integer>();
    
    	public BigInteger simHash() throws IOException {
    		// 定义特征向量/数组
    		int[] v = new int[this.hashbits];
    		// 英文分词
    		// StringTokenizer stringTokens = new StringTokenizer(this.tokens);
    		// while (stringTokens.hasMoreTokens()) {
    		// String temp = stringTokens.nextToken();
    		// }
    		// 1、中文分词,分词器采用 IKAnalyzer3.2.8 ,仅供演示使用,新版 API 已变化。
    		StringReader reader = new StringReader(this.tokens);
    		// 当为true时,分词器进行最大词长切分
    		IKSegmentation ik = new IKSegmentation(reader, true);
    		Lexeme lexeme = null;
    		String word = null;
    		String temp = null;
    		while ((lexeme = ik.next()) != null) {
    			word = lexeme.getLexemeText();
    			// 注意停用词会被干掉
    			// System.out.println(word);
    			// 2、将每一个分词hash为一组固定长度的数列.比如 64bit 的一个整数.
    			BigInteger t = this.hash(word);
    			for (int i = 0; i < this.hashbits; i++) {
    				BigInteger bitmask = new BigInteger("1").shiftLeft(i);
    				// 3、建立一个长度为64的整数数组(假设要生成64位的数字指纹,也可以是其它数字),
    				// 对每一个分词hash后的数列进行判断,如果是1000...1,那么数组的第一位和末尾一位加1,
    				// 中间的62位减一,也就是说,逢1加1,逢0减1.一直到把所有的分词hash数列全部判断完毕.
    				if (t.and(bitmask).signum() != 0) {
    					// 这里是计算整个文档的所有特征的向量和
    					// 这里实际使用中需要 +- 权重,比如词频,而不是简单的 +1/-1,
    					v[i] += 1;
    				} else {
    					v[i] -= 1;
    				}
    			}
    		}
    
    		BigInteger fingerprint = new BigInteger("0");
    		StringBuffer simHashBuffer = new StringBuffer();
    		for (int i = 0; i < this.hashbits; i++) {
    			// 4、最后对数组进行判断,大于0的记为1,小于等于0的记为0,得到一个 64bit 的数字指纹/签名.
    			if (v[i] >= 0) {
    				fingerprint = fingerprint.add(new BigInteger("1").shiftLeft(i));
    				simHashBuffer.append("1");
    			} else {
    				simHashBuffer.append("0");
    			}
    		}
    		this.strSimHash = simHashBuffer.toString();
    		System.out.println(this.strSimHash + " length " + this.strSimHash.length());
    		return fingerprint;
    	}
    
    	private BigInteger hash(String source) {
    		if (source == null || source.length() == 0) {
    			return new BigInteger("0");
    		} else {
    			char[] sourceArray = source.toCharArray();
    			BigInteger x = BigInteger.valueOf(((long) sourceArray[0]) << 7);
    			BigInteger m = new BigInteger("1000003");
    			BigInteger mask = new BigInteger("2").pow(this.hashbits).subtract(new BigInteger("1"));
    			for (char item : sourceArray) {
    				BigInteger temp = BigInteger.valueOf((long) item);
    				x = x.multiply(m).xor(temp).and(mask);
    			}
    			x = x.xor(new BigInteger(String.valueOf(source.length())));
    			if (x.equals(new BigInteger("-1"))) {
    				x = new BigInteger("-2");
    			}
    			return x;
    		}
    	}
    
    	public int hammingDistance(SimHash other) {
    
    		BigInteger x = this.intSimHash.xor(other.intSimHash);
    		int tot = 0;
    
    		// 统计x中二进制位数为1的个数
    		// 我们想想,一个二进制数减去1,那么,从最后那个1(包括那个1)后面的数字全都反了,
    		// 对吧,然后,n&(n-1)就相当于把后面的数字清0,
    		// 我们看n能做多少次这样的操作就OK了。
    
    		while (x.signum() != 0) {
    			tot += 1;
    			x = x.and(x.subtract(new BigInteger("1")));
    		}
    		return tot;
    	}
    
    	public int getDistance(String str1, String str2) {
    		int distance;
    		if (str1.length() != str2.length()) {
    			distance = -1;
    		} else {
    			distance = 0;
    			for (int i = 0; i < str1.length(); i++) {
    				if (str1.charAt(i) != str2.charAt(i)) {
    					distance++;
    				}
    			}
    		}
    		return distance;
    	}
    
    	public List subByDistance(SimHash simHash, int distance) {
    		// 分成几组来检查
    		int numEach = this.hashbits / (distance + 1);
    		List characters = new ArrayList();
    
    		StringBuffer buffer = new StringBuffer();
    
    		int k = 0;
    		for (int i = 0; i < this.intSimHash.bitLength(); i++) {
    			// 当且仅当设置了指定的位时,返回 true
    			boolean sr = simHash.intSimHash.testBit(i);
    
    			if (sr) {
    				buffer.append("1");
    			} else {
    				buffer.append("0");
    			}
    
    			if ((i + 1) % numEach == 0) {
    				// 将二进制转为BigInteger
    				BigInteger eachValue = new BigInteger(buffer.toString(), 2);
    				System.out.println("----" + eachValue);
    				buffer.delete(0, buffer.length());
    				characters.add(eachValue);
    			}
    		}
    
    		return characters;
    	}
    
    	public static void main(String[] args) throws IOException {
    		String s = "传统的 hash 算法只负责将原始内容尽量均匀随机地映射为一个签名值," 
    				+ "原理上相当于伪随机数产生算法。产生的两个签名,如果相等,说明原始内容在一定概 率 下是相等的;"
    				+ "如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节," 
    				+ "所产生的签名也很可能差别极大。从这个意义 上来 说,要设计一个 hash 算法,"
    				+ "对相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始内容是否相等的信息外," 
    				+ "还能额外提供不相等的 原始内容的差异程度的信息。";
    		SimHash hash1 = new SimHash(s, 64);
    		System.out.println(hash1.intSimHash + "  " + hash1.intSimHash.bitLength());
    		// 计算 海明距离 在 3 以内的各块签名的 hash 值
    		hash1.subByDistance(hash1, 3);
    
    		// 删除首句话,并加入两个干扰串
    		s = "原理上相当于伪随机数产生算法。产生的两个签名,如果相等,说明原始内容在一定概 率 下是相等的;"
    				+ "如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节," 
    				+ "所产生的签名也很可能差别极大。从这个意义 上来 说,要设计一个 hash 算法,"
    				+ "对相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始内容是否相等的信息外," 
    				+ "干扰1还能额外提供不相等的 原始内容的差异程度的信息。";
    		SimHash hash2 = new SimHash(s, 64);
    		System.out.println(hash2.intSimHash + "  " + hash2.intSimHash.bitCount());
    		hash1.subByDistance(hash2, 3);
    
    		// 首句前添加一句话,并加入四个干扰串
    		s = "imhash算法的输入是一个向量,输出是一个 f 位的签名值。为了陈述方便," 
    				+ "假设输入的是一个文档的特征集合,每个特征有一定的权重。"
    				+ "传统干扰4的 hash 算法只负责将原始内容尽量均匀随机地映射为一个签名值," 
    				+ "原理上这次差异有多大呢3相当于伪随机数产生算法。产生的两个签名,如果相等,"
    				+ "说明原始内容在一定概 率 下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,"
    				+ "因为即使原始内容只相差一个字节,所产生的签名也很可能差别极大。从这个意义 上来 说,"
    				+ "要设计一个 hash 算法,对相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始"
    				+ "内容是否相等的信息外,干扰1还能额外提供不相等的 原始再来干扰2内容的差异程度的信息。";
    		SimHash hash3 = new SimHash(s, 64);
    		System.out.println(hash3.intSimHash + "  " + hash3.intSimHash.bitCount());
    		hash1.subByDistance(hash3, 3);
    
    		System.out.println("============================");
    
    		int dis = hash1.getDistance(hash1.strSimHash, hash2.strSimHash);
    		System.out.println(hash1.hammingDistance(hash2) + " " + dis);
    		// 根据鸽巢原理(也成抽屉原理,见组合数学),如果两个签名的海明距离在 3 以内,它们必有一块签名subByDistance()完全相同。
    		int dis2 = hash1.getDistance(hash1.strSimHash, hash3.strSimHash);
    		System.out.println(hash1.hammingDistance(hash3) + " " + dis2);
    	}
    }

    5、适用场景:

    simHash在短文本的可行性:

    测试相似文本的相似度与汉明距离
    测试文本:20个城市名作为词串:北京,上海,香港,深圳,广州,台北,南京,大连,苏州,青岛,无锡,佛山,重庆,宁波,杭州,成都,武汉,澳门,天津,沈阳

    相似度矩阵:

    simHash码:

    勘误:0.667, Hm:13 是对比的msg 1与2。
    可见:相似度在0.8左右的Hamming距离为7,只有相似度高到0.9412,Hamming距离才近到4,

    此时,反观Google对此算法的应用场景:网页近重复、镜像网站、内容复制、嵌入广告、计数改变、少量修改。
    以上原因对于长文本来说造成的相似度都会比较高,而对于短文本来说,如何处理海量数据的相似度文本更为合适的?

    测试短文本(长度在8个中文字符~45个中文字符之间)相似性的误判率如下图所示:



    REF:

    1、simHash 简介以及java实现

    http://blog.sina.com.cn/s/blog_4f27dbd501013ysm.html

    2、对simhash算法的一些思考

    http://2588084.blog.51cto.com/2578084/558873

    3、Simhash算法原理和网页查重应用

    http://blog.sina.com.cn/s/blog_72995dcc010145ti.html

    4、其它

    http://www.cnblogs.com/zhengyun_ustc/archive/2012/06/12/sim.html

    http://tech.uc.cn/?p=1086  利用Simhash快速查找相似文档

    http://jacoxu.com/?p=369  simHash是否适合短文本的相似文本匹配

    https://github.com/sing1ee/simhash-java

    http://blog.jobbole.com/46839/    海量数据相似度计算之simhash和海明距离

    求二进制数中1的个数

    http://segmentfault.com/q/1010000000269106

    海量数据相似度计算之simhash短文本查找(提升查找效率)

    http://blog.jobbole.com/47748/



    展开全文
  • Linux 如何文件中查找指定内容

    千次阅读 2020-05-30 11:39:12
    一、前言:Linux系统当中,查找文件里面的指定内容应该是系统维护、管理当中遇到最常见的。那么下面如何搜索、查找文件当中的内容呢?下面就介绍一下如何文件中查找指定的内容 查找文件当中的内容,一般最常用...

    一、前言:在Linux系统当中,查找文件里面的指定内容 应该是系统维护、管理当中遇到最常见的。那么下面如何搜索、查找文件当中的内容呢?下面就介绍一下如何在文件中查找指定的内容

    查找文件当中的内容,一般最常用的是grep命令,另外还有egrep, vi命令也能搜索文件里面内容。

    1、搜索某个文件里面是否包含字符串,使用 grep "search-content" filename

    命令:

    [root@localhost logs]# grep '搜索内容' log_file_catalina.out
    
    或者
    
    [root@localhost logs]# grep 搜索内容 log_file_catalina.out

    例如我们 查找 log_file_catalina.out 文件中包含 '总数:900' 的字符内容

    2: 2、如果你想搜索多个文件是否包含某个字符串,可以使用下面方式

    [root@localhost logs]# grep "search-content" filename1 filename2.... filenamen
    
    [root@localhost logs]# grep "search-content" *.out

    例如 我想查看当前目录下,哪些日志文件含'\总数:900\' {注意:搜索的内容如果包含特殊字符时,必须进行转义处理}

    [root@localhost logs]# grep "\\总数:900\\" *.out

    2.1 如果需要显示搜索文本在文件中的行数,可以使用参数 -n

    [root@localhost logs]# grep -n "\\总数:900\\" *.out

    2.2 如果搜索时需要忽略大小写问题,可以使用参数 -i

    [root@localhost logs]# grep -i "\\总数:900\\" *.out

    3、从文件内容查找不匹配指定字符串的行:

    [root@localhost logs]# grep –v "search-content" 文件名

    例如查找某些进程时,我们不想显示包含命令 grep tomcat 的进程,如下所示

    [root@localhost  admin]$ ps -ef | grep tomcat
    root 16675 16220  0 00:09 pts/1    00:00:00 grep tomcat
    root 21412     1  0 Aug22 ?        00:00:07 tomcat
    [root@localhost  admin]$ ps -ef  | grep tomcat| grep -v grep
    root 21412     1  0 Aug22 ?        00:00:07 tomcat
    [root@localhost  admin]$ 

    4、搜索、查找匹配的行数:

    [root@localhost logs]# grep -c "search-content" 文件名
    [root@localhost log]$ grep -c  "总数:900"  log_file_catalina.out
    2
    [root@localhost log]$ grep -c  "总数:900"  log_file_catalina.out
    5
    [root@localhost log]$ 

    5、如果只想获取和整个搜索字符匹配的内容,那么可以使用参数w 

    [root@localhost logs]# grep -w  "search-content" 文件名

     

    展开全文
  • 3、输入我们需要查找的内容,确认好之后搜索的内容在界面中显示,所有有关的内容也会在右侧栏中显示出来; 图3:查找的内容 4、如果想要看下面的内容,可以点击“编辑”→“超找”→“向下查找”; ...
  • 如何复制百度文档中的内容

    万次阅读 2019-05-16 11:19:18
    如何复制百度文档中的内容使用打印预览功能代码复制法方法1,手动查找复制快速查找Word文档助你复制直接修改复制内容使用选择性粘贴 有些小伙伴系不系对百度文档不能复制而感到烦恼呢?接下来我分享下学到的几个小...
  • (1)点击【开始】-【编辑】-【替换】按钮或按【Ctrl+H】组合键,打开“查找与替换”对话框,将鼠标光标定位于“查找内容”文本框中,然后点击“更多”按钮。 (2)展开“替换”栏,点击“特殊格式”按钮,弹出...
  • 可以用来查找指定文件夹下所有文件中包含指定内容的文件
  • 这不是源代码,是通过C#VS2010下实现的,可以说是个小工具,实现的功能是:打开某一文件下的所有word文档,然后设置一个或多个关键字,然后查找这些关键字是否word中出现,并将word文档名和关键字保存excel的...
  • 转载于:如何使用 Xilinx Documentation Navigator 查找下载官方PDF文档 引子 Xilinx提供了官方文档以供开发者学习其产品 官方文档可通过Xilinx Documentation Navigator轻松获得 让我们开始使用它查找下载官方...
  • 方法一: 今天有一朋友从网上下载了一个Word文档,可是打开该Word文档发现无法修改、查找、编辑,更可恶的是都不能选中Word文档中的内容。其实这是由于该Word文档文档保护了的原因,解决方法请接着往下看。 1、...
  • windows查找文件内容和文件内容

    千次阅读 2019-03-02 17:35:11
    查找文件内容: findstr /s /n "test" .\* /s 当前目录和所有子目录中搜索匹配文件。 /n 匹配的每行前打印行数。 文件中搜索字符串: find /N /I "sky" test.txt // test.txt文件中...
  • 如何查找Eclipse软件里面的文件路径

    千次阅读 2020-03-23 13:33:01
    如何eclipse软件里面查找自己写的文档存放路径或位置 (1)打开eclipse软件 (2)左上角点击File (3)File——Properties——Location 1.打开File 2.点击Properties 3.查找Loaction 即可查出文件存放位置。 ...
  • 文档A.TXT 内容里面有很多重复行. 形如: aaaaaaaaaa bbbbbbbb cccccccccc ddddddddd aaaaaaaaaa ddddddddd eeeeeeee 显然 aaaaaaaaaa 与 ddddddddd 这2行出现了几次重复~ 需要处理下,处理...
  • ctrl+H 查找, 使用通配符: [!^1-^127] , 表示所有非西文字符,即所有汉字和中文标点符号, 经测试有效.... "" ,好像都被检测出来了,英文状态下输入还是如此,怀疑是因为中英文这种编码是一样的,所以无效:
  • 上一章节讲诉了使用find命令查询...所以针对这个问题,今天我们来学习另外一个能快速查找一个文件的命令,以及这个命令原理是什么,还会教大家如何linux中查找我们输入命令所在文件路径。 一、locate 命令 : l...
  • 事情是这样的,我python中安装了PyQt5后,想...1、原来安装PyQt5时相应的帮助文档已经安装目录里面了。 2、打开 python安装目录\C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\Lib\sit
  • 命令格式: find 查找路径 -name "*" | xargs grep "关键字"... 根文件夹下查找含有关键字route的文件,列出文件名和route所在行   eg.2  find / -name '*.txt' | xar...
  • txt,html,php,asp,word等各类文件文字内容查找并替换,网站使用多年,非常好用
  • SharePoint把用户列表中的数据都保存在content database的AllUserData表中。这个表预先创建了很多的列,例如可以保存文本的nvarchar1,......当用户SharePoint的list中建立一个column,SharePoint就会根据这个
  • 首先要进入命令模式(按ESC退出INSERT模式) 然后输入:/单词
  • Linux里如何查找文件内容

    千次阅读 2019-09-12 15:05:07
    Linux查找文件内容的常用命令方法。 从文件内容查找匹配指定字符串的行: $ grep "被查找的字符串" 文件名 例子:当前目录里第一级文件夹中寻找包含指定字符串的.in文件 grep "thermcontact" */*.in ...
  • DOM里面document的查找节点的方式

    千次阅读 2019-08-21 14:43:44
    getElementById() : 根据id属性值获取元素对象。id属性值一般唯一 getElementsByTagName():根据元素名称获取元素对象们。返回值是一个数组 getElementsByClassName():根据Class属性值获取元素对象们。...
  • 引言 有时候你会遇到这种情况:昨晚花了N个小时精心准备明天演讲的Word,亦或者是花了大量...今天给大家说的这个软件就是一个免费搜索工具Anytxt,全称是AnyTXT Searcher,各种Office文档,文本文件,代码,PDF等,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 203,273
精华内容 81,309
关键字:

怎么在文档里面查找内容