0.1 刑法介紹

-刑法(英語:criminal law、德語:Strafrecht)是與犯罪有關聯的法律,其目的在於保護生命、身體、財產、等相關法益,並懲罰違反規範且破壞或威脅這些法的行為。不同於重視私人間損害賠償的民法 ,刑法是判斷何為犯罪,懲罰犯罪行為的法律。

NOTE: 法益是甚麼
國家在何種情況下可以對人民發動刑罰,以及決定刑罰的程度,端賴行為人侵害社會認可利益的大小而定,刑事法律所保護的利益稱之為法益

0.2 刑法的淵源

在各類部門法當中,刑法的歷史可以說是最為悠久。一般來說,古代文明最早頒布的成文法都以刑事法為主,例如中國古代各個朝代的成文法的主體就是刑法。近代大陸法系的刑法遵循罪刑法定原則。刑法的淵源主要為刑法典,單行刑法,附屬刑法。國際條約並不能直接成為國內法院定罪量刑的依據,因為依據罪刑法定原則,各國必須將其簽署加入的國際條約中的犯罪行為規定到本國刑法當中,才能對國際罪行進行管轄。

NOTE: 罪刑法定原則是甚麼
只有在行為時法律明文規定為犯罪行為的,才能依照法律定罪處罰,否則,不得定罪處罰,也就是無法律即無犯罪,本原則讓國家不能擅斷而恣意的對人民實施處罰,並讓人民可以預見法律規範,保障人權。

0.3 刑罰的目的

刑法的目的在於界定國家對於公民的刑罰權,亦即,在如何狀況下國家可以對於公民實施刑罰。刑罰的目的通常被認為有四種:

1.預防,即通過刑法明文公布對犯罪行為的懲處,從而達到預防犯罪的目的(又可分為一般預防與特殊預防) 2.應報,即對侵害法益的行為加以處罰,以公正應報行為者的罪行 3.嚇阻,藉由處罰嚇阻犯罪人及社會大眾 4.教育,執行刑罰以教化犯罪人,使其社會化

去除不要的字

去除不要的字

-將文字存成UTF=8讀取存儲的.txt檔
輸出成純文字檔

0.4 文字雲程式部分

```{r } library(jiebaR) library(wordcloud2)

path = ‘C:/Program Files/R/wordcloud2/wordcloud2/data’

name = ‘刑法總則’

if (name == ‘刑法總則’) { file = paste0(path, “/law2.txt”) }


### 第一種讀 .txt 的方法

0.4.1 第二種讀 .txt 的方法

data = readLines(file, encoding="UTF-8", warn=FALSE)
# warn=FALSE 可避免:
# Warning message:
# In readLines("file, encoding="UTF-8") : incomplete final line found on ...

0.4.2 第三種讀 .txt 的方法 (需要安裝 data.table 套件)

law =  data.table::fread(file, header=FALSE, fill=TRUE, encoding="UTF-8")
data = unlist(law)

0.4.3 第四種讀 .txt 的方法 (需要安裝 readtext 套件)

law = readtext::readtext(file, dvsep="\n", encoding="UTF-8")
data = law$text
# readtext 可讀 txt, json, csv, tab, tsv, html, xml, pdf, doc, docx
# https://www.rdocumentation.org/packages/readtext/versions/0.71/topics/readtext

0.4.4 第五種讀 .txt 的方法 (需要安裝 readr 套件)

{r, message=FALSE} law = readr::read_delim(file=file, delim="\n") data = unlist(law)

0.5 中文 “分詞” 或 “斷詞” (結巴中文分詞)

jiebaR_worker = jiebaR::worker(type="mix")
  • 使用內建方法分詞。 在 worker() 內可以設定各種不同的切分法模型與引用外部詞庫, jiebaR 提供了 7 種分詞引擎。

    1. 混合模型 (MixSegment) - type=“mix”: 是分詞引擎裏面分詞效果較好的類,結它合使用最大概率法和隱式馬爾科夫模型。 2. 最大概率法 (MPSegment) - type=“mp”: 負責根據Trie樹構建有向無環圖和進行動態規劃算法,是分詞算法的核心。 3. 隱式馬爾科夫模型 - (HMMSegment) type=“hmm”: 是根據基於人民日報等語料庫構建的 HMM 模型來進行分詞, 主要算法思路是根據 (B,E,M,S) 四個狀態來代表每個字的隱藏狀態。 HMM 模型由 dict/hmm_model.utf8 提供。分詞算法即 viterbi 算法。 4. 索引模型 (QuerySegment) - type=“query”: 先使用混合模型進行切詞,再對於切出來的較長的詞, 枚舉句子中所有可能成詞的情況,找出詞庫裏存在。 5. 標記模型 (tag) - type=“tag”。 6. Simhash模型 (simhash) - type=“keywords”: 對中文文檔計算出對應的 simhash 值。 simhash 是谷歌用來進行文本去重的算法,現在廣泛應用在文本處理中。 Simhash 引擎先進行分詞和關鍵詞提取,後計算 Simhash 值和海明距離。
    2. 關鍵詞模型 (keywods) - type=“simhash”: 關鍵詞提取所使用逆向文檔頻率 (IDF) 文本語料庫可以切換成自定義語料庫的路徑, 使用方法與分詞類似。
  • 一般情況下,使用默認引擎 (混合模型) 就足夠了。

  • worker 一些參數可參考 https://hk.saowen.com/a/4e17feb2164cf9a99971e7825903b4c317ad75346a764f9d945589c580ba8035

```{r , results=‘hide’} jiebaR_worker = jiebaR::worker(stop_word=“C:/Program Files/R/wordcloud2/wordcloud2/data/stopwords.txt”, user=“stopwords.txt”) # stopwords.txt 為停用詞典檔,mydict.txt 為自建詞典檔。 #將出現頻率高但不是詞彙的詞編寫入

jiebaR::new_user_word(jiebaR_worker, ‘台電’, ‘n’) # ‘n’ 是 ‘台電’ 的詞性 # 在默認自建詞典的基礎上,添加新的自建詞 new_user_word,但僅作用於當前分詞引擎。

title_segment = jiebaR_worker[data] title_segment = jiebaR::segment(data, jiebaR_worker) # 以上擇一做分詞。

1 停用詞過濾函數:filter_segment(分詞後的向量, 過濾詞向量)

filter = c(‘台電’) title_segment = jiebaR::filter_segment(title_segment, filter)

2 接下來用 table() 做次數分配表,

title_table = table(title_segment) title_table = data.frame(title_table) # 轉換為 dataframe 格式,方便之後依頻率做排序。 title_table

3 排序

title_order_table = title_table[order(title_table$Freq, decreasing=TRUE),] # 參考 order.r 範例。 head(title_order_table)


##  文字雲

- 製作文字雲可以使用 wordcloud2 套件
  參考:http://blog.pulipuli.info/2016/11/r-draw-word-cloud-in-r.html

```{r}
library(wordcloud2)
title_nchar = nchar(as.character(title_order_table$title_segment))
# 計算詞的字數,之後要刪除字數為 1 的詞。

title_order_table = title_order_table[title_nchar > 1 ,]
# 刪除字數為 1 的詞。

title_order_table = title_order_table[title_order_table$Freq >= 15,]
# 只保留出現頻率 >= 15 的詞。

cloud1 = wordcloud2::wordcloud2(title_order_table)
cloud1

cloud2 = wordcloud2::wordcloud2(title_order_table, shape="circle")
# 改變文字雲為 cicle 形狀。
cloud2

library(htmlwidgets)
html_file = paste0("C:/Program Files/R/wordcloud2/wordcloud2", name, "1.html")
htmlwidgets::saveWidget(cloud1, html_file, selfcontained=F)

html_file = paste0("C:/Program Files/R/wordcloud2/wordcloud2", name, "2.html")
htmlwidgets::saveWidget(cloud2, html_file, selfcontained=F)

# selfcontained: Whether to save the HTML as a single self-contained file 
#   (with external resources base64 encoded) 
#   or a file with external resources placed in an adjacent directory.
# 需要存成 .html 才可由瀏覽器看到 shape 的結果 (plot 視窗看不到)。
# RMarkdown 亦看不到文字雲結果。
輸出成type=circle的樣子(此為螢幕截圖)

輸出成type=circle的樣子(此為螢幕截圖)

figPath = paste0(path, "/fig/Rabbit.jpg")
cloud3 = wordcloud2(title_order_table, figPath=figPath, size=0.5, color="black")
# 改變文字雲為其他圖片形狀。
cloud3

html_file = paste0("C:/Program Files/R/wordcloud2/wordcloud2", name, "3.html")
htmlwidgets::saveWidget(cloud3, html_file, selfcontained=F)
# (a) 需要配合 Web Server for Chrome 才可看到 .html 結果。
# (b) 若圖形還是出不來,請用小畫家打開圖形檔 (e.g., Mickey.jpg),
#     重新儲存新的 jpg 檔後,再重做 (a),圖形應可出來。

# 若開始安裝 wordcloud2 是通過 packages 中的 CRAN 安裝的,
# 通過這樣的方法安裝 wordcloud2 就出現了自訂圖片不顯示的問題,
# letterCloud 和自訂形狀的圖仍是黑白圖。
# 解決方法:通過 github 官方安裝:
# devtools::install_github("lchiffon/wordcloud2") 就可以了
#   (需要先安裝 devtools package)。
兔子

兔子

cloud4 = wordcloud2::letterCloud(title_order_table, word='H')
cloud4
wordcloud2::letterCloud(title_order_table, word='H', color="random-light", size=0.5)
# 改變文字雲為 R 片形狀。
html_file = paste0("C:/Program Files/R/wordcloud2/wordcloud2", name, "4.html")
htmlwidgets::saveWidget(cloud4, html_file, selfcontained=F)
# 需要配合 Web Server for Chrome 才可看到 .html 結果。
word=“H”

word=“H”