本文档展示了计算文章的无聊程度过程,其基本思路是,首先列举一些在无聊文章中经常出现的词;将文章拆分成\(n\)个句子;查看这\(n\)个句子中,有多大比例的句子包含那些无聊的词。

  1. 读取与分割:按段落读取文本文档,以或者为标识将文档句子进行分割
  2. 删除短句:删除掉较短的句子(一个逗号也没有),从而清除标题类
  3. 分词:将句子分词(添加我们自定义的词库bullshit.txt
  4. 识别垃圾词:将分词结果与我们定义的垃圾词(bullshit.txt)进行对照
  5. 汇总:汇总子含有垃圾词的句子的比例

这里使用的待识别文档来自知乎:https://www.zhihu.com/question/476429482/answer/2098470755
bullshit.txt是我自己总结的一些词汇,每行一个。

1.读取与分割

library(chinese.misc)
library(tidyverse)

mytxt <- "mytext.txt" # 文档未知

# 读取文档(按段落读取)
mytext <- readLines(mytxt) %>%  
  as_tibble() %>%
  # 分割字符向量,按照句号和叹号
  mutate(value = str_split(value, "。|!")) %>%
  unnest(value)

head(mytext)
## # A tibble: 6 × 1
##   value                                                                         
##   <chr>                                                                         
## 1 ""                                                                            
## 2 "刚才,李总、张总的发言,高屋建瓴,很透彻,很深刻,对我有极大的启发,我记了满…
## 3 "希望大家下去之后,深刻领会,认真落实,全力推动XXX这项工作的深入开展,努力开… 
## 4 "下面,围绕XXX工作,我再简单的讲几句:第一,大家要充分提高认识,站在全局和战… 
## 5 "万事开头难,好的开端是成功的一半"                                            
## 6 "但同时,我们也要清醒的认识到,XXX工作在XXX等几个方面还有进一步提升的空间,还…

2.删除短句

# 剔除掉那些过短的句子,也就是一个逗号都没有的句子
mytext <- mytext %>%
  mutate(comma = str_detect(value, pattern = ",")) %>%
  filter(comma == T) %>%
  select(-comma) %>%
  # 然后给句子编号 
  mutate(sentence = 1:nrow(.)) %>%
  select(sentence, value)

head(mytext)
## # A tibble: 6 × 2
##   sentence value                                                                
##      <int> <chr>                                                                
## 1        1 刚才,李总、张总的发言,高屋建瓴,很透彻,很深刻,对我有极大的启发,…
## 2        2 希望大家下去之后,深刻领会,认真落实,全力推动XXX这项工作的深入开展… 
## 3        3 下面,围绕XXX工作,我再简单的讲几句:第一,大家要充分提高认识,站在… 
## 4        4 万事开头难,好的开端是成功的一半                                     
## 5        5 但同时,我们也要清醒的认识到,XXX工作在XXX等几个方面还有进一步提升的…
## 6        6 公司各级员工,要切实提高自己的站位,克服本位主义思想,不要打小算盘,…

3.分词

library(jiebaR)
# 我们自己追加的分词
mycutter <- worker(user = "bullshit.txt`")

# 进行分词作业
myresult <- mytext %>%
  mutate(
    # 先分词
    value = seg_file(value, from = "v", mycutter = mycutter),
    # 然后再拆成向量
    value = str_split(value, pattern = " ")
  ) %>%
  unnest(value)

head(myresult)
## # A tibble: 6 × 2
##   sentence value
##      <int> <chr>
## 1        1 刚才 
## 2        1 李总 
## 3        1 张   
## 4        1 总   
## 5        1 的   
## 6        1 发言

4.识别垃圾词

# 读取垃圾词
bullshit_words <- readLines("bullshit.txt")
## Warning in readLines("bullshit.txt"): 读'bullshit.txt'时最后一行未遂
# 识别垃圾词
myresult <- myresult %>%
  mutate(bullshit = value %in% bullshit_words) %>%
  group_by(sentence) %>%
  summarise(n_word = n(),
            bull_word = sum(bullshit))

head(myresult)
## # A tibble: 6 × 3
##   sentence n_word bull_word
##      <int>  <int>     <int>
## 1        1     22         0
## 2        2     20         1
## 3        3     45         2
## 4        4      8         0
## 5        5     33         2
## 6        6     21         0

5.汇总

# 查看含有垃圾词的句子所含的比例
prop <- (sum((myresult$bull_word != 0)) * 100 / length(myresult$bull_word)) %>% round(2) # 百分比
nr <- nrow(mytext) # 句子总数
nl <- length(bullshit_words) # 设定的垃圾词数

str_glue("所提供文章{mytxt}:\n共识别出{nr}个有效句子,其中{prop}%的句子包含无聊词 \n提示:您一共设定了{nl}个无聊词!")
## 所提供文章mytext.txt:
## 共识别出26个有效句子,其中61.54%的句子包含无聊词 
## 提示:您一共设定了264个无聊词!