html怎么做搜索框索引,创建并使⽤HTML全⽂搜索索引(C)这个过程通常被称为
information retrieval.你可能会发现
this online book有帮助.
现有图书馆
这⾥有两个现有的解决⽅案可以完全集成到⼀个应⽤程序中,⽽不需要单独的进程(我相信都会⽤VC编译).
Xapian是成熟的,可以做很多你需要的,从索引到排序检索.需要单独的HTML解析,因为AFAIK,它不解析html(它有⼀个配套程序Omega,它是索引⽹站的前端).
Lucene是Java中的索引/搜索Apache库,具有官⽅预发⾏版本C版本lucy和⾮官⽅C版本CLucene.
实施信息检索
如果上述选项由于某种原因不可⾏,请参阅构建和使⽤索引的各个步骤的⼀些信息.根据您的应⽤需求,定制解决⽅案可以从简单到复杂.我把这个过程分成5个步骤
html document是什么> HTML处理
>⽂字处理
>索引
>检索
>排名
HTML处理
这⾥有两种⽅法
>剥离您引⽤的页⾯讨论了通常称为剥离的技术,其中涉及删除所有不会显⽰的HTML元素,并将其他元素转换为其显⽰形式.就个⼈⽽⾔,我将使⽤perl进⾏预处理,并对结果⽂本⽂件进⾏索引.但是,对于集成解决⽅案,特别是要记录重要性标签(例如< h1>< h2>)的解决⽅案,您可能希望⾃⼰的⾓⾊. Here is a partial implementation的C剥离程序(出现在C的思考,最终版本的here),你可以从中构建.
>解析从剥离的复杂性上升到html解析,这将有助于您记录重要性标签.但是,⼀个好的C HTML解析器是hard to find.⼀些选项可能是htmlcxx(从来没有使⽤,但是有活⼒,看起来很有前途)或hubbub(C库,NetSurf的⼀部分,但声称是可移植的).
如果您正在处理XHTML或愿意使⽤HTML到XML转换器,则可以使⽤许多可⽤的XML解析器之⼀.但是,再次,HTML到XML转换器很难到,我唯⼀知道的是HTML Tidy.除了转换为XHTML,其主要⽬的是修复丢失/损坏的标签,⽽has an API可能⽤于将其集成到应⽤程序中.给定XHTML⽂档,有许多很好的XML解析器,例如Xerces-C++和tinyXML.
⽂字处理
⾄少对于英⽂来说,处理⽂字到字很简单.当涉及搜索时,有⼀些并发症.
>停⽌单词是先验⽽不是提供集合中的⽂档(例如⽂章和命题)之间的有⽤区别的单词.这些词通常不会从查询流中编⼊索引和过滤.⽹络上有很多停⽌列表,例如one.
> Stemming涉及预处理⽂档和查询,以确定每个单词的根,以更好地推⼴搜索.例如.寻“foobarred”应该产
⽣“foobarred”,“foobarring”和“foobar”.该索引可以单独构建和搜索.两种⼀般的⼲扰⽅法是基于字典(来⾃词==>根的查)和基于算法.波特算法是⾮常普遍的,并且有⼏种实现可⽤,例如. C++ here或C here.在Snowball C library停留⽀持多种语⾔.
> Soundex encoding使搜索更加鲁棒的拼写错误的⼀种⽅法是使⽤语⾳编码对字进⾏编码.那么当查询
语⾳错误时,他们仍然会直接映射到索引的单词. here’s one有很多实现.
索引
地图字==>页⾯数据结构被称为inverted index.它被反转,因为它经常从页⾯的前向索引⽣成==>话.反向索引通常有两种风格:反转⽂件索引,它们将每个⽂档映射到其中,并将完整的反向索引映射到每个⽂档中的每个位置.
重要的决定是后端⽤于索引,⼀些可能性是按照易于实现的顺序:
> SQLite或Berkly DB – 这两个都是具有集成到项⽬中的C API的数据库引擎,⽽不需要单独的服务器进程.持久性数据库基本上是⽂件,因此可以通过更改关联的⽂件来搜索多个索引集.使⽤DBMS作为后端可简化索引创建,更新和搜索.
>在内存数据结构中 – 如果您使⽤的反向⽂件索引不是太⼤(内存消耗和加载时间),则可以以std :: map< std ::
string,word_data_class> ;,将boost::serialization⽤于持久性.
>在磁盘数据结构 – 我听说过使⽤内存映射⽂件这种事情,YMMV惊⼈的快速结果.具有反向⽂件索引将
涉及到两个索引⽂件,⼀个表⽰与struct {char word [n]等字的单词; unsigned int offset; unsigned int count; },第⼆个表⽰(word,document)的元组只有unsigned
int(在⽂件偏移量中隐含的单词).偏移量是第⼆个⽂件中单词的第⼀个⽂档ID的⽂件偏移量,count是与该单词相关联的⽂档ID数量(从第⼆个⽂件读取的ids的数量).然后,搜索将通过指向内存映射⽂件的指针减少到通过第⼀个⽂件的⼆进制搜索.缺点是需要填充/缩短单词以获得⼀个恒定的记录⼤⼩.
索引的过程取决于您使⽤的后端.⽤于⽣成反转⽂件索引(detailed here)的经典算法从阅读每个⽂档开始,并扩展(页⾯ID,字)元组的列表,忽略每个⽂档中的重复单词.处理所有⽂档后,按字排序列表,然后折叠为(word,(页⾯id1,页⾯id2,…)).
mifluz gnu库实现具有存储的倒排索引,但没有⽂档或查询解析. GPL,因此可能不是⼀个可⾏的选择,但会让您了解⽀持⼤量⽂档的反向索引所涉及的复杂性.
恢复
⼀个⾮常常见的⽅法是布尔检索,它只是分别⽤于或者分别连接到每个查询词的索引⽂档的联合/交集.如果⽂档ID按照每个术语的排序顺序存储,这些操作是有效的,因此可以直接应⽤std :: set_union或std :: set_intersection等算法.
检索有差异,wikipedia有⼀个概述,但是标准布尔对许多/⼤多数应⽤是有好处的.
排⾏
对布尔检索返回的⽂档进⾏排序有很多种⽅法.常⽤的⽅法是基于单词模型,这仅仅意味着词的相对位置被忽略.⼀般的⽅法是对每个检索到的⽂档相对于查询进⾏评分,并根据其计算得分对⽂档进⾏排名.有很多评分⽅法,但是起始的地⽅就是频率逆⽂档频率公式.
这个公式背后的想法是,如果⼀个查询词频繁出现在⼀个⽂档中,该⽂档应该得分更⾼,但是在许多⽂档中发⽣的⼀个词语的信息量较少,因此这个词应该被加权.公式是,超过查询词i = 1..N和⽂档j
score [j] = sum_over_i(word_freq [i,j] * inv_doc_freq [i])
其中word_freq [i,j]是⽂档j中单词i的出现次数,
inv_doc_freq [i] = log(M / doc_freq [i])
其中M是⽂档的数量,doc_freq [i]是包含单词i的⽂档数量.请注意,所有⽂件中出现的单词都不会对分数做出贡献.⼴泛使⽤的更复杂的得分模型是BM25,包括Lucene和Xapian.
通常情况下,通过反复调整可以获得特定领域的有效排名.通过标题/段落上下⽂来调整排名的起始位置可能会使基于标题/段落上下⽂的单词的word_freq膨胀. 1段,10级为顶级标题.对于其他⼀些想法,您可能会发现this paper有趣,作者调整了BM25排名的位置得分(这个想法是更接近⽂档开头的词语⽐结束语更相关).
详细here,精确回忆曲线或平均精度得出了⽬标量化排序性能.评估需要⼀组理想的查询组合与集合中的所有相关⽂档.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。