全文索引--自定义chinese_lexer词典

本文来详解一下如何自定义chinese_lexer此法分析器的词典

初始化数据

create table test2 (str1 varchar2(2000),str2varchar2(2000)) ;

insert into test2
  values('地质图','中国和反馈砀山龙卷风流口水地质图') ;
insert into test2
  values('图片','图') ;
commit ;

创建此法分析器并且创建全文索引(注意词典只对chinese_lexer起作用)

exec ctx_ddl.create_preference('my_lexer1','CHINESE_LEXER');

EXEC ctx_ddl.create_preference('dataquery','MULTI_COLUMN_DATASTORE');
EXEC ctx_ddl.set_attribute('dataquery','columns', 'str1,str2');

CREATE INDEX test2_idx ON test2(str1) INDEXTYPEIS ctxsys.CONTEXT PARAMETERS('datastore dataquery LEXER my_lexer1');
 

看一下生成的词表,可以看到,是没有地质图这个关键字的。

[email protected]>select * from DR$TEST2_IDX$I ;

TOKEN_TEXT                                                      TOKEN_TYPE TOKEN_FIRST TOKEN_LAST TOKEN_COUNT
-------------------------------------------------------------------------- ----------- ---------- -----------
TOKEN_INFO
-----------------------------------------------------------------------------------------------------------------------------------------------------
STR1                                                                      0           1          2        2
0090010301900102

STR2                                                                     0           1          2        2
0090050B01900402

地质                                                                     0           1          1       1
0090020C

反馈                                                                     0           1          1       1
008808

和                                                                        0           1          1       1
008807

口水                                                                     0           1          1       1
00880D

流                                                                       0           1          1       1
00880C

龙卷风                                                                   0           1          1       1
00880B

山                                                                       0           1          1      1
00880A

图                                                                       0           1          2       2
0090030C018805

图片                                                                     0           2          2       1
008802

中国                                                                     0           1          1       1
008806

砀山                                                                     0           1          1       1
008809

已选择13行。

下面开始,使用自定义词典

C:\Users\fengjun>ctxlc -zht -ocs zhs16GBK> zhs16gbk_102.txt

C:\Users\fengjun>zhs16gbk_102.txt

搜索了一下文档,里面没有找到地质图这个关键词

最末尾加上地质图

生成自定义词典需要使用的三个以d、k、i结尾的文件

这里总是出错

C:\Users\fengjun>ctxlc -zht -ics zhs16gbk -izhs16gbk_102.txt
DRG-52107: ctxkbtc internal error

加上-n参数,顺利生成

C:\Users\fengjun>ctxlc -zht -ics zhs16gbk -n-i zhs16gbk_102.txt
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
DRG-52118: Writing index file for terms
DRG-52117: Writing index file for IDs
DRG-52116: Done writing all terms
DRG-52115: Writing new terms in lexicon tofiles
DRG-52114: Writing lexicon to files

C:\Users\fengjun>dir dr*
 驱动器 C 中的卷是Windows8_OS
 卷的序列号是6C5D-2B1F

 C:\Users\fengjun 的目录

2014/09/24 14:02         2,250,471 drold.dat
2014/09/24 14:02           391,326 droli.dat
2014/09/24 14:02            89,282 drolk.dat
2014/09/24 13:55           298,206 drolt.dat
              4 个文件      3,029,285 字节
              0 个目录 113,255,260,160 可用字节

备份$ORACLE_HOME\ctx\data\zhlx

下的内容,并且将上面的几个文件copy到$ORACLE_HOME\ctx\data\zhlx下,并且改名

d、k、i结尾的拷贝过去即可

一定记得将原来的文件备份一下。

[email protected]>drop index test2_idx force ;

索引已删除。

[email protected]>CREATE INDEX test2_idx ONtest2(str1) INDEXTYPE IS ctxsys.CONTEXT PARAMETERS('datastore dataquery LEXERmy_lexer1');

索引已创建。

[email protected]>select * from DR$TEST2_IDX$I ;

TOKEN_TEXT                                                      TOKEN_TYPE TOKEN_FIRST TOKEN_LAST TOKEN_COUNT
-------------------------------------------------------------------------- ----------- ---------- -----------
TOKEN_INFO
--------------------------------------------------------------------------------------------------------------------------
STR1                                                                     0           1          2        2
0090010201900102

STR2                                                                     0           1          2        2
0090040A01900402

地质图                                                                   0           1          1       1
0090020B

反馈                                                                      0           1          1       1
008807

和                                                                       0           1          1       1
008806

口水                                                                     0           1          1       1
00880C

流                                                                       0           1          1       1
00880B

龙卷风                                                                   0           1          1       1
00880A

山                                                                       0           1          1       1
008809

图                                                                       0           2          2       1
008805

图片                                                                     0           2          2       1
008802

中国                                                                     0           1          1       1
008805

砀山                                                                      0           1          1       1
008808

已选择13行。

可以看到已经有地质图这个关键字了。

这样自定义词典就完成了,对于大数据量的检索,自定义词典还是非常有意义的。

下面是一个相关的简单测试

未加关键词之前

SQL> select count(0) from data_query t wherecontains(MDTITILE,‘xxxx万地质图‘)>0;

COUNT(0)

----------

7072

已用时间:  00: 00: 01.54

执行计划

----------------------------------------------------------

Plan hash value: 670767155

--------------------------------------------------------------------------------

---

| Id  |Operation        | Name           | Rows  | Bytes | Cost (%CPU)| Time

|

--------------------------------------------------------------------------------

---

|   0 |SELECT STATEMENT |                |     1 |   85 |     4   (0)| 00:00:0

1 |

|   1|  SORT AGGREGATE  |                |     1 |   85 |            |

|

|*  2|   DOMAIN INDEX   | DATA_QUERY_IDX |   164 | 13940 |     4  (0)| 00:00:0

1 |

--------------------------------------------------------------------------------

---

Predicate Information (identified by operationid):

---------------------------------------------------

2 - access("CTXSYS"."CONTAINS"("MDTITILE",‘xxxx万地质图‘)>0)

统计信息

----------------------------------------------------------

3528  recursive calls

0  db block gets

      10214  consistent gets

1173  physical reads

2824  redo size

535 bytes sent via SQL*Net to client

524  bytes received via SQL*Netfrom client

2  SQL*Net roundtrips to/fromclient

263  sorts (memory)

0  sorts (disk)

1  rows processed

加关键词之后

SQL> select count(0) from data_query t wherecontains(MDTITILE,‘xxxx万地质图‘)>0 ;

COUNT(0)

----------

7072

已用时间:  00: 00: 00.28

执行计划

----------------------------------------------------------

Plan hash value: 670767155

--------------------------------------------------------------------------------

---

| Id  |Operation        | Name           | Rows  | Bytes | Cost (%CPU)| Time

|

--------------------------------------------------------------------------------

---

|   0 |SELECT STATEMENT |                |     1 |   85 |     4   (0)| 00:00:0

1 |

|   1|  SORT AGGREGATE  |                |     1 |   85 |            |

|

|*  2|   DOMAIN INDEX   | DATA_QUERY_IDX |   164 | 13940 |     4  (0)| 00:00:0

1 |

--------------------------------------------------------------------------------

---

Predicate Information (identified by operationid):

---------------------------------------------------

2 -access("CTXSYS"."CONTAINS"("MDTITILE",‘xxxx万地质图‘)>0)

统计信息

----------------------------------------------------------

643  recursive calls

0  db block gets

       2438  consistent gets

34  physical reads

0  redo size

535  bytes sent via SQL*Net toclient

524  bytes received via SQL*Netfrom client

2  SQL*Net roundtrips to/fromclient

34  sorts (memory)

0  sorts (disk)

1  rows processed

时间: 2024-12-29 04:42:06

全文索引--自定义chinese_lexer词典的相关文章

java自定义词典使用Hanlp

一开始按照网上的方法在配置文件加入自定义的词典不行,不知道是什么问题,这里给出链接,有兴趣的自己尝试:https://my.oschina.net/u/3793864/blog/3073171 说一下我的方法:在hanlp.java中添加路径即可,数组里直接加入 可以看到我是谁三个字被当成名词输出 整个项目:https://github.com/mmmjh/HanlpDemo 原文地址:https://www.cnblogs.com/mm20/p/11723392.html

Idea的tab设置错误使Ansj加载自定义词典时无效

在使用Anjs分词,自定义用户词典时需要注意自定词典词条的空白处是Tab,但是在Idea中输入Tab时,默认的是四个空格 点击将其改为tab即可,如图所示. 原文地址:https://www.cnblogs.com/DismalSnail/p/11771607.html

HanLP用户自定义词典源码分析

HanLP用户自定义词典源码分析 1. 官方文档及参考链接 关于词典问题Issue,首先参考:FAQ 自定义词典其实是基于规则的分词,它的用法参考这个issue 如果有些数量词.字母词需要分词,可参考:P2P和C2C这种词没有分出来,希望加到主词库 关于词性标注:可参考词性标注 ? 2. 源码解析 分析 com.hankcs.demo包下的DemoCustomDictionary.java 基于自定义词典使用标准分词HanLP.segment(text)的大致流程.首先把自定义词添加到词库中:

python jieba分词工具

源码地址:https://github.com/fxsjy/jieba 演示地址:http://jiebademo.ap01.aws.af.cm/ 特点 1,支持三种分词模式: a,精确模式,试图将句子最精确地切开,适合文本分析:     b,全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义:     c,搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词. 2,支持繁体分词 3,支持自定义词典 安装 1,Python 2.x 下的安

jieba分词的词性标注

号称"做最好的Python中文分词组件"的jieba分词是python语言的一个中文分词包.它的特点有: 支持三种分词模式: ? 精确模式,试图将句子最精确地切开,适合文本分析: ? 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义: ? 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词. 支持繁体分词 支持自定义词典 Python 2.x 下的安装 全自动安装:easy_install jieba 或者 pip inst

jieba

# coding: utf-8 # ###jieba特性介绍 # 支持三种分词模式: # 精确模式,试图将句子最精确地切开,适合文本分析: # 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义: # 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词. # 支持繁体分词. # 支持自定义词典. # MIT 授权协议. # ###分词速度 # 1.5 MB / Second in Full Mode # 400 KB / Second

结巴中文分词

转自:http://www.gowhich.com/blog/147?utm_source=tuicool&utm_medium=referral 源码下载的地址:https://github.com/fxsjy/jieba 演示地址:http://jiebademo.ap01.aws.af.cm/ 特点 1,支持三种分词模式: a,精确模式,试图将句子最精确地切开,适合文本分析:    b,全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义:    c,搜索引擎模式

NLPIR分词(c++接口整理)

C/C++接口--对应的各个函数 函数1-bool NLPIR_Init(const char * sInitDirPath=0, int encoding=GBK_CODE,constchar*sLicenceCode=0);初始化函数 (1)  描述:在使用中文分词操作系统之前必须先进行初始化操作,才能继续接下来的操作 (2)  参数说明: sDataPath:Data 文件夹的路径,为空字符串时从项目根目录下开始寻找,一般在使用的时候先把Data放到项目文件里,所以为空encode:编码格

《人民的名义》---简单的文本分析

我们都知道进行自然语言处理的第一步就是分词,下面使用jieba模块对最近比较热的电视剧<人民的名义>进行分词,并对它进行一些简单的文本分析. 一.jieba模块中常用的方法说明(github): 1.分词: jieba.cut 方法接受三个输入参数: 需要分词的字符串:cut_all 参数用来控制是否采用全模式:HMM 参数用来控制是否使用 HMM 模型 jieba.cut_for_search 方法接受两个参数:需要分词的字符串:是否使用 HMM 模型.该方法适合用于搜索引擎构建倒排索引的分