分词

jiebaR提供了四种分词模式,可以通过worker()来初始化分词引擎,使用segment()进行分词。

cc = worker()
cc["这是一段测试文本!"]  ### `<=` 或 `[` 为分词运算符

## 相当于 segment( "这是一段测试文本!" , mixseg ) 
## 或者 mixseg <= "这是一段测试文本!"
[1] "这是" "一段" "测试" "文本"

支持对文件进行分词:

cc["./temp.dat"]  ### 自动判断输入文件编码模式,默认文件输出在同目录下。

## segment( "./temp.dat" , mixseg )

分词引擎介绍

在加载分词引擎时,可以自定义词库路径,同时可以启动不同的引擎:

最大概率法(MPSegment),负责根据Trie树构建有向无环图和进行动态规划算法,是分词算法的核心。

隐式马尔科夫模型(HMMSegment)是根据基于人民日报等语料库构建的HMM模型来进行分词,主要算法思路是根据(B,E,M,S)四个状态来代表每个字的隐藏状态。 HMM模型由dict/hmm_model.utf8提供。分词算法即viterbi算法。

混合模型(MixSegment)是四个分词引擎里面分词效果较好的类,结它合使用最大概率法和隐式马尔科夫模型。

索引模型(QuerySegment)先使用混合模型进行切词,再对于切出来的较长的词,枚举句子中所有可能成词的情况,找出词库里存在。

cc2 = worker(type  = "mix", dict = "dict/jieba.dict.utf8",
                 hmm   = "dict/hmm_model.utf8",  
                 user  = "dict/test.dict.utf8",
                 detect=T,      symbol = F,
                 lines = 1e+05, output = NULL
                 ) 
cc2   ### 输出worker的设置
Worker Type:  Mix Segment

Detect Encoding :  TRUE
Default Encoding:  UTF-8
Keep Symbols    :  FALSE
Output Path     :  
Write File      :  TRUE
Max Read Lines  :  1e+05

Fixed Model Components:  

$dict
[1] "dict/jieba.dict.utf8"

$hmm
[1] "dict/hmm_model.utf8"

$user
[1] "dict/test.dict.utf8"

$detect $encoding $symbol $output $write $lines $bylines can be reset.

可以通过R语言常用的 $符号重设一些worker的参数设置,如 WorkerName$symbol = T,在输出中保留标点符号。一些参数在初始化的时候已经确定,无法修改, 可以通过WorkerName$PrivateVarible来获得这些信息。

cc$encoding

cc$detect = F

# 设置分行输出,而不是将所有分词文本输出在一行。
cc$bylines = T

词典介绍

可以自定义用户词库,推荐使用[深蓝词库转换]构建分词词库,它可以快速地将搜狗细胞词库等输入法词库转换为jiebaR的词库格式。

show_dictpath()     ### 显示默认的词典路径

系统词典共有三列,第一列为词项,第二列为词频,第三列为词性标记。

用户词典有两列,第一列为词项,第二列为词性标记。用户词库默认词频为系统词库中的最大词频,如需自定义词频率,可将新词添加入系统词库中。

词典中的词性标记采用ictclas的标记方法。

新版更新内容

v0.5 更新内容

一、 增加:过滤分词结果的方法 filter_segment(),类似于关键词提取中使用的停止词功能。TIPS: 最新版本 v0.7,对于分词 worker 可以直接在 worker() 函数中使用停止词库。

cutter = worker()
result_segment = cutter["我是测试文本,用于测试过滤分词效果。"]
result_segment
[1] "我"   "是"   "测试" "文本" "用于" "测试" "过滤" "分词" "效果"
filter_words = c("我","你","它","大家")
filter_segment(result_segment,filter_words)
[1] "是"   "测试" "文本" "用于" "测试" "过滤" "分词" "效果"

二、 增强:分词支持 “向量文本输入 => list输出” 与 “按行输入文件 => list输出”

通过 bylines 选项控制是否按行输出,默认值为bylines = FALSE

cutter = worker(bylines = TRUE)
cutter
Worker Type:  Mix Segment

Detect Encoding :  TRUE
Default Encoding:  UTF-8
Keep Symbols    :  FALSE
Output Path     :  
Write File      :  TRUE
By Lines        :  TRUE
Max Read Lines  :  1e+05
....
cutter[c("这是非常的好","大家好才是真的好")]
[[1]]
[1] "这是" "非常" "的"   "好"  

[[2]]
[1] "大家" "好"   "才"   "是"   "真的" "好"
cutter$write = FALSE

# 输入文件文本是:
# 这是一个分行测试文本
# 用于测试分行的输出结果

cutter["files.path"]
[[1]]
[1] "这是" "一个" "分行" "测试" "文本" 

[[2]]
[1] "用于" "测试" "分行"   "的" "输出" "结果"
# 按行写入文件
cutter$write = TRUE
cutter$bylines = TRUE

三、增加:可以使用 vector_keywords 对一个文本向量提取关键词。

keyworker = worker("keywords")
cutter = worker()
vector_keywords(cutter["这是一个比较长的测试文本。"],keyworker)
8.94485 7.14724 4.77176 4.29163 2.81755 
 "文本"  "测试"  "比较"  "这是"  "一个"
vector_keywords(c("今天","天气","真的","十分","不错","的","感觉"),keyworker)
6.45994 6.18823 5.64148 5.63374 4.99212 
 "天气"  "不错"  "感觉"  "真的"  "今天"

四、增加: write = "NOFILE" 选项,不检查文件路径。

cutter = worker(write = "NOFILE",symbol = TRUE)
cutter["./test.txt"] # 目录下有test.txt 文件
[1] "."    "/"    "test" "."    "txt"

v0.6 更新内容

一、增强:分词、词性标注时,增加过滤停止词功能,默认的 STOPPATH 路径将不会被使用,不默认使用停止词库。需要自定义其他路径,停止词才能在分词时使用。停止词库的编码需要为 UTF-8 格式,否则读入的数据可能为乱码。

cutter = worker()
cutter
# Worker Type:  Mix Segment

# Fixed Model Components:  
# ...

# $stop_word
# NULL

# $timestamp
# [1] 1442716020

# $detect $encoding $symbol $output $write $lines $bylines can be reset
cutter = worker(stop_word="../stop.txt")
cutter
# Worker Type:  Mix Segment

# Fixed Model Components:  
# ...

# $stop_word
# [1] "../stop.txt"

# $timestamp
# [1] 1442716020

# $detect $encoding $symbol $output $write $lines $bylines can be reset.

二、增强:分词时,symbol = FALSE 时,2010-10-1220.2 类似格式的文本中的符号会被保留。单纯的符号将会被过滤。

cutter = worker()
cutter$symbol = F
cutter["2010-10-10"]

三、增加:freq() 进行词频统计,输入内容为文本向量,输出内容为文本频率的数据框。

freq(c("测试", "测试", "文本"))

四、增强:filter_segment() 现在可以输入以文本向量为内容的 list。

cutter = worker()
result_segment = list(    cutter["我是测试文本,用于测试过滤分词效果。"], 
                      cutter["我是测试文本,用于测试过滤分词效果。"])
result_segment
filter_words  = c("我","你","它","大家")
filter_segment(result_segment,filter_words)

五、增加:filter_segment() 增加unit 选项。

处理文本时,停止词数量较多时 ,生成的正则表达式超过 265 bytes ,R 可能会报错。通过 unit 选项可以对于较多的停止词分多次处理,控制每次识别的停止词的个数,控制生成的正则表达式的长度。unit 默认值为 50,一般不需要修改 unit 的默认值。

help(regex)

Long regular expressions may or may not be accepted: the POSIX standard only requires up to 256 bytes.

filter_segment(result_segment,filter_words) # 使用默认值,一般不需要修改。

filter_segment(result_segment,filter_words, unit=10) # 如果你有较多文本长度很长的停止词词条

v0.7 更新内容

一、增加:get_tuple() 返回分词结果中 n 个连续的字符串组合的频率情况,可以作为自定义词典的参考。

get_tuple(c("sd","sd","sd","rd"),size=3)
#     name count
# 4   sdsd     2
# 1   sdrd     1
# 2 sdsdrd     1
# 3 sdsdsd     1
get_tuple(list(
        c("sd","sd","sd","rd"),
        c("新浪","微博","sd","rd"),
    ), size = 2)
#       name count
# 2     sdrd     2
# 3     sdsd     2
# 1   微博sd     1
# 4 新浪微博     1