本文實例講述了php實現(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 ; } } ?> |
希望本文所述對大家PHP程序設計有所幫助。