token.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package gse
  2. // Text 字串类型,可以用来表达
  3. // 1. 一个字元,比如 "中" 又如 "国", 英文的一个字元是一个词
  4. // 2. 一个分词,比如 "中国" 又如 "人口"
  5. // 3. 一段文字,比如 "中国有十三亿人口"
  6. type Text []byte
  7. // Token 一个分词
  8. type Token struct {
  9. // 分词的字串,这实际上是个字元数组
  10. text []Text
  11. // 分词在语料库中的词频
  12. frequency int
  13. // log2(总词频/该分词词频),这相当于 log2(1/p(分词)),用作动态规划中
  14. // 该分词的路径长度。求解 prod(p(分词)) 的最大值相当于求解
  15. // sum(distance(分词)) 的最小值,这就是“最短路径”的来历。
  16. distance float32
  17. // 词性标注
  18. pos string
  19. // 该分词文本的进一步分词划分,见 Segments 函数注释。
  20. segments []*Segment
  21. }
  22. // Text 返回分词文本
  23. func (token *Token) Text() string {
  24. return textSliceToString(token.text)
  25. }
  26. // Frequency 返回分词在语料库中的词频
  27. func (token *Token) Frequency() int {
  28. return token.frequency
  29. }
  30. // Pos 返回分词词性标注
  31. func (token *Token) Pos() string {
  32. return token.pos
  33. }
  34. // Segments 该分词文本的进一步分词划分,比如 "中华人民共和国中央人民政府" 这个分词
  35. // 有两个子分词 "中华人民共和国 " 和 "中央人民政府"。子分词也可以进一步有子分词
  36. // 形成一个树结构,遍历这个树就可以得到该分词的所有细致分词划分,这主要
  37. // 用于搜索引擎对一段文本进行全文搜索。
  38. func (token *Token) Segments() []*Segment {
  39. return token.segments
  40. }
  41. // Equals compare str split tokens
  42. func (token *Token) Equals(str string) bool {
  43. tokenLen := 0
  44. for _, t := range token.text {
  45. tokenLen += len(t)
  46. }
  47. if tokenLen != len(str) {
  48. return false
  49. }
  50. bytStr := []byte(str)
  51. index := 0
  52. for i := 0; i < len(token.text); i++ {
  53. textArray := []byte(token.text[i])
  54. for j := 0; j < len(textArray); j++ {
  55. if textArray[j] != bytStr[index] {
  56. index = index + 1
  57. return false
  58. }
  59. index = index + 1
  60. }
  61. }
  62. return true
  63. }