You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.0 KiB
168 lines
4.0 KiB
package gse |
|
|
|
import ( |
|
"bytes" |
|
"fmt" |
|
) |
|
|
|
// ToString segments to string 输出分词结果为字符串 |
|
// |
|
// 有两种输出模式,以 "中华人民共和国" 为例 |
|
// |
|
// 普通模式(searchMode=false)输出一个分词 "中华人民共和国/ns " |
|
// 搜索模式(searchMode=true) 输出普通模式的再细致切分: |
|
// "中华/nz 人民/n 共和/nz 国/n 共和国/ns 人民共和国/nt 中华人民共和国/ns " |
|
// |
|
// 默认 searchMode=false |
|
// 搜索模式主要用于给搜索引擎提供尽可能多的关键字,详情请见 Token 结构体的注释。 |
|
func ToString(segs []Segment, searchMode ...bool) (output string) { |
|
var mode bool |
|
if len(searchMode) > 0 { |
|
mode = searchMode[0] |
|
} |
|
|
|
if mode { |
|
for _, seg := range segs { |
|
output += tokenToString(seg.token) |
|
} |
|
return |
|
} |
|
|
|
for _, seg := range segs { |
|
output += fmt.Sprintf("%s/%s ", |
|
textSliceToString(seg.token.text), seg.token.pos) |
|
} |
|
return |
|
} |
|
|
|
func tokenToBytes(token *Token) (output []byte) { |
|
for _, s := range token.segments { |
|
output = append(output, tokenToBytes(s.token)...) |
|
} |
|
output = append(output, []byte(fmt.Sprintf("%s/%s ", |
|
textSliceToString(token.text), token.pos))...) |
|
|
|
return |
|
} |
|
|
|
func tokenToString(token *Token) (output string) { |
|
hasOnlyTerminalToken := true |
|
for _, s := range token.segments { |
|
if len(s.token.segments) > 1 || IsJp(string(s.token.text[0])) { |
|
hasOnlyTerminalToken = false |
|
} |
|
|
|
if !hasOnlyTerminalToken { |
|
if s != nil { |
|
output += tokenToString(s.token) |
|
} |
|
} |
|
} |
|
|
|
output += fmt.Sprintf("%s/%s ", textSliceToString(token.text), token.pos) |
|
return |
|
} |
|
|
|
// ToSlice segments to slice 输出分词结果到一个字符串 slice |
|
// |
|
// 有两种输出模式,以 "中华人民共和国" 为例 |
|
// |
|
// 普通模式(searchMode=false)输出一个分词"[中华人民共和国]" |
|
// 搜索模式(searchMode=true) 输出普通模式的再细致切分: |
|
// "[中华 人民 共和 国 共和国 人民共和国 中华人民共和国]" |
|
// |
|
// 默认 searchMode=false |
|
// 搜索模式主要用于给搜索引擎提供尽可能多的关键字,详情请见Token结构体的注释。 |
|
func ToSlice(segs []Segment, searchMode ...bool) (output []string) { |
|
var mode bool |
|
if len(searchMode) > 0 { |
|
mode = searchMode[0] |
|
} |
|
|
|
if mode { |
|
for _, seg := range segs { |
|
output = append(output, tokenToSlice(seg.token)...) |
|
} |
|
return |
|
} |
|
|
|
for _, seg := range segs { |
|
output = append(output, seg.token.Text()) |
|
} |
|
return |
|
} |
|
|
|
func tokenToSlice(token *Token) (output []string) { |
|
hasOnlyTerminalToken := true |
|
for _, s := range token.segments { |
|
if len(s.token.segments) > 1 || IsJp(string(s.token.text[0])) { |
|
hasOnlyTerminalToken = false |
|
} |
|
|
|
if !hasOnlyTerminalToken { |
|
output = append(output, tokenToSlice(s.token)...) |
|
} |
|
} |
|
|
|
output = append(output, textSliceToString(token.text)) |
|
return output |
|
} |
|
|
|
// 将多个字元拼接一个字符串输出 |
|
func textToString(text []Text) string { |
|
var output string |
|
for _, word := range text { |
|
output += string(word) |
|
} |
|
return output |
|
} |
|
|
|
// 将多个字元拼接一个字符串输出 |
|
func textSliceToString(text []Text) string { |
|
return Join(text) |
|
} |
|
|
|
// 返回多个字元的字节总长度 |
|
func textSliceByteLen(text []Text) (length int) { |
|
for _, word := range text { |
|
length += len(word) |
|
} |
|
return |
|
} |
|
|
|
func textSliceToBytes(text []Text) []byte { |
|
var buf bytes.Buffer |
|
for _, word := range text { |
|
buf.Write(word) |
|
} |
|
return buf.Bytes() |
|
} |
|
|
|
// Join is better string splicing |
|
func Join(text []Text) string { |
|
switch len(text) { |
|
case 0: |
|
return "" |
|
case 1: |
|
return string(text[0]) |
|
case 2: |
|
// Special case for common small values. |
|
// Remove if github.com/golang/go/issues/6714 is fixed |
|
return string(text[0]) + string(text[1]) |
|
case 3: |
|
// Special case for common small values. |
|
// Remove if #6714 is fixed |
|
return string(text[0]) + string(text[1]) + string(text[2]) |
|
} |
|
n := 0 |
|
for i := 0; i < len(text); i++ { |
|
n += len(text[i]) |
|
} |
|
|
|
b := make([]byte, n) |
|
bp := copy(b, text[0]) |
|
for _, str := range text[1:] { |
|
bp += copy(b[bp:], str) |
|
} |
|
return string(b) |
|
}
|
|
|