posts - 36, comments - 30, trackbacks - 0, articles - 0

FirteX的程序思想和组织结构

1:FirteX使用MFC架构。
2:FirteX结构相当灵活,可以任意扩充。
3:基本思想:
      1:主要的namespace:
               a:Collection:有多种Collection,DirCollection ,FileListCollection,TrecCollection,FirTexCollection
               b:parser:有多种parser,CPlainParser,和通过IParserPlugin扩充的CHTMLParserPlugin
               c:analyzer:有多种analyzer,CChineseAnalyzer,CDateTimeAnalyzer
      1:程序流程:
               通过一个实例解释程序流程:从一个文件夹的所有文本文件中建立索引并查找。
               a:选择参数。使用DirCollection收集一个文件夹的内容,指定CPlainParser从txt文件中建立索引,指定CChineseAnalyzer对中文词语进行索引。
               b:CIndexWriter 开始。 CIndexWriter::prepareBuildIndex中根据参数创建所有的实例,比如DirCollection,CPlainParser,CChineseAnalyzer,CIndexWriter。
               c:CCollection::scan()完成建立索引的过程。DirCollection遍历所有的文件,使CAnalyzer::analyze所有的文件。CAnalyzer将先用CPlainParser parse一遍,最后自己再analyze一遍。注意这两遍完成了最主要的工作。
               d:CPlainParser 的parser过程。
                        1:schema:title,contents,能从文件中查询多种段,CPlainParser 只有contents,html中有url,title等可以分schema查询。
                        2:CMetadata,可以是MT_STR,MT_NUMBER等可以查询词或数字。
                        3:CField类,通过CReader分析,是某种schema下的某种CMetada
                        4:Parser只是将Analyzer分开,以便多次多种Analyzer。
               e:CChineseAnalyzer把所有信息存入索引文件。CChineseAnalyzer进行的最主要的分词等功能。使用双数组Trie进行创建检索。但是并没有加入双数组Trie的生成。所以CChineseAnalyzer的作用就是利用文件中保存的双数组Trie进行分词等。双数组Trie的作用就是一个庞大的状态机。
               一个最小的例子:有5个词语的双数组Trie。“中华” “中餐馆”“中午”“中华人民共和国”“人”。分析一句话“中华有56民族”。首先,确定状态机的表示值。这个值在Firtex中其实是存在coredict.pdat里的。我们重新定义一下。
“民” 1 == end
                 “午” 3== end
   "中"  2   "华"    4       人   5   民 6 共 7 和 8 国 9 ==end
                  餐      10      馆 11
            
比如,这句话“中华有56民族”,首先通过一个巨大的数组,得到“中”的状态-2。然后记录下来。得到“华” "华"会从2状态为基础进行,所以进入状态4。最后得到本句话,241。写入索引文件(当然还有许多其他信息)。

如果有人查找"中",2命中,有人查找"中华",4命中,直接通过数字查找,速度相当的快。

所以词语的量是比较少的,一旦词汇量上去的,双数组Trie复杂程度就直线增长。

结论:
所以Firtex是一个非常灵活,有效率的系统,适合做文件查找。但不适合文件标注或自然语言理解的开发。      

只有注册用户登录后才能发表评论。