mirror of
https://github.com/fumiama/jieba.git
synced 2026-06-05 08:40:36 +08:00
247 lines
7.2 KiB
Markdown
247 lines
7.2 KiB
Markdown
结巴分词Go版 jiebago
|
||
===================
|
||
|
||
[](https://travis-ci.org/wangbin/jiebago)
|
||
|
||
[结巴分词](https://github.com/fxsjy/jieba)是[@fxsjy](https://github.com/fxsjy)用Python编写的中文分词组件,jiebago是结巴分词的Go语言实现,目前已经实现的功能包括:三种模式分词、自定义词典、关键词提取和词性标注。
|
||
|
||
|
||
安装
|
||
=====
|
||
|
||
go get github.com/wangbin/jiebago
|
||
|
||
分词
|
||
=====
|
||
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/wangbin/jiebago"
|
||
)
|
||
|
||
var sentence = "我来到北京清华大学"
|
||
|
||
func print(ch chan string) {
|
||
for word := range ch {
|
||
fmt.Printf("%s / ", word)
|
||
}
|
||
fmt.Println()
|
||
fmt.Println()
|
||
}
|
||
|
||
func main() {
|
||
jiebago.SetDictionary("/Path/to/dictionary/file") // 设定字典
|
||
fmt.Print("【全模式】: ")
|
||
print(jiebago.Cut(sentence, true, true))
|
||
fmt.Print("【精确模式】: ")
|
||
print(jiebago.Cut(sentence, false, true))
|
||
fmt.Print("【新词识别】:")
|
||
print(jiebago.Cut("他来到了网易杭研大厦", false, true))
|
||
fmt.Print("【搜索引擎模式】:")
|
||
print(jiebago.CutForSearch("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", true))
|
||
}
|
||
|
||
使用结巴分词自带的[词典文件](https://github.com/fxsjy/jieba/blob/master/jieba/dict.txt),输出结果如下:
|
||
|
||
【全模式】: 我 / 来到 / 北京 / 清华 / 清华大学 / 华大 / 大学 /
|
||
|
||
【精确模式】: 我 / 来到 / 北京 / 清华大学 /
|
||
|
||
【新词识别】:他 / 来到 / 了 / 网易 / 杭研 / 大厦 /
|
||
|
||
【搜索引擎模式】:小明 / 硕士 / 毕业 / 于 / 中国 / 科学 / 学院 / 科学院 / 中国科学院 / 计算 / 计算所 / , / 后 / 在 / 日本 / 京都 / 大学 / 日本京都大学 / 深造 /
|
||
|
||
添加自定义词典
|
||
=============
|
||
|
||
var sentence = "李小福是创新办主任也是云计算方面的专家"
|
||
fmt.Print("Before: ")
|
||
print(jiebago.Cut(sentence, false, true))
|
||
jiebago.LoadUserDict("/Path/to/user/dictionary/file")
|
||
fmt.Print("After: ")
|
||
print(jiebago.Cut(sentence, false, true))
|
||
|
||
使用结巴分词自带的[词典文件](https://github.com/fxsjy/jieba/blob/master/jieba/dict.txt)和[用户自定义词典文件](https://github.com/fxsjy/jieba/blob/master/test/userdict.txt),结果输出如下:
|
||
|
||
Before: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /
|
||
|
||
After: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
|
||
|
||
关键词提取
|
||
========
|
||
|
||
需要先安装analyse模块:
|
||
|
||
go get github.com/wangbin/jiebago/analyse
|
||
|
||
示例代码:
|
||
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/wangbin/jiebago/analyse"
|
||
)
|
||
|
||
var sentence = "这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱Python和C++。"
|
||
|
||
func main() {
|
||
analyse.SetDictionary("/Path/to/dictionary/file")
|
||
analyse.SetIdf("/Path/to/idf/file")
|
||
for _, ww := range analyse.ExtractTags(sentence, 20) {
|
||
fmt.Printf("%s / ", ww.Word)
|
||
}
|
||
}
|
||
|
||
输出:
|
||
|
||
Python / C++ / 伸手不见五指 / 孙悟空 / 黑夜 / 北京 / 这是 / 一个 /
|
||
|
||
## 基于TextRank算法的关键词抽取实现
|
||
|
||
示例代码:
|
||
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/wangbin/jiebago/analyse"
|
||
)
|
||
|
||
func main() {
|
||
sentence := "此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚 置业注册资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"
|
||
|
||
analyse.SetDictionary("/Path/to/dictionary/file")
|
||
result := analyse.TextRank(sentence, 10)
|
||
for _, wt := range result {
|
||
fmt.Printf("%s %f\n", wt.Word, wt.Freq)
|
||
}
|
||
}
|
||
|
||
输出:
|
||
|
||
吉林 1.000000
|
||
欧亚 0.878078
|
||
置业 0.562048
|
||
实现 0.520906
|
||
收入 0.384284
|
||
增资 0.360591
|
||
子公司 0.353132
|
||
城市 0.307509
|
||
全资 0.306324
|
||
商业 0.306138
|
||
|
||
词性标注
|
||
=======
|
||
|
||
需要先安装posseg模块:
|
||
|
||
go get github.com/wangbin/jiebago/posseg
|
||
|
||
示例代码:
|
||
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/wangbin/jiebago"
|
||
"github.com/wangbin/jiebago/posseg"
|
||
)
|
||
|
||
var sentence = "我爱北京天安门"
|
||
|
||
func main() {
|
||
posseg.SetDictionary("/Path/to/dictionary/file")
|
||
for wt := range posseg.Cut(sentence, true) {
|
||
fmt.Printf("%s %s\n", wt.Word, wt.Tag)
|
||
}
|
||
}
|
||
|
||
输出:
|
||
|
||
我 r
|
||
爱 v
|
||
北京 ns
|
||
天安门 ns
|
||
|
||
并行分词
|
||
=======
|
||
|
||
因为Go有强大的goroutine特性,并行分词实现起来非常简单,所以并没有内置到jiebaogo中,而是由使用者自己实现,下面是一个简单的例子:
|
||
|
||
lineCount := 0
|
||
inputFile, _ := os.Open(FileName)
|
||
defer inputFile.Close()
|
||
scanner := bufio.NewScanner(inputFile)
|
||
ch := make(chan []string, 1)
|
||
for scanner.Scan() {
|
||
line := scanner.Text()
|
||
fileLength += len([]rune(line))
|
||
lineCount += 1
|
||
go func() {
|
||
for word := range jiebago.Cut(line, false, true) {
|
||
ch <- word
|
||
}
|
||
}()
|
||
}
|
||
if err := scanner.Err(); err != nil {
|
||
panic(err)
|
||
}
|
||
outputFile, _ := os.OpenFile("parallelCut.log", os.O_CREATE|os.O_WRONLY, 0600)
|
||
defer outputFile.Close()
|
||
writer := bufio.NewWriter(outputFile)
|
||
results := make([]string, 0)
|
||
for {
|
||
if lineCount <= 0 {
|
||
break
|
||
}
|
||
result, ok := <-ch
|
||
if ok {
|
||
results = append(results, result...)
|
||
lineCount -= 1
|
||
}
|
||
}
|
||
writer.WriteString(strings.Join(results, "/ "))
|
||
writer.Flush()
|
||
|
||
|
||
Tokenize
|
||
=========
|
||
|
||
var sentence = "永和服装饰品有限公司"
|
||
// 默认模式
|
||
for _, token := range jiebago.Tokenize(sentence, "default", true) {
|
||
fmt.Printf("word %s\t\t start: %d \t\t end:%d\n", token.Word, token.Start, token.End)
|
||
}
|
||
// 搜索模式
|
||
for _, token := range jiebago.Tokenize(sentence, "search", true) {
|
||
fmt.Printf("word %s\t\t start: %d \t\t end:%d\n", token.Word, token.Start, token.End)
|
||
}
|
||
|
||
输出结果:
|
||
|
||
word 永和 start: 0 end:2
|
||
word 服装 start: 2 end:4
|
||
word 饰品 start: 4 end:6
|
||
word 有限公司 start: 6 end:10
|
||
|
||
word 永和 start: 0 end:2
|
||
word 服装 start: 0 end:2
|
||
word 饰品 start: 0 end:2
|
||
word 有限 start: 0 end:2
|
||
word 公司 start: 2 end:4
|
||
word 有限公司 start: 0 end:4
|
||
|
||
分词速度
|
||
=======
|
||
|
||
- 2MB / Second in Full Mode
|
||
- 700KB / Second in Default Mode
|
||
- Test Env: AMD Phenom(tm) II X6 1055T CPU @ 2.8GHz; 《金庸全集》
|
||
|
||
许可证
|
||
======
|
||
MIT: http://wangbin.mit-license.org
|