自定義分詞器

2019-08-14 14:18 更新

Xunsearch 默認內(nèi)置了功能強大的 SCWS 分詞系統(tǒng),也附加提供了一些簡單常見的分詞規(guī)則, 但考慮到用戶的個性需求,特意提供了自定義分詞器的功能。

Note: 自定義分詞器存在一個缺陷,它不支持存儲位置信息,也就是不能按短語檢索、以及 NEAR 之類的 語法檢索。相當(dāng)于該字段配置中的 phrase 值恒為 no,通常把自定義分詞用于一些帶有一定規(guī)則的簡要 字段,而不是更多的考慮語義關(guān)系。

1. 編寫自定義分詞器

自定義分詞器必須實現(xiàn) XSTokenizer 接口。假定您要編寫一個名為 xyz 的分詞器,則您要編寫的代碼 文件為XSTokenizerXyz.class.php,請將文件統(tǒng)一放入 $prefix/sdk/php/lib 目錄。

通常來講,您只需要實現(xiàn) XSTokenizer::getTokens 即可。該函數(shù)接受 2個參數(shù),分別為要分詞的值以及 當(dāng)前的文檔對象(可選);返回值為分好的詞匯組成的數(shù)組。下面以按 - 分割字段為例:

class XSTokenizerXyz implements XSTokenizer

{

    public function getTokens($value, XSDocument $doc = null)

    {

        $ret = array();

        if (!empty($value)) {

            $ret = explode('-', $value);

        }

        return $ret;

    }

}

Note: XSTokenizer::getTokens 的參數(shù) $value 的編碼始終為 UTF-8 。

如果您需要編寫帶有參數(shù)支持的分詞器,比如讓用戶傳入按什么字符分割,請參照下面寫法編寫構(gòu)造函數(shù):

class XSTokenizerXyz implements XSTokenizer

{

    private $delim = '-';

    // 默認按 - 分割

    public function __construct($arg = null)

    {

        if ($arg !== null && $arg !== '') {

            $this->delim = $arg;

        }

    }

    public function getTokens($value, XSDocument $doc)

    {

        $ret = array();

        if (!empty($value)) {

            $ret = explode($this->delim, $value);

        }

        return $ret;

    }

}

2. 使用自定義分詞器

編寫完了自定義分詞器的代碼后,您就可以在項目配置文件中使用它了,在需要用這個分詞器的字段中 指定tokenizer 選項的值,例子中省略了字段的其它選項,實際編寫時可能還包括其它選項。

而在搜索語句中,如果指明了字段搜索前綴 field:XXX 那么搜索引擎內(nèi)部也會 對這個搜索語句執(zhí)行自定義分詞。

[some_field]; 不帶參數(shù)的用法tokenizer = xyz; 帶參數(shù)的用法,表示把 _ 作為參數(shù)傳遞給構(gòu)造函數(shù)tokenizer = xyz(_)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號