R语言与自然语言处理 中文分词与标注

原文学习链接

分词

直接分词

cn = “我爱中国”
worker() -> wk
**segment(**cn,wk)
[1] “我” “爱” “中国”

词典

查看路径

show_dictpath()
[1] “C:/Users/comma/Documents/R/win-library/3.6/jiebaRD/dict”

对“user.dict.utf8”这个文件进行更改。
使用记事本打开,然后在最后补上词条。
再来进行分词(不过我们要重新定义worker才能更新)

获取更多词典

下面这一段没有懂。
所以我们知道我们想要更多的词典,得到海量能够跟得上时代发展的词。有什么办法?我认为能够得到大量新词的地方,有两个:1.搜索引擎;2.输入法。搜狗输入法在搜狗词胞库中提供了大量的词典(https://pinyin.sogou.com/dict/),大家可以自由下载。不过下载的文件格式是以“.scel”为后缀的,双击一般就给我们的输入法补充了一个词库,但是没法让我们的jiebaR直接利用。幸好jiebaR的作者为我们提供了转格式工具,能够把scel文件直接转化为.utf8格式的文本文件,从而直接对这些词进行利用。具体内容可以参照https://github.com/qinwf/cidian,这里给出懒人加载的版本。

1p_load(devtools,stringi,pbapply,Rcpp,RcppProgress)
2install_github(“qinwf/cidian”)

那么,大家就可以愉快地使用一个简单的函数来进行转格式了:1decode_scel(scel = “细胞词库路径”, output = “输出文件路径”, cpp = TRUE)
关于更多个性化的用法,大家可以去官网查询。

自定义词典

两种方法。
1.使用new_user_word函数;2.使用worker函数中通过user参数添加词库。
1.new_user_word函数例子:用new_user_word函数添加词语"公众号",“R语言”

engine_new_word<-worker()
new_user_word(engine_new_word, c(“公众号”,“R语言”))
segment(words,engine_new_word)

2.使用worker函数中通过user参数添加自定义词库:用文档加入词库。
建立一个dictionary.txt,上面提行列出词语。

engine_user<-worker(user=‘dictionary.txt’)
segment(words,engine_user)

注意(1)词库的第一行一定要空着,否则第一个词就会莫名其妙的失效。(2)如果你的词库是用记事本写的话,因为编码有时不是UTF-8,使用时会出现 各种错误,甚至软件奔溃。所以建议使用notepad++编辑,将编码设置为utf-8,另存为txt文件。(3)如果你需要添加搜狗细胞词库的话,那你需要安装cidian包,它可以帮助 我们把搜狗细胞词库转换为jiebaR可以使用的词库。

停用词表

使用worker函数的stop_word参数。

engine_s<-worker(stop_word = “stopwords.txt”)
segment(words,engine_s)

统计词频

freq,来自动计算获取词频。

freq(segment(words,engine_s))

词性标注

原文网址
因为我们是用jiebaR来做分词,根据官方文档说明,它的标注是根据北大《人民日报》语料库进行训练的,最后的标准整理为ICTPOS3.0词性标记集。

第一种方式

分词步骤:1构造分词文本,2构造分词标注器****3进行分词标注4查看结果

library(pacman)
p_load(jiebaR,tidyverse)
cn = “现在每天都待在家里学习R” #1
tag_worker = worker(type = “tag”) #2
tag_result = tagging(cn,tag_worker) #3
tag_result
t r d i
“现在” “每天” “都” “待在家里”
v x
“学习” “R”
str(tag_result)
Named chr [1:6] “现在” “每天” “都” …
attr(*, “names”)= chr [1:6] “t” “r” “d” “i” …

下面的代码是把向量变成数据框

enframe(tag_result) -> tag_table
tag_table
得到结果: A tibble: 6 x 2
name value

1 t 现在
2 r 每天
3 d 都
4 i 待在家里
5 v 学习
6 x R

第二种方式

步骤:1先分词(上面分词中的代码),2用函数标注
1

cn = “我爱中国”
worker() -> wk
segment(**cn,wk) ->seg_cn

2

vector_tag(seg_cn, tag_worker)

第三种方式

函数jiebaR包,提供了一个qseg函数的话,它在分词的时候也会加上词性:它有两种使用方法。
qseg[words]
qseg<=words

自己实践:

kjj = “邝计嘉每天都很认真地学习”
qseg[kjj]
[1] “邝计” “嘉” “每天” “都” “很” “认真”
[7] “地” “学习”

邝计嘉没有在一个词语里面,下面添加词典。

cn <- worker()
new_user_word(cn, c(“邝计嘉”))
[1] TRUE
segment(kjj,cn)
[1] “邝计嘉” “每天” “都” “很” “认真”
[6] “地” “学习”

命名实体识别

任务:得到里面的名词

步骤1:识别这篇文章里面所有的名词。
1tagging(cn,tag_worker) %>%
2 enframe() %>%
3 filter(name == “n”) -> tag_names

步骤2:现在我把文中的名词都筛选了出来。词性的列名称为name,词语的列名称为value。我要统计一下王小波在这篇文章中用到名词的词频。
1tag_names %>%
2 count(value) %>% #对名词进行计数
3 arrange(desc(n)) #降序排列

提取关键词

我们需要把worker里面的参数type设置为keyword或者simhash,使用参数topn设置提取关键字的个数,默认为5个。
#type=keywords
keys<-worker(type=“keywords”,topn=2)
keys<=words
#type=simhash
keys2<-worker(type=“simhash”,topn=2)
keys2<=words

附录:worker

worker(type = “mix”, dict = DICTPATH, hmm = HMMPATH, user = USERPATH,
idf = IDFPATH, stop_word = STOPPATH, write = T, qmax = 20, topn = 5,
encoding = “UTF-8”, detect = T, symbol = F, lines = 1e+05,
output = NULL, bylines = F, user_weight = “max”)

参数作用
type指分词引擎类型,这个包包括mix, mp, hmm, full, query, tag, simhash, keyword,分别指混合模型,支持最大概率,隐马尔科夫模型,全模式,索引模型,词性标注,文本Simhash相似度比较,关键字提取。
dict词库路径,默认为DICTPATH.
hmm用来指定隐马尔可夫模型的路径,默认值为DICTPATH,当然也可以指定其他分词引擎
user用户自定义的词库
idf用来指定逆文本频率指数路径,默认为DICTPATH,也可以用于simhash和keyword分词引擎
stop_word用来指定停用词的路径qmax词的最大查询长度,默认为20,可用于query分词类型。
topn关键词的个数,默认为5,可以用于simhash和keyword分词类型
symbol输出是否保留符号,默认为FLines从文件中最大一次读取的行数。默认为1e+05
output输出文件,文件名一般时候系统时间。
bylines返回输入的文件有多少行
user_weight用户词典的词权重,有"min" “max” or "median"三个选项。

你可能感兴趣的:(r语言,自然语言处理)