自定義分詞器

2019-08-14 14:18 更新

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

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

1. 編寫自定義分詞器

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

通常來講,您只需要實(shí)現(xiàn) XSTokenizer::getTokens 即可。該函數(shù)接受 2個(gè)參數(shù),分別為要分詞的值以及 當(dāng)前的文檔對(duì)象(可選);返回值為分好的詞匯組成的數(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ù)支持的分詞器,比如讓用戶傳入按什么字符分割,請(qǐng)參照下面寫法編寫構(gòu)造函數(shù):

class XSTokenizerXyz implements XSTokenizer

{

    private $delim = '-';

    // 默認(rèn)按 - 分割

    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. 使用自定義分詞器

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)