分词
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-12
,20.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