mirror of
https://github.com/mindoc-org/mindoc.git
synced 2025-05-11 01:17:48 +08:00
94 lines
2.4 KiB
Go
94 lines
2.4 KiB
Go
package sego
|
||
|
||
import (
|
||
"bytes"
|
||
"fmt"
|
||
)
|
||
|
||
// 输出分词结果为字符串
|
||
//
|
||
// 有两种输出模式,以"中华人民共和国"为例
|
||
//
|
||
// 普通模式(searchMode=false)输出一个分词"中华人民共和国/ns "
|
||
// 搜索模式(searchMode=true) 输出普通模式的再细致切分:
|
||
// "中华/nz 人民/n 共和/nz 共和国/ns 人民共和国/nt 中华人民共和国/ns "
|
||
//
|
||
// 搜索模式主要用于给搜索引擎提供尽可能多的关键字,详情请见Token结构体的注释。
|
||
func SegmentsToString(segs []Segment, searchMode bool) (output string) {
|
||
if searchMode {
|
||
for _, seg := range segs {
|
||
output += tokenToString(seg.token)
|
||
}
|
||
} else {
|
||
for _, seg := range segs {
|
||
output += fmt.Sprintf(
|
||
"%s/%s ", textSliceToString(seg.token.text), seg.token.pos)
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
func tokenToString(token *Token) (output string) {
|
||
for _, s := range token.segments {
|
||
output += tokenToString(s.token)
|
||
}
|
||
output += fmt.Sprintf("%s/%s ", textSliceToString(token.text), token.pos)
|
||
return
|
||
}
|
||
|
||
// 输出分词结果到一个字符串slice
|
||
//
|
||
// 有两种输出模式,以"中华人民共和国"为例
|
||
//
|
||
// 普通模式(searchMode=false)输出一个分词"[中华人民共和国]"
|
||
// 搜索模式(searchMode=true) 输出普通模式的再细致切分:
|
||
// "[中华 人民 共和 共和国 人民共和国 中华人民共和国]"
|
||
//
|
||
// 搜索模式主要用于给搜索引擎提供尽可能多的关键字,详情请见Token结构体的注释。
|
||
|
||
func SegmentsToSlice(segs []Segment, searchMode bool) (output []string) {
|
||
if searchMode {
|
||
for _, seg := range segs {
|
||
output = append(output, tokenToSlice(seg.token)...)
|
||
}
|
||
} else {
|
||
for _, seg := range segs {
|
||
output = append(output, seg.token.Text())
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
func tokenToSlice(token *Token) (output []string) {
|
||
for _, s := range token.segments {
|
||
output = append(output, tokenToSlice(s.token)...)
|
||
}
|
||
output = append(output, textSliceToString(token.text))
|
||
return output
|
||
}
|
||
|
||
// 将多个字元拼接一个字符串输出
|
||
func textSliceToString(text []Text) string {
|
||
var output string
|
||
for _, word := range text {
|
||
output += string(word)
|
||
}
|
||
return output
|
||
}
|
||
|
||
// 返回多个字元的字节总长度
|
||
func textSliceByteLength(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()
|
||
}
|