精华内容
下载资源
问答
  • 该程序主要功能可分为 1.为用户在本地建立一个文本文件,并且支持录入换行功能,字符序列构成且区分大小写 2.统计给定单词在文本文件中...3.检索输出某个单词某个单词出现在文本中的行号、在改行中出现的次数以及位置。
  • 文本单词检索算法

    2013-03-04 22:52:30
    这是我用c语言写的程序,用到的...用到了串的匹配,串的查找等算法。我的其他资源都是免费的,是对于c语言初学者的帮助比较大的,其中数据结构,window编程。我也在学c语言,每当我写完一个程序,我都会免费发上来。
  • 该方法基于视觉字典构建视觉词汇直方图和倒排序索引文件,并对视觉词重新分配权重以提高检索命中率。最后利用欧氏距离法查询完成相似性匹配。试验结果表明该方法能提高图像检索的准确率,对大规模的图像检索能够达到...
  • 针对企业产品制造过程中海量的计算机辅助设计(ComputerAidedDesign,CAD)模型的高效检索难题,文中 研究了一种基于二维 CAD模型内容特征的检索算法,构建了一个可用于 CAD的 DXF格式源文件模型库的检索系统 原型....
  • 文件中含有论文和源码,论文20页,详细描述了算法设计原理、可行性、评价以及很多算法设计的思想引入,源码包括B-树结构的头文件和论文中提到三个检索算法的实现。其中高效检索算法在保证结果正确性上较大程度的缩短...
  • 文件检索算法

    千次阅读 2011-06-04 21:40:00
    文件检索算法 可以 用这个算法 实现 混淆器的编写 ,以及 病毒等等的随机复制 只要 你想得到没有做不到 见个人博客: http://www.huanhuan18.com/blog/?p=30

    文件检索算法  可以 用这个算法 实现 混淆器的编写 ,以及  病毒等等的随机复制 只要 你想得到没有做不到

     

     

    见个人博客:   http://www.huanhuan18.com/blog/?p=30

    展开全文
  • 全文自动检索系统中的快速检索与索引文件压缩算法
  • Lucene的全文检索算法

    千次阅读 2016-12-30 22:18:50
    lucene是apache组织下的一个全文检索引擎工具包, 就是一堆jar包, 放入tomcat下不可以独立运行.2. lucene的作用?优化查询速度, 在海量数据查询的时候, 可以优化查询速度 我们可以使用lucene来构建像百度, 谷歌, ...

    ##1. 什么是lucene?
    lucene是apache组织下的一个全文检索引擎工具包, 就是一堆jar包, 放入tomcat下不可以独立运行.
    ##2. lucene的作用?
    优化查询速度, 在海量数据查询的时候, 可以优化查询速度
    我们可以使用lucene来构建像百度, 谷歌, 必应这样的全文检索引擎系统
    ##3. 应用领域:
    互联网全文检索引擎: 百度, 谷歌, 必应
    站内全文检索引擎: 天猫, 京东的搜索栏, 贴吧的帖子搜索

    ##4.中文分词器:
    作用: 让分成词符合中文语法
    cjk 中日韩分词器: 它里面使用的是二分法分词
    分词效果也不理想

    08年之前用的庖丁分词, 后来代码不再更新, 所以不好用了

    IK分词, 又是一个中国团队开发的中文分词器力作
    停用词典: 凡是出现在停用词典中的词都会被过滤掉
    扩展词典: 凡是出现在扩展词典中的词, 就认为是一个词

    刚解压出来的停用词典和扩展词典的编码格式是utf-8+BOM格式的, 放入项目中是不好用的, 所以需要手动
    转换成utf-8编码的文件

    ##全文检索算法(倒排索引表算法):
    首先将需要查询的文本提取出来, 进行切分词, 将切分出来的一个一个的词组成索引(目录),
    查询的时候先查索引(目录), 根据索引可以找到对应的文档, 那么这种通过索引找文档的方法,
    叫做全文检索算法
    优点: 查询速度快, 不会随着数据量的增大而使查询速度变慢
    缺点: 目录会占用额外磁盘空间, 本算法是用空间换时间
    切分词: 就是将一句一句的话切分成一个一个的词.去掉里面的空格, 标点符号, 停用词(a, an, the, 的, 地, 得),
    大写字母转小写字母
    索引库: 就是自己创建的一个文件夹, 里面放了lucene的索引文件和文档文件
    term词元: 就是一个单词

    ###索引的创建:

    package cn.itcast.lucene;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field.Store;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    import org.junit.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    import cn.itcast.dao.BookDao;
    import cn.itcast.dao.BookDaoImpl;
    import cn.itcast.pojo.Book;
    
    public class IndexManagerTest {
    	@Test
    	public void testIndexAndDocCreate() throws Exception {
    		//从数据库中获取原始数据
    		BookDao bookDao = new BookDaoImpl();
    		List<Book> bookList = bookDao.queryBookList();
    		List<Document> docList = new ArrayList<Document>();
    		
    		for(Book book:bookList){
    			Integer id = book.getId();
    			String name = book.getName();
    			Float price = book.getPrice();
    			String pic = book.getPic();
    			String desc = book.getDesc();
    			
    			//创建文档对象、
    			Document doc = new Document();
    			//创建域,第一个参数域名,第二个参数域值,第三个参数:是否存储,yes存储,no不存储
    			//是否分词:否, 因为ID是一个整体,分词后无意义
    			//是否索引:是, 因为需要根据id进行查询, 
    			//是否存储:是, 因为id主键字段很重要, 所以需要索引
    			StringField idField = new StringField("id",String.valueOf(id),Store.YES);
    			//是否分词:是, 因为名称分词有意义,并且需要根据名称进行查询
    			//是否索引:是, 因为需要根据名称查询
    			//是否存储:是, 因为列表页需要显示出来
    			TextField nameField = new TextField("name",name,Store.YES);
    			//是否分词:是, 因为lucne底层算法规定, 数字必须分词, 因为需要根据价格对比查找, 这个我们改不了,lucene定死了
    			//是否索引:是, 因为需要根据价格对比范围查找
    			//是否存储:是, 因为页面需要展示价格
    			FloatField priceField = new FloatField("price",price,Store.YES);
    			
    			//是否分词:否, 因为图片地址分词后无意义, 并且不需要根据地址查找
    			//是否索引:否, 因为不需要根据地址进行查找
    			//是否存储:是, 因为需要将图片展示出来
    			StoredField picField = new StoredField("pic",pic);
    			//是否分词:是, 因为需要根据描述进行查找, 并且描述分词后有意义
    			//是否索引:是, 因为需要根据描述进行查找
    			//是否存储:否, 查完不需要显示, 并且描述中含有量图片, 占用大量磁盘空间, 如果不存想拿出来, 也可以, 需要根据id
    					//编写sql语句, 去数据库中查找
    			TextField descField = new TextField("desc",desc,Store.NO);
    			
    			
    			//将域放入到文档对象中
    			doc.add(idField);
    			doc.add(nameField);
    			doc.add(priceField);
    			doc.add(picField);
    			doc.add(descField);
    			
    			//将文档放入到集合中
    			docList.add(doc);
    		}
    		
    		//1.创建分词器,StandardAnalyzer标准分词器,标准分词器就是单词分词,就是一个字就是一个词
    		//Analyzer                  = new StandardAnalyzer();
    		Analyzer analyzer = new IKAnalyzer();
    		//2.创建写入的目录地址,RAMDirectory存在内容中,FSDirectory存储在硬盘中File System Directory
    		Directory dir = FSDirectory.open(new File("E:\\dic"));
    		//3.创建索引和文档的初始化对象
    		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
    		//4.创建索引和文档对象
    		IndexWriter indexWriter = new IndexWriter(dir,config);
    		//5.将一个一个的文档集合都放入索引和文档的对象中
    		for(Document doc:docList){
    			indexWriter.addDocument(doc);
    		}
    		//6.提交
    		indexWriter.commit();
    		//7.关闭
    		indexWriter.close();
    	
    	}
    }
    

    ###查询具体流程:

    package cn.itcast.lucene;
    import java.io.File;
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.queryparser.classic.QueryParser;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    public class IndexSearchTest {
    	@Test
    	public void testIndexSearch() throws Exception {
    		//1. 创建分词器, 创建索引和搜索的时候使用的分词器要相同
    		//Analyzer analyzer = new StandardAnalyzer();
    		Analyzer analyzer = new IKAnalyzer();
    		//2.创建查询语法,第一个参数:默认搜索域,查询语法中如果指定域名从指定域中进行搜索,如果没有指定搜索的域从默认搜索域中进行搜索
    		QueryParser queryParser = new QueryParser("name",analyzer);
    		//3.设置查询语法,返回query对象
    		Query query = queryParser.parse("desc:java");
    		//4.指定从哪个目录中读取,也就是索引库的位置
    		Directory dir = FSDirectory.open(new File("E:\\dic"));
    	    //5.创建读取对象
    		IndexReader indexReader = IndexReader.open(dir);
    		//6.创建搜索对象
    		IndexSearcher indexSearcher = new IndexSearcher(indexReader);
    		//7.查询并返回结果,第一个参数:查询对象,第二个参数,指定返回多少条数据
    		TopDocs topDocs = indexSearcher.search(query, 10);
    		//打印一共查询到多少条数据
    		System.out.println("====count===" + topDocs.totalHits);
    		//8.返回查询到的结果集
    		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    		for(ScoreDoc scoreDoc :scoreDocs){
    			//在lucene创建文档的时候会自动给每个文档对象分配id, 在索引中有索引和对应的文档进行关联
    			int docID = scoreDoc.doc;
    			//通过文档id读取指定的文档
    			Document doc = indexReader.document(docID);
    			//通过域名取出域值
    			System.out.println("===id==" + doc.get("id"));
    			System.out.println("===name==" + doc.get("name"));
    			System.out.println("===price==" + doc.get("price"));
    			System.out.println("=================================================================");
    		}
    	
    	}
    }
    

    如果是IK分词器:需要引入config里面的东西、和ik分词器jar包
    这里写图片描述

    ##总结:
    1.我们从数据库查询出来数据,创建文档对象,每条数据均为一个文档对象。
    2.创建域,每个字段均作为域名,然后为参数传入域值(数据库中具体的字段值)。
    3.将文档放入到集合中,然后创建分词器,再创建要写入的目录地址。按照指定分词器规则进行分词,分词后,将文档的集合放入到索引和文档对象中(自动生成索引)。

    查询:

    1. 创建分词器, 创建索引和搜索的时候使用的分词器要相同。
      2.创建查询语法,第一个参数:默认搜索域,查询语法中如果指定域名从指定域中进行搜索,如果没有指定搜索的域从默认搜索域中进行搜索。
      3.设置查询语法,返回query对象
      Query query = queryParser.parse(“desc:java”); 第一个参数是搜索域,第二个是要搜索的内容。
      也就是在desc域中,搜索java,这样就会避免了全文扫描而造成效率低的情况。
      4.指定从哪个目录中读取,也就是索引库的位置
      5.创建读取对象(指定要读取的目录)
      6.创建搜索对象,从读取出来的索引和文档中进行搜索。
      7.执行搜索。(指定搜索规则,和查询条数)
      简单说:设置默认查询语法(默认搜索域和指定分词器)–》设置查询语法(指定搜索域和搜索内容)–》从文档和索引对象中进行查询–》执行查询(指定查询语法,查询条数——直接去找搜索区中查询指定内容)

    根据索引查询,可以避免全文扫描。大大提高查询效率。

    展开全文
  • annoy向量检索算法

    千次阅读 2019-12-11 11:37:06
    一:算法目标 annoy 算法的目标是建立一个数据结构能够在较短的时间内找到任何查询点的最近点,在精度允许的条件下通过牺牲准确率来换取比暴力搜索要快的多的搜索速度。 二:算法流程 1:建立索引 Annoy的目标是...

    一:算法目标

    annoy 算法的目标是建立一个数据结构能够在较短的时间内找到任何查询点的最近点,在精度允许的条件下通过牺牲准确率来换取比暴力搜索要快的多的搜索速度。

    二:算法流程

    1:建立索引

    Annoy的目标是建立一个数据结构,使得查询一个点的最近邻点的时间复杂度是次线性。Annoy 通过建立一个二叉树来使得每个点查找时间复杂度是O(log n)。 看下面这个图,随机选择两个点,以这两个节点为初始中心节点,执行聚类数为2的kmeans过程,最终产生收敛后两个聚类中心点。这两个聚类中心点之间连一条线段(灰色短线),建立一条垂直于这条灰线,并且通过灰线中心点的线(黑色粗线)。这条黑色粗线把数据空间分成两部分。在多维空间的话,这条黑色粗线可以看成等距垂直超平面。

    图片描述图片描述

    接下里在超平面分割后的字空间内按照同样的方法继续确定超平面分割字空间,通过这样的方法我们可以将子空间的从属关系用二叉树来表示:

    图片描述

    然后再继续分割,继续重复上述步骤,直到子节点包含的数据点数不超过 K 个,这里我们取 K = 10。

    图片描述

    通过多次递归迭代划分的话,最终原始数据会形成类似下面这样一个二叉树结构。二叉树底层是叶子节点记录原始数据节点,其他中间节点记录的是分割超平面的信息。Annoy建立这样的二叉树结构是希望满足这样的一个假设:  相似的数据节点应该在二叉树上位置更接近,一个分割超平面不应该把相似的数据节点分割二叉树的不同分支上。对应的二叉树结构如下所示:

    图片描述

    2 查询过程

    通过上述步骤,我们建立了二叉树的结构用于表示上述点分布空间,每个节点都表示一个子空间,在点分布空间中接近的子空间在二叉树结构中表现为位置靠近的节点。这里有一个假设,如果两个点在空间中彼此靠近,任何超平面都不可能将他们分开。如果要搜索空间中的任意一个点,我们都可以从根结点遍历二叉树。假设我们要找下图中红色 X 表示的点的临近点:查找的过程就是不断看他在分割超平面的哪一边。从二叉树索引结构来看,就是从根节点不停的往叶子节点遍历的过程。通过对二叉树每个中间节点(分割超平面相关信息)和查询数据节点进行相关计算来确定二叉树遍历过程是往这个中间节点左孩子节点走还是右孩子节点走。通过以上方式完成查询过程。

    图片描述图片描述

    3 存在问题

    但是上述描述存在两个问题:

    (1)查询过程最终落到叶子节点的数据节点数小于 我们需要的Top N相似邻居节点数目怎么办?

    (2)两个相近的数据节点划分到二叉树不同分支上怎么办?

    4 解决方法

    (1)如果分割超平面的两边都很相似,那可以两边都遍历;下面是是个示意图:

    (2) 建立多棵二叉树树,构成一个森林,每个树建立机制都如上面所述那样。多棵树示意图如下所示:

    (3) 采用优先队列机制:采用一个优先队列来遍历二叉树,从根节点往下的路径,根据查询节点与当前分割超平面距离(margin)进行排序。

    5:合并节点

    每棵树都返回一堆近邻点后,如何得到最终的Top N相似集合呢?首先所有树返回近邻点都插入到优先队列中,求并集去重, 然后计算和查询点距离, 最终根据距离值从近距离到远距离排序, 返回Top N近邻节点集合。

    三:代码实战

    from annoy import AnnoyIndex
    
    #坑坑坑:annoy必须为整数索引,所以要建立item与整数的映射
    nItem = {} #建立 N->item 字典映射,这样能够最后从查询到的近似向量id值查询到映射的词
    itemN = {} #建立 item->N 映射,便于低频item映射
    
    #将所有item_vector通过Annoy算法建立索引树
    vf = 32 #所建立索引的向量长度
    vt = AnnoyIndex(vf, metric='angular') #采用余弦距离计算
    
    count = 0
    item_vector = {}
    #加载模型向量 page_event_model为训练完的word2vec模型文件
    with open(localpath + 'page_event_model') as csv_file:
    	csv_reader = csv.reader(csv_file, delimiter=' ')
    	for line in csv_reader:
    		#if len(line) != 33: continue
    		try:
    			count += 1
    			item_uuid = line[0]
    			line = line[1:]
    			item_vec = [float(vec) for vec in line] # annoy元素只能是float类型数据
    			vt.add_item(count, item_vec) # 将高频item加载到annoy索引树中
    			calculate_N.add(count)
    
    			nItem.setdefault(count, item_uuid) # 建立count->item的索引,便于后期查找恢复
    			itemN.setdefault(item_uuid, count) # 建立item->count的索引,便于映射低频item
    
    			item_vector.setdefault(item_uuid, item_vec) #存储每个item 和 向量
    
    		except Exception as e:
    			#print (traceback.print_exc())
    			continue
    			
    vt.build(100) #树的个数
    vt.save(localpath + 'annoy_item_vector_index') #保存向量索引树
    
    #读取模型文件,进行计算最近距离数据
    u = AnnoyIndex(vf, metric='angular')
    u.load(localpath + 'annoy_item_vector_index')
    
    ruku = []
    #生成入库trigger
    for number in calculate_N:
    	try:
    		v = []
    		item = nItem[number] 
    		ctype_base = item.split('_')[0]
    		result = u.get_nns_by_item(number, 50, include_distances=True) #基于annoy获得最近的50个向量item,result为一个list,list内元素为item的索引整数
    		for index, score in zip(result[0], result[1]):
    			item_sim = nItem[index] #基于索引得到item
    			score = 0.5 * (abs(1 - score)) + 0.5
    

    参考文献:

    https://blog.csdn.net/lsp1991/article/details/78127754

    展开全文
  • 所有检索到的瞳Kong功能都存储在字典中,并另存为.npz文件。 group_retrieval :(某种程度上)处理选定文件夹中所有.mat文件的主程序。 返回斯特列尔比率和检索到的学生的列表。 核心算法包含在类PSF_PF中,该类...
  • 主要功能:检索输出某个单词某个单词出现在文本中的行号、在改行中出现的次数以及位置。 核心代码设计: //设计初始类 class Word { public: Word(){text[0]='\0';} int Getlength()const; void ...

    主要功能:检索输出某个单词某个字符串出现在文本中的行号、在改行中出现的次数以及位置。

    核心代码设计:

    //设计初始类
    class Word
    {
    public:
    	Word(){text[0]='\0';}
    	int Getlength()const;
    	void PlaceVocabulary();
    	char text[MaxStrSize];
    	
    };
    

    Getlength()为求取text的字符串长度

    PlanceVocaBulary()为可使用用户在程序过程中输入字符

    1.求取失效函数算法设计

    求失效函数的作用是用于KMP算法过程中需要的变量。

    它的算法过程如下代码所示:

    void GetFailure(const Word &pat,int f[])
    {
    	int j=0,k=-1;
    	f[0]=-1;
    	while(j<pat.Getlength()-1)
    		if(k==-1||pat.text[k]==pat.text[j])
    			f[++j]=++k;
    		else
    			k=f[k];
    }
    

    2.KMP算法设计

    int KMP_find(Word ob,Word pat,int p=0)//p是用于下次匹配的开始检索位置
    {
    	int *f=new int[pat.Getlength()];
    	GetFailure(pat,f);
    	int i=p,j=0;
    	while(i<ob.Getlength()&&j<pat.Getlength()&&pat.Getlength()-j<=ob.Getlength()-i)
    	{
    		if(j==-1||pat.text[j]==ob.text[i])
    		{
    			i++;
    			j++;
    		}
    		else
    			j=f[j];
    	}
    	delete []f;
    	if(j<pat.Getlength())
    		return -1;  
    	else
    		return i-j;
    	
    }
    

    3.统计字符串出现次数功能设计

    void WordCount()
    {
    	Word ob,pat;
    	char filename[10];
    	ifstream infile;
    	int i=0,j,k;
    	cout<<"Place input flie name:";
    	cin>>filename;
    	
    	cout<<"Place input vocabulary:";
    	cin>>pat.text;
    	infile.open(filename);
    	while(infile)
    	{
    		infile.getline(ob.text,MaxStrSize);
    		k=0;
    		while(k<ob.Getlength()-1)
    		{
    			j=KMP_find(ob,pat,k);
    			if(j<0) break;
    			else
    			{
    				i++;
    				k=j+ob.Getlength();
    			}
    		}
    		
    	}
    	infile.close();
    	cout<<pat.text<<endl;
    	cout<<"在文本文件:"<<filename<<"   "<<"总共出现"<<i<<"次"<<endl;
    }
    

    4.检索单词功能设计

    void WordRetrieval()
    {
    	Word ob,pat;
    	char filename[20];
    	int i,j,k,l=0,m;
    	int wz[20];
    	ifstream infile;
    	cout<<"Place text file name:";
    	cin>>filename;
    	cout<<"Place you need retrieval:";
    	cin>>pat.text;
    	infile.open(filename);
    	while(infile)
    	{
    		infile.getline(ob.text,MaxStrSize);
    		l++;k=0;i=0;
    		while(k<ob.Getlength()-1)
    		{
    			j=KMP_find(ob,pat,k);
    			if(j<0) break;
    			else
    			{
    				i++;
    				wz[i]=j;
    				k=j+ob.Getlength();
    			}
    		}
    		if(i>0)
    		{
    			cout<<"所在行:"<<l<<"    出现次数:"<<i;
    			cout<<"在该行出现的位置分别是:";
    			for(m=1;m<=i;m++) cout<<wz[m]+1;
    			cout<<endl;
    		}
    	}
    	infile.close();
    	
    }
    

    关于界面设计的一些函数在这暂且不提,完整代码在文章末尾

    2.实现界面:

     

    附录 完整代码(文件下载在末尾)

    #include<fstream>
    #include<iostream>
    #include<stdio.h>
    #define MaxStrSize 100
    using namespace std;
    
    class Word
    {
    public:
    	Word(){text[0]='\0';}
    	int Getlength()const;
    	void PlaceVocabulary();
    	char text[MaxStrSize];
    	
    };
    
    void GetFailure(const Word &pat,int f[])
    {
    	int j=0,k=-1;
    	f[0]=-1;
    	while(j<pat.Getlength()-1)
    		if(k==-1||pat.text[k]==pat.text[j])
    			f[++j]=++k;
    		else
    			k=f[k];
    }
    
    int KMP_find(Word ob,Word pat,int p=0)//p是用于下次匹配的开始检索位置
    {
    	int *f=new int[pat.Getlength()];
    	GetFailure(pat,f);
    	int i=p,j=0;
    	while(i<ob.Getlength()&&j<pat.Getlength()&&pat.Getlength()-j<=ob.Getlength()-i)
    	{
    		if(j==-1||pat.text[j]==ob.text[i])
    		{
    			i++;
    			j++;
    		}
    		else
    			j=f[j];
    	}
    	delete []f;
    	if(j<pat.Getlength())
    		return -1;  
    	else
    		return i-j;
    	
    }
    void WordCount()
    {
    	Word ob,pat;
    	char filename[10];
    	ifstream infile;
    	int i=0,j,k;
    	cout<<"Place input flie name:";
    	cin>>filename;
    	
    	cout<<"Place input vocabulary:";
    	cin>>pat.text;
    	infile.open(filename);
    	while(infile)
    	{
    		infile.getline(ob.text,MaxStrSize);
    		k=0;
    		while(k<ob.Getlength()-1)
    		{
    			j=KMP_find(ob,pat,k);
    			if(j<0) break;
    			else
    			{
    				i++;
    				k=j+ob.Getlength();
    			}
    		}
    		
    	}
    	infile.close();
    	cout<<pat.text<<endl;
    	cout<<"在文本文件:"<<filename<<"   "<<"总共出现"<<i<<"次"<<endl;
    }
    void WordRetrieval()
    {
    	Word ob,pat;
    	char filename[20];
    	int i,j,k,l=0,m;
    	int wz[20];
    	ifstream infile;
    	cout<<"Place text file name:";
    	cin>>filename;
    	cout<<"Place you need retrieval:";
    	cin>>pat.text;
    	infile.open(filename);
    	while(infile)
    	{
    		infile.getline(ob.text,MaxStrSize);
    		l++;k=0;i=0;
    		while(k<ob.Getlength()-1)
    		{
    			j=KMP_find(ob,pat,k);
    			if(j<0) break;
    			else
    			{
    				i++;
    				wz[i]=j;
    				k=j+ob.Getlength();
    			}
    		}
    		if(i>0)
    		{
    			cout<<"所在行:"<<l<<"    出现次数:"<<i;
    			cout<<"在该行出现的位置分别是:";
    			for(m=1;m<=i;m++) cout<<wz[m]+1;
    			cout<<endl;
    		}
    	}
    	infile.close();
    	
    }
    void Word::PlaceVocabulary()
    {
    	cout<<"Place input text:"<<endl;
    	cin>>text;
    }
    
    int Word::Getlength() const
    {
    	int i;
    	i=0;
    	
    	while(text[i]!='\0')
    	{
    		i++;
    	}
    	
    	return i;
    }
    
    void Menu()
    {
    	cout<<"======================================="<<endl;
    	cout<<"文本文件单词的检索和计数系统"<<endl;
    	cout<<"======================================="<<endl;
    	cout<<"1.建立文本文件"<<endl;
    	cout<<"2.统计单词出现次数"<<endl;
    	cout<<"3.检索单词"<<endl;
    	cout<<"4.退出"<<endl;
    	cout<<"请输入你的选择<1,2,3,4>:";
    }
    void CreateText()
    {
    	Word Text,end;
    	char TextName[100];
    	end.text[0]='/';
    	end.text[1]='e';
    	end.text[2]='n';
    	end.text[3]='d';
    	end.text[4]='\0';
    	cout<<"请输入文件名:";
    	cin>>TextName;
    	ofstream outfile(TextName,ios::out);
    	if(!outfile)
    	{
    		cerr<<"open error!"<<endl;
    	}
    	cout<<"请输入文本内容:(写完后用/end结束输入)"<<endl;
    
    	while(KMP_find(Text,end)==-1)
    	{
    		cin>>Text.text;
    		if(KMP_find(Text,end)==-1) 
    			for(int i=0;i<Text.Getlength();i++) outfile<<Text.text[i];
    			outfile<<'\n';
    	}
    	outfile.close();
    	cout<<"Text create success"<<endl;
    }
    int main()
    {
    	
    	int i,j=1;
    	do{
    		
    		Menu();
    		cin>>i;
    		switch(i)
    		{
    		case 1:		CreateText();break;
    		case 2:		WordCount();break;
    		case 3:		WordRetrieval();break;
    		case 4:		j=0;break;
    		default:	cout<<"Place error"<<endl;
    		}
    		
    	}while(j);	
    	return 0;
    }
    

    下载地址:

    https://download.csdn.net/download/keith_prime/10680681

    展开全文
  • 文本检索算法

    千次阅读 2012-06-21 15:31:31
    这个函数的功能是检索文件中的单词,并定位到那一行,并输出出现数目。 算法感觉难度不是特别大,但我这个算法效率并不高,准备以后写个效率更高的。 函数的第二个参数可以删除,在这里并没有什么用。 void word_...
  • 文件检索-Python

    千次阅读 2018-08-25 15:43:38
    需求:一个1,500,000行数据的文件,需要进行多次检索。其中每行文件为一个列表,且每行列表的首位有序 问题:使用一般的循环检索方式,非常耗时,检索速度慢。 一、基础语法  1、拆分文件的路径和文件名  如...
  • 关键字并行检索算法PTKS ( Parallel Top - k Keyword Search Algorithm )。实验证明, PTKS提高了概率 XML文档关 键字检索的时间效率,尤其在文档结构复杂度高...
  • 编程实现Fibonacci检索算法  实验原理: Fibonacci数的定义为f0=0,f1=1,fi=f(i-1)+f(i-2)(i≥2)。由此得Fibonacci 数列为0,1,1,2,3,5,8,13,21,34,55,89,144,…… 设数组F中元素按关键字值从小到大...
  • 内容索引:VC/C++源码,文件操作,文件搜索 VC++ 快速检索(搜索)指定文件,具体的原理还没有仔细看,感觉不是太复杂的算法,演示效果如上图所示。
  • 在某些时候,可能会涉及在海量数据中的查找,如果采用通常的做法,则很难达到一定的效果,在实际工程实践中,海量数据的查找性能很肯恩鬼成为整个系统的性能瓶颈,在...布隆过滤器可以用于检索一个元素是否在一个集...
  • 该项目用于从pdb样式文件中提取comogphog特征,以用于我们的生物信息学研究项目,该研究涉及快速高效的蛋白质三级结构检索算法。 此特征提取方法用于预处理我们开发的COMOGRAD(可从界面进行蛋白质三级结构比较。 ...
  • 通过本程序,可以检索到本机的各个磁盘,并将要查找的文件搜索出来。
  • 为提升数据检索读的性能,基于老化算法采取Cache方法,通过设计合理的缓存结构,给出一种新的分布式文件缓存算法.该算法在缓存实现部分,使用了LRU算法中常用的老化算法,并将其由一个页面置换算法改进为一个文件缓存替换...
  • 利用matlab完成图像检索,利用图像的颜色直方图特征,同时包含特征mat文件的制作
  • 如何使用C\C++实现文件检索

    千次阅读 2016-08-25 13:30:30
    列出该文件夹下的子文件夹的名称,文件的名称及大小。 #include #include #include using namespace std; //typedef struct _WIN32_FIND_DATA { // DWORD dwFileAttributes; //文件属性 // FILETIME ...
  • 该软件包使用SPIMI算法实现了信息检索系统的索引组件。 作者:Bilal Ansari @ Ye Thi Ha ==========说明============= 此python程序(indexingMod)使用SPIMI算法实现信息检索系统的索引组件。 输入索引程序: 包含...
  • java文本搜索算法

    2010-12-21 20:03:02
    java文本搜索算法 可是实现JAVA文本里的关键字搜索 而不是简单的使用java提供的方法
  • Bag of Features 图像检索算法及其python实现1.原理2.代码实现 PS:阅读此文需要读者对图像提取特征点,生成描述符的知识一定了解,如sift,surf算法等等,对生成向量类心的k-means算法也需要一定的了解。 1....
  • 算法排序和检索.ppt

    2020-07-23 09:47:31
    数据结构与算法分析 A Practical Introduction to Data Structures and Algorithm Analysis 数据结构与算法分析 第三部分排序和检索 第7章内排序 第8章文件管理和外排序 第9章检索 第10章索引技术 参考文献: Data ...
  • 合肥学院 计算机科学与技术系 课程设计报告 20172018 学年 第二学期 课 程 数据结构与算法 课 程 设 计 名 称 文本文件单词的检索与计数 学 生 姓 名 陈映而 学 号 1604092001 专 业 班 级 16 软件工程 1班 指 导 教...
  • 设磁盘上n 个文件 f1,f2,...,fnf1,f2,...,fnf_1, f_2 ,..., f_n ,每个文件占磁盘上 1 个磁道。这n 个文件检索概 n率分别是 p1,p2,...,pnp1,p2,...,pnp_1 , p_2 ,..., p_n ,且∑i=1npi=1∑i=1npi=1\sum\limits_{...
  • 此文件夹包含我在蛋白质三级结构检索算法研究中使用的代码。 代码是零散的。 因此,需要如上所述逐步运行。 一些matlab脚本,其中一些是从github收集的,其余的则由我完成。 注意:此处提供的存储库包含我们多年...
  • 大日志文件搜索关键字算法

    千次阅读 2018-08-19 11:26:26
    //按行读取日志文件,对每一行分别计算关键字次数,累加进map while (line!= null ){ for ( int i= 0 ;i;i++){ line += " " ; //不加单词,若关键词在句末,则被遗漏 //通过split方法实现搜索关键字...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,881
精华内容 43,552
关键字:

文件检索算法有哪些