本文實(shí)例講述了php實(shí)現(xiàn)的中文分詞類。分享給大家供大家參考,具體如下:
具體代碼如下:
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
|
class Segmentation { var $options = array ( 'lowercase' => TRUE, 'segment_english' => FALSE); var $dict_name = 'Unknown' ; var $dict_words = array (); function setLowercase( $value ) { if ( $value ) { $this ->options[ 'lowercase' ] = TRUE; } else { $this ->options[ 'lowercase' ] = FALSE; } return TRUE; } function setSegmentEnglish( $value ) { if ( $value ) { $this ->options[ 'segment_english' ] = TRUE; } else { $this ->options[ 'segment_english' ] = FALSE; } return TRUE; } function load( $dict_file ) { if (! file_exists ( $dict_file )) { return FALSE; } $fp = fopen ( $dict_file , 'r' ); $temp = fgets ( $fp , 1024); if ( $temp === FALSE) { return FALSE; } else { if ( strpos ( $temp , "\t" ) !== FALSE) { list ( $dict_type , $dict_name ) = explode ( "\t" , trim( $temp )); } else { $dict_type = trim( $temp ); $dict_name = 'Unknown' ; } $this ->dict_name = $dict_name ; if ( $dict_type !== 'DICT_WORD_W' ) { return FALSE; } } while (! feof ( $fp )) { $this ->dict_words[rtrim( fgets ( $fp , 32))] = 1; } fclose( $fp ); return TRUE; } function getDictName() { return $this ->dict_name; } function segmentString( $str ) { if ( count ( $this ->dict_words) === 0) { return FALSE; } $lines = explode ( "\n" , $str ); return $this ->_segmentLines( $lines ); } function segmentFile( $filename ) { if ( count ( $this ->dict_words) === 0) { return FALSE; } $lines = file( $filename ); return $this ->_segmentLines( $lines ); } function _segmentLines( $lines ) { $contents_segmented = '' ; foreach ( $lines as $line ) { $contents_segmented .= $this ->_segmentLine(rtrim( $line )) . " \n" ; } do { $contents_segmented = str_replace ( ' ' , ' ' , $contents_segmented ); } while ( strpos ( $contents_segmented , ' ' ) !== FALSE); return $contents_segmented ; } function _segmentLine( $str ) { $str_final = '' ; $str_array = array (); $str_length = strlen ( $str ); if ( $str_length > 0) { if (ord( $str { $str_length -1}) >= 129) { $str .= ' ' ; } } for ( $i =0; $i < $str_length ; $i ++) { if (ord( $str { $i }) >= 129) { $str_array [] = $str { $i } . $str { $i +1}; $i ++; } else { $str_tmp = $str { $i }; for ( $j = $i +1; $j < $str_length ; $j ++) { if (ord( $str { $j }) < 129) { $str_tmp .= $str { $j }; } else { break ; } } $str_array [] = array ( $str_tmp ); $i = $j - 1; } } $pos = count ( $str_array ); while ( $pos > 0) { $char = $str_array [ $pos -1]; if ( is_array ( $char )) { $str_final_tmp = $char [0]; if ( $this ->options[ 'segment_english' ]) { $str_final_tmp = preg_replace( "/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f]+)/" , " $1 " , $str_final_tmp ); $str_final_tmp = preg_replace( "/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])/" , " $1 $2 " , $str_final_tmp ); } if ( $this ->options[ 'lowercase' ]) { $str_final_tmp = strtolower ( $str_final_tmp ); } $str_final = " $str_final_tmp$str_final" ; $pos --; } else { $word_found = 0; $word_array = array (0 => '' ); if ( $pos < 4) { $word_temp = $pos + 1; } else { $word_temp = 5; } for ( $i =1; $i < $word_temp ; $i ++) { $word_array [ $i ] = $str_array [ $pos - $i ] . $word_array [ $i -1]; } for ( $i =( $word_temp -1); $i >1; $i --) { if ( array_key_exists ( $word_array [ $i ], $this ->dict_words)) { $word_found = $i ; break ; } } if ( $word_found ) { $str_final = " $word_array[$word_found]$str_final" ; $pos = $pos - $word_found ; } else { $str_final = " $char$str_final" ; $pos --; } } } return $str_final ; } } ?> |
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。