-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathREADME.txt
154 lines (98 loc) · 5.61 KB
/
README.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
xsplit是一个PHP扩展,提供基于MMSEG算法的分词功能。目前只在linux下测试并部署过,希望有朋友可以帮忙编译提供windows下的dll。
xsplit主要有以下几个函数:
bool xs_build ( array $words, string $dict_file )
resource xs_open (string $dict_file [, bool $persistent])
array xs_split ( string $text [, int $split_method = 1 [, resource $dictionary_identifier ] ] )
mixed xs_search ( string $text [, int $search_method [, $dictionary_identifer ] ] )
string xs_simhash( array $tokens [, bool $rawoutput] )
int xs_hdist( string $simhash1, $string $simhash2)
安装过程与一般的PHP扩展安装一样
$phpize
$./configure --with-php-config=/path/to/php-config
$make
$make install
php.ini中可以设置以下参数:
xsplit.allow_persisten = On
xsplit.max_dicts = 5
xsplit.max_persistent = 3
xsplit.default_dict_file = /home/xdict
xsplit.allow_persistent 是否允许加载持久词典
xsplit.max_dicts 允许同时打开的最大词典数目
xsplit.max_persistent 允许同时打开的最大持久词典数目
xsplit.default_dict_file 默认的词典,没有指定词典时会调用此词典
源码中有一个utils目录,包含
make_dict.php 提供命令行方式创建词典
xsplit.php 一个简单的示例文件
xdict_example.txt 一个文本词库的格式示例
make_dict.php的使用例子如下:
$php make_dict.php ./xdict_example.txt ./xdict.db
文本词库的格式请参考xdict_example.txt
bool xs_build (array $words, string $dict_file)
从$words数组建立名称为$dict_file的词典,若成功则返回true。$words数组的格式请参考示例,key为词语,value为词频。
string xs_simhash( array $tokens [, bool $rawoutput] )
计算simhash。由于
例子如下:
<?php
$dict_file='dict.db';
$dwords['美丽']=100;
$dwords['蝴蝶']=100;
$dwords['永远']=100;
$dwords['心中']=100;
$dwords['翩翩']=100;
$dwords['飞舞']=100;
$dwords['翩翩飞舞']=10;
if(!xs_build($dwords, $dict_file)) {
die('建立词典失败!');
}
resource xs_open (string $dict_file bool $persistent?)
打开一个词典文件,并返回一个resource类型的identifier。$persistent可以指定是否是持久化词典,持久化词典在这里可以理解为词典资源生命周期的不同,一般情况下$persistent=true或者默认缺省即可。在进行分词的时候,可以指定不同的词典。
$dict_file_1 = 'xdcit.db';
$dict_file_2 = 'mydict.db';
$dict1 = xs_open($dict_file);
xs_open($dict_file);
array xs_split ( string $text int $split_method = 1 [, resource $dictionary_identifier ] ? )
对文本进行分词,可以指定分词方法和词典。分词方法目前有两种,一个是MMSEG算法(默认),一个是正向最大匹配,分别用常量 XS_SPLIT_MMSEG和XS_SPLIT_MMFWD表示。返回值是一个数组,包含所有切分好的词语。如果不指定词典,最后一次打开的词典将被使用。
<?php
$text="那只美丽的蝴蝶永远在我心中翩翩飞舞着。";
$dict_file = 'xdict.db';
$dict_res = xs_open($dict_file);
$words = xs_split($text); /* 此处没有指定词典资源,默认使用最后一次打开的词典 */
$words1 = xs_split($text, XS_SPLIT_MMSEG, $dict_res);
mixed xs_search ( string $text [, int $search_method $dictionary_identifer ? ] ) 基于双数组trie树提供的一些功能,$search_method有四个常量表示:
XS_SEARCH_CP : darts的commonPrefixSearch封装,如果没有找到,返回false。
XS_SEARCH_EM : darts的exactMatchSearch封装,如果没有找到,返回false。
XS_SEARCH_ALL_SIMPLE : 按照词典返回所有词语词频总和,一个INT型数值。
XS_SEARCH_ALL_DETAIL : 按照词典返回所有词典的词频,并以数组形式返回每一个词语的详细统计。
XS_SEARCH_ALL_INDICT : 返回词典里的词语,可以去掉标点、特殊符号之类的,但是连续的数字和字母会默认自动返回(目前采用MMSEG算法,hard coding的,有需要可以改源码)。
如果不指定词典,最后一次打开的词典将被使用。
<?php
xs_open($dict_file);
$text="那只美丽的蝴蝶永远在我心中翩翩飞舞着。";
$word='翩翩飞舞';
$result=xs_search($word, XS_SEARCH_CP); /* common prefix search */
var_dump($result);
$result=xs_search($word, XS_SEARCH_EM); /* exact match search */
var_dump($result);
$result=xs_search($text, XS_SEARCH_ALL_SIMPLE);
var_dump($result);
$result=xs_search($text, XS_SEARCH_ALL_DETAIL);
var_dump($result);
string xs_simhash( array $tokens [, bool $rawoutput] )
计算simhash。这里所有token权重都是1,$tokens的例子如array('在', '这个', '世界')。$rawoput默认为0,即返回simhash的hex string形式,如md5, sha1函数一样;如过$rawoput为真,返回一个8字节的字符串,这个字符串实际上是一个64 bits的整型数,uint64_t,在一些特殊情况下可以用到。
int xs_hdist( string $simhash1, $string $simhash2)
计算汉明距离。
<?php
xs_open('xdict');
$text1="那只美丽的蝴蝶永远在我心中翩翩飞舞着。";
$text2="那只美丽的蝴蝶永远在我心中翩翩飞舞。";
$tokens1=xs_search($text1, XS_SEARCH_ALL_INDICT); /* 去掉标点等特殊符号,经过实验,计算simhash时,一些标点、换行、特殊符号等对效果影响较大 */
$tokens2=xs_search($text2, XS_SEARCH_ALL_INDICT);
$simhash1=xs_simhash($tokens1);
$simhash2=xs_simhash($tokens2);
echo "simhash1 is {$simhash1}\n";
echo "simhash2 is {$simhash2}\n";
$hamming_dist=xs_hdist($simhash1, $simhash2);
echo "bit-wise format:\n";
echo decbin(hexdec($simhash1)), "\n";
echo decbin(hexdec($simhash2)), "\n";
echo "hamming distance is {$hamming_dist}\n";