`
ythzjk
  • 浏览: 75473 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用zend Framework的lucene进行全文检索——中文分词

阅读更多
[2007/06/16 21:52 | 分类: PHP高级技术 » PHP面对对象 | by feifengxlq ]
前言:去年系统的研究了下lucene和weblucene等相关的全文检索技术。后来也稍微的看了下zend Framework的lucene。之后就没有继续研究了。这次打算给研学吧(http://www.yanxue8.com)添加全文检索的功能,再次重新研究下zend Framework的lucene模块。

    接下来的几篇文章会系统讲述如何使用zend Framework搭建一个简单实用的站内全文检索。主要是增对数据库里面的数据进行检索。关于全文检索的基本知识,和zend framework环境的搭建使用,我这里不细说(呵呵,其实我自己也不是是zend framework,而是用自己的phpbean。zend framework我只当作库类用)。

     ZF本身没有提供中文分词算法,具体应用中要自己写。我这里使用简单的二元分词算法(只在utf-8下工作正常,对于其他字符集,请修改程序)。

    第一步、如何测试分词算法的输出。
    在zf 的手册中没有提到,我这里简单给个例子:
复制内容到剪贴板
代码:
<?php
$analyzer = Zend_Search_Lucene_Analysis_Analyzer::getDefault();
$value = 'this is a test!';
        $analyzer->setInput($value, 'utf-8');
         
    $position     = 0;
        $tokenCounter = 0;
        while (($token = $analyzer->nextToken()) !== null) {
            $tokenCounter++;
            $tokens[] = $token;
        }
        print_r($tokens);
?>
这里使用是zf默认的分词算法Zend_Search_Lucene_Analysis_Analyzer_Common_Text。另外你可以加上一个过滤方法。比如说过滤一些单词,比如“is”,"a "之类的。

  第二步、自定义自己的分词算法,可以参考手册,或者自己看Zend_Search_Lucene_Analysis_Analyzer_Common_Text类的实现。
   其中要注意的是过滤这点。由于我们的分词是二元分词,如果要过滤一些比如“的”、“啊”之类的单词,是无法使用内置的Tokens Filtering。我们需要是分词前先过滤调。这个可以在reset()里面实现
   例子。
复制内容到剪贴板
代码:
<?
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
class Phpbean_Lucene_Analyzer extends Zend_Search_Lucene_Analysis_Analyzer_Common {
     
    private $_position;
     
    private $_cnStopWords = array();
     
    public function setCnStopWords($cnStopWords){
        $this->_cnStopWords = $cnStopWords;
    }

    /**
     * Reset token stream
     */
    public function reset()
    {
        $this->_position = 0;
        $search = array(",", "/", "\", ".", ";", ":", """, "!", "~", "`", "^", "(", ")", "?", "-", "t", "n", "'", "<", ">", "r", "rn", "$", "&", "%", "#", "@", "+", "=", "{", "}", "[", "]", ":", ")", "(", ".", "。", ",", "!", ";", "“", "”", "‘", "’", "[", "]", "、", "—", " ", "《", "》", "-", "…", "【", "】",);
        $this->_input = str_replace($search,' ',$this->_input);
        $this->_input = str_replace($this->_cnStopWords,' ',$this->_input);
    }

    /**
     * Tokenization stream API
     * Get next token
     * Returns null at the end of stream
     *
     * @return Zend_Search_Lucene_Analysis_Token|null
     */
    public function nextToken()
    {
        if ($this->_input === null) {
            return null;
        }
        while ($this->_position < strlen($this->_input)) {
            while ($this->_position < strlen($this->_input) &&
                    $this->_input[$this->_position]==' ' ) {
                $this->_position++;
            }
            $termStartPosition = $this->_position;      
            $temp_char = $this->_input[$this->_position];
            $isCnWord = false;
            if(ord($temp_char)>127){   
                $i = 0;        
                while ($this->_position < strlen($this->_input) &&
                ord( $this->_input[$this->_position] )>127) {
                    $this->_position = $this->_position + 3;
                    $i ++;
                    if($i==2){
                        $isCnWord = true;
                        break;
                    }
                }
                if($i==1)continue;
            }else{
                while ($this->_position < strlen($this->_input) &&
                ctype_alnum( $this->_input[$this->_position] )) {
                    $this->_position++;
                }
            }
            if ($this->_position == $termStartPosition) {
                return null;
            }

            $token = new Zend_Search_Lucene_Analysis_Token(
                                      substr($this->_input,
                                             $termStartPosition,
                                             $this->_position - $termStartPosition),
                                      $termStartPosition,
                                      $this->_position);
            $token = $this->normalize($token);
            if($isCnWord)$this->_position = $this->_position - 3;
            if ($token !== null) {
                return $token;
            }
        }
        return null;
    }
     
}
?>
测试分词输出demo
复制内容到剪贴板
代码:
<?
$stopWords = array('a', 'an', 'at', 'the', 'and', 'or', 'is', 'am');
        $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords($stopWords);
        $analyzer = new Phpbean_Lucene_Analyzer();
        $cnStopWords = array('的');
        $analyzer->setCnStopWords($cnStopWords);
        $analyzer->addFilter($stopWordsFilter);
        $value = 'this is " a test【中文】的测试';
        $analyzer->setInput($value, 'utf-8');
         
        $position     = 0;
        $tokenCounter = 0;
        while (($token = $analyzer->nextToken()) !== null) {
            $tokenCounter++;
            $tokens[] = $token;
        }
        print_r($tokens);
?>
比如上面的输出就是"this" "test" "中文" “测试”四个结果。符合我们的需要。
分享到:
评论

相关推荐

    使用zend Framework的lucene进行全文检索

    在本文中,我们将探讨如何使用Zend Framework的Lucene模块进行全文检索,特别是针对中文分词的处理。全文检索是提高网站或应用搜索功能的关键技术,它允许用户输入任意词汇,系统能够快速找到与之相关的内容。Zend ...

    中文分词及其在基于Lucene的全文检索中的应用

    《中文分词及其在基于Lucene的全文检索中的应用》这篇论文主要探讨了中文分词在全文检索系统,特别是基于Lucene平台的应用。全文检索技术是现代信息检索领域的重要组成部分,而Lucene作为一款开源的全文检索引擎框架...

    lucene.net+盘古分词多条件全文检索并匹配度排序

    使用visual studio 开发的lucene.net和盘古分词实现全文检索。并按照lucene的得分算法进行多条件检索并按照得分算法计算匹配度排序。 可以输入一句话进行检索。 lucene.net的版本为2.9.2 盘古分词的版本为2.3.1 并...

    Lucene4 全文检索

    作为一个高级的搜索引擎工具包,Lucene4 提供了完整的索引和搜索机制,使得在文件和数据库中进行全文检索变得简单高效。在本文中,我们将深入探讨 Lucene4 的核心概念、工作流程以及如何在实际项目中应用。 ### 1. ...

    ZEND FRAMEWORK 1.11.7 中文参考文档

    Table of Contents •Introduction to Zend Framework •Overview •Installation •Learning Zend Framework •Zend Framework Quick Start •Autoloading in Zend Framework •Plugins in Zend Framework •...

    基于lucene的全文检索系统

    **基于Lucene的全文检索系统** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单但功能强大的API,可以帮助开发者快速地在大量文档中实现高效的全文...

    Lucene全文检索引擎

    3. **索引(Index)**:索引是Lucene的核心,它是对文档集合的结构化表示,使得能快速进行全文检索。Lucene通过分词(Tokenization)、词干提取(Stemming)、去除停用词(Stopword Removal)等过程将原始文本转换...

    基于Lucene的全文检索系统

    **基于Lucene的全文检索系统** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单的API,使得开发者可以轻松地在Java应用程序中集成全文检索功能。在...

    lucene6.6+拼音分词+ik中文分词包

    提供的ik-analyzer-solr6.x.jar文件就是IK Analyzer的一个版本,适用于Solr 6.x,能够很好地与Lucene集成,进行中文分词。 除了IK Analyzer,还有pinyin4j-2.5.0.jar,这是一个Java库,用于处理汉字的拼音转换。在...

    基于Lucene的全文检索引擎研究与应用.pdf

    ### 基于Lucene的全文检索引擎研究与应用 #### 概述 随着信息技术的飞速发展,尤其是互联网的普及,企业和个人积累了大量的电子文档。如何高效地管理和检索这些文档成为了亟待解决的问题。全文检索技术作为一种...

    android+lucene实现全文检索并高亮关键字

    在Android平台上实现全文检索并高亮关键字是一项技术挑战,但通过集成Apache Lucene库,可以有效地解决这个问题。Apache Lucene是一个高性能、可扩展的信息检索库,它为开发人员提供了强大的文本搜索功能。以下是对...

    Lucene.Net 实现全文检索

    - **分析器(Analyzer)**:Lucene.Net 使用分析器对输入的查询和索引字段进行分词,不同的分析器会有不同的分词规则。选择合适的分析器对于搜索性能和准确性至关重要。 - **性能优化**:考虑到效率,可以采用多线程...

    lucene.NET 中文分词

    Lucene.NET 是一个高性能、全文检索库,它是Apache Lucene项目在.NET平台上的实现。作为一个开源的搜索引擎框架,Lucene.NET为开发者提供了强大的文本搜索功能。而在处理中文文档时,由于中文词汇间的无明显空格分隔...

    lucene3.5全文检索案例lucene+demo

    本篇文章将围绕“lucene3.5全文检索案例lucene+demo”,详细讲解Lucene 3.5的核心概念、关键功能以及如何通过实例进行操作。 一、Lucene 3.5核心概念 1. 文档(Document):Lucene中的最小处理单元,相当于数据库...

    lucene 全文检索

    在给定的压缩包中,`src` 文件夹可能包含了Lucene的Java源代码示例,`WebRoot` 可能是Web应用程序的根目录,这表明示例可能是如何在Web环境下集成Lucene进行全文检索的。`.classpath`、`.project` 和 `.settings` ...

    基于Lucene的全文检索系统研究与开发

    ### 基于Lucene的全文检索系统研究与开发 #### 摘要与背景介绍 本文探讨了一种基于Jakarta Lucene构建的全文检索系统模型。相较于Google的站内检索及传统数据库检索方法,该模型展现出显著的优势,特别是在关键字...

    使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现 - 干勾鱼的CSDN博客 - CSDN博客1

    在本文中,我们将探讨如何使用Lucene对这些文件类型进行全文检索的实现。 首先,为了实现全文检索,我们需要创建索引。在Lucene中,`IndexWriter` 类是负责创建和更新索引的主要工具。在`LuceneCreateIndex` 类中,...

    使用lucene全文检索数据库

    **使用Lucene全文检索数据库** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它是Java编写的,能够帮助开发者在各种应用程序中实现强大的全文检索功能。在这个项目中,我们将探讨如何利用Lucene ...

    基于Java的全文索引检索引擎——Lucene

    【基于Java的全文索引检索引擎——Lucene】 Lucene是一个用Java编写的开源全文检索引擎库,由Doug Cutting创建并贡献给Apache基金会,成为Jakarta项目的一部分,后来成为Apache软件基金会下的顶级项目。它的主要...

Global site tag (gtag.js) - Google Analytics