Download as pdf or txt
Download as pdf or txt
You are on page 1of 22

派蒙大學

UNIVE
ON

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4 PAIMON UNIVERSITY

【论文翻译】
R 语言文本分析

贝石拌饭∗†

November 28, 2021

说明:本文是对《Text Analysis in R》这篇论文的简要翻译和评述,该文章作者为 Kasper


Welbers, Wouter van Atteveldt 和 Kenneth benoit。交流用,侵删。前半人肉翻译,后半机
翻是英文语法逻辑,但能看懂。参考文献和附录我就不加了,有需要可以去原文章看,doi
是https://doi.org/10.1080/19312458.2017.1387238。


Homepage: https://www.zhihu.com/column/CLKuma

E-Mail: kaede0614@126.com
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

Contents
1 简介 1

2 数据准备 2
2.1 导入文本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2 字符串操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 预处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 文档-词项矩阵 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 筛选与加权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3 分析 10
3.1 计数和字典方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 有监督的机器学习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 无监督的机器学习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4 统计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4 深入 16
4.1 更深入的 NLP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2 单词位置和语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5 结论 19

© 贝石拌饭 i
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

§1 简介
简洁摘要:由于门槛较高,计算文本分析方法应用起来有些困难。为了扫清这些障碍,本文概述
计算文本分析的大概步骤和操作,并用 R 语言呈现。
R 包库:Comprehensive R Archive Network (CRAN)
词袋模型(bag-of-words)
:只使用词频,忽略单词位置(无关顺序)
。尽管词袋模型是对文本内
容的极端简化,但实践证明词频本身在很多分析环境下就包含足够信息了。

表 1 展示了文本分析的大概步骤,分为三部分:数据准备 ⇒ 分析 ⇒ 高级操作

1. 数据准备

• 导入文本:txt、csv、pdf 等,转换为 R 语言可用的原始文本语料库(raw text corpus)


• 字符串操作和预加工:将原始文本分解为小单元(词元,token),即单词或词干。也
叫分词。

• 文档-词项矩阵:将上一步的词元拿来创建 document-term matrix(DTM)


,用于表示
词袋类型的语料库。很多 R 的文本分析包用的这种形式。

• 过滤与加权:对 DTM 进行过滤与加权,按某种顺序来。

2. 分析

• 词典

• 监督学习

• 非监督学习

• 文本统计

3. 深入

• 更深入的 NLP

• 单词位置和语法

© 贝石拌饭 1
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

§2 数据准备
数据分析的第一步是数据准备,因而也适用于计算文本分析,甚至可能产生一些刁钻的特殊
挑战。数据准备的一些选择,对精确度、有效性和结果的影响程度可能不亚于方法的选择。本
文将数据准备概括为 5 步:导入文本、字符串操作、预加工、创建文档-词项矩阵(DTM)、给
DTM 过滤与加权。

2.1 导入文本

R 的文本分析项目第一步是将文本导入 R。文本数据可以用很多的文件格式来储存。R 原生
支持读取平整(regular flat)文本文件,例如 CSV 和 TXT。读取格式化(formatted)的文本,如
JSON、HTML 和 XML,需要另外安装包。复杂的文件格式例如 Word、Excel 和 PDF 也需要另
外安装包。整合这些不同的包及其接口和输出是一个挑战,尤其是不同的文件格式用在同一个

© 贝石拌饭 2
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

项目中。对于这个问题,一个方便的解决方法是 readtex 包,这个包把不同的相关包整合在一起,


提供一个全捕获(catch-all)函数来将不同格式的数据导入为一个统一的格式。下面的代码块展
示了如何用 readtext 函数读取一个 CSV 文件,其方法是将文件路径作为主参数(这里的路径可
以是 URL,本例就是)
。附录:https://github.com/kasperwelbers/text_analysis_in_R
install.packages("readtext")
library(readtext)
# url to Inaugural Address demo data that is provided by the readtext package
filepath <‐ "http://bit.ly/2uhqjJE?.csv"
rt <‐ readtext(filepath, text_field = "texts")
rt

readtext object consisting of 5 documents and 3 docvars.


# data.frame [5 x 5]
doc_id text Year President FirstName
<chr> <chr> <int> <chr> <chr>
1 2uhqjJE?.csv.1 "\"Fellow‐Cit\"..." 1789 Washington George
2 2uhqjJE?.csv.2 "\"Fellow cit\"..." 1793 Washington George
3 2uhqjJE?.csv.3 "\"When it wa\"..." 1797 Adams John
4 2uhqjJE?.csv.4 "\"Friends an\"..." 1801 Jefferson Thomas
5 2uhqjJE?.csv.5 "\"Proceeding\"..." 1805 Jefferson Thomas

该函数可以导入上述所有格式,同时路径也可以引用一个(zip)文件夹来读取里面的所有数
据。在大多数情况下,唯一需要指定的是包含文本的字段名。不仅多个文件可以用简单的和全局
(glob-style)样式匹配来进行引用(如/myfiles/*.txt)
,而且这个命令会递归遍历子目录来定位这
些文件。每个文件会根据其格式自动导入,使得导入和处理不同格式的数据变得很简单。
另外一个需要考虑的是,文本你可以用不同的字符编码来表示。数字文本需要二进制代码来
映射到语义(semantically)上有意义的符号。但是这种映射存在许多不同的形式,不同的“拓展
的”字符编码方法,包括可区分(diacritical)符号的字母、特殊符号和 emoji。为了将所有已知符
号映射到同一个组合里,Unicode 标准应运而生,尽管它也需要一个数字编码格式(如 UTF-8、
UTF-16、UTF-32)。我们的建议很简单:在 R 中,确保所有文本都是 UTF-8 编码。不仅要读
取 UTF-8 文本,其他已知格式也要在导入前转换。如果编码格式未知,readtext 的编码函数可
以猜测编码方式。readtext 能够转换大部分已知的编码方式(如中东欧语言的 ISO-8859-2 格式,
或 Cyrillic 所使用的 Windows-1250 格式,还有其他许多)到 UTF-8 标准。R 同时提供额外的

© 贝石拌饭 3
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

低级工具来转换字符编码格式,如一系列的 GNU libiconv 包,或者通过 stringi 包来进行转换。

2.2 字符串操作

计算文本分析框架的一个核心需求是处理数字文本的能力。数字文本是用字符序列来表示,
叫做字符串。在 R 中,字符串是用“character”对象格式来表示,也就是字符串向量。字符串操
作组指的是处理文本数据的低级操作。最常见的字符串操作是合并、切割、提取(统称为解析
(parse))和使用正则表达式来找到或替代 pattern。
尽管 R 有很多处理字符对象的嵌入式函数,我们仍然推荐用 stringi 包作为替代。这是因为该
包用 International Components for Unicode(ICU)组件作为 Unicode 的支持,如使用 Unicode
字符目录(标点、空格等)和 Unicode 定义的规则来实现在所有语言中正确工作的大小写转换。
也可用 stringr 包作为替代,该包将 stringi 包作为后端,拥有更简单的语法,足够满足终端用户
的需求。
频繁地进行人工和低级地字符串操作时没必要地,因为文本分析中字符串操作的大部分重要
应用都嵌入了一半的文本分析包。不过低级操作的权限提供了多样化的功能,一旦标准方法在
某个特殊案例上失效时可以自己处理。接下来的例子展示了如何用 string 函数进行一些基础的
清洗操作:删除标记形式的样板内容,剥离多余的空格,转化为小写格式。
install.packages("stringi")
library(stringi)
x <‐ c("The first string", ’ The <font size="6">second string</font>’)
x <‐ stri_replace_all(x, "", regex = "<.*?>") # remove html tags
x <‐ stri_trim(x) # strip surrounding whitespace
x <‐ stri_trans_tolower(x) # transform to lower case
x

[1] "the first string" "the second string"

作为 R 中最重要的函数,stringi 操作是向量化的,意味着这些操作作用于向量的每一个元
素。R 中推荐对字符串向量进行操作,因为 R 语言的循环操作是很低效的(听说过,不过 R 不
是 C 写的吗,循环低效的原因是啥)。

© 贝石拌饭 4
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

2.3 预处理

对于大部分计算文本分析方法,全篇必须要词元化(tokenized)为更小的、更具体的文本形
式,如单词或词组。同时,许多文本分析方法的计算表现和精度可以通过标准化或者去除“停止
词(stopwrod)”来实现提升。停止词是指事先指定的无关词,因此在进行分析前要舍弃掉。总
结下,这些预先进行的步骤通常被称为“预处理”。这里我们先讨论几种最常用的预处理方法,
然后展示如何用 quanteda 包来实现这些方法。
实践中,在创建一个文档-词项矩阵时,所有这些预处理方法都可以用一个函数来表示,我们
在后面的 DTM 小节中将会进行说明。而在这里,我们将分别展示每一步骤来说明它们的功能。
词元化
词元化是指将文本切割为词元(token)的过程。这一步骤对计算文本分析至关重要,因为全
文过于具体,难以进行有意义的操作。最常见的词元是单词,因为单词是文本中最普遍的、在语
义上有意义的组成部分。
对于很多语言来说,通过单词来切分文本大部分可以通过低级字符串操作来实现,因为这些
语言有明确的单词边界,如空格、点或逗号。然而,一个好的分词器(tokenizer)必须能够处理
一些特殊情况,如头衔中的句号“Dr.”
。该情况下,句号可能会被理解成句子的边界。更进一步
说,词元化在单词没有明确边界的语言中更难实现,如汉语和日语。为了处理这些情况,一些分
词器包含了拆分文本的模式字典。在 R 中,stringi 包经常被用于消除句子和单词模棱两可的情
况,该包是从 ICU 库中利用的词典。另外还有一个专用于文本分词的包叫做 tokenizers。
下面的代码使用 quanteda 包的分词函数来将一个单句拆分为单词。分词函数返回一个列表,
该列表中的每个元素包含输入文本(如字符向量)中的词元。
install.packages("quanteda")
library(quanteda)
text <‐ "An example of preprocessing techniques"
toks <‐ tokens(text)
# tokenize into unigrams
toks

tokens from 1 document.


text1 :
[1] "An" "example" "of" "preprocessing"
[5] "techniques"

© 贝石拌饭 5
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

标准化:小写(lowercasing)和词干提取(stemming)
标准化过程,广义上指将单词转变为更加统一的格式。标准化对于一个分析案例中,计算机
需要识别两个意思差不多而写法略微不同的单词的情况下是很重要的。另一个优势是减少词表
的规模。一个简单但重要的标准化方法是将所有文本转为小写。如果我们不进行该操作,计算机
将无法识别两个相同,但一个首字母大写的单词。
另一个使用标准化的理由是,一个基本词可能有不同形态的变体,如由动词变化而来的后缀,
或者把名词变为复数。出于分析的目的,我们可能希望将这些变体视为相同,因为不仅它们在语
义上关系密切,而且当多个特征实际上密切相关时,应当减少特征空间。词干提取(stemming)
可以实现这一操作,词干提取本质上是一种基于规则的算法,能够将有词尾变化的单词转换为它
们的基础形式(即词干)
。一个更加高级的操作是词形还原(lemmatization)
,它利用一个词典来
替换单词为它们的形态学的词根形式∗ 。但是 R 中的词形还原操作需要额外的软件模块。另外对
于弱屈折语言如现代英语,词干提取往往足够了。在 R 中,SnowballC 包被用于很多文本分析
包如 quanteda 和 tm 来实现词干提取功能,目前支持 15 种语言。字符、词元或者特征向量的小
写和词干提取可以利用 quanteda 包的 _tolower 和 _wordstem 函数来实现,例如 char_tolower
函数将字符对象转换为小写格式,或者 tokens_wordstem 函数来提取词元的词干。
toks <‐ tokens_tolower(toks)
toks <‐ tokens_wordstem(toks)
toks

tokens from 1 document.


text1 :
[1] "an" "exampl" "of" "preprocess" "techniqu"

在这个例子中可以看到“an”和“An”之间的区别被消除了。而“example”和“techniques”
被简化为“exampl”和“techniqu”,如此单复数之间的区别也被消除了。
去除停止词
常用词汇如“the”在英语中几乎没有涉及文本内容的信息。将这些单词过滤掉有利于缩减数
据规模,减少计算载荷,并且在某些情况下能够提高准确度。为了实现去除这些单词,它们会被
匹配到事先定义好的“停止词”列表并且被删除掉。一些文本分析包提供多种语言的停止词列

morphological root form,morphology-形态学,来源于希腊语 morph,含义是“shape”。形态学是指研究如何
用词素来把单词组合在一起,或者“shaped”。

© 贝石拌饭 6
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

表,它们能够被用于手动过滤停止词。在 quanteda 包中,stopwords 函数返回一个给定语言的


停止词的字符向量。目前支持 17 种语言。
sw <‐ stopwords("english") # get character vector of stopwords
head(sw) # show head (first 6) stopwords

[1] "i" "me" "my" "myself" "we" "our"

tokens_remove(toks, sw)

tokens from 1 document.


text1 :
[1] "exampl" "preprocess" "techniqu"

应当按照正确的顺序小心操作这些预处理步骤,例如应该在词干提取前进行去除停止词操作,
否则“during”会被提取词干为“dure”,因而不会匹配到停止词“during”。大小写转换也可能
造成排序问题,尽管 quanteda 包的默认停止词匹配是不分大小写的(case-insensitive)。
简单说,上面讨论的预处理步骤都可以用一个函数来实现,该函数会自动进行顺序正确的操
作。下一节会对此进行阐述。

2.4 文档-词项矩阵

文档-词项矩阵(后简称为 DTM)是用来表示词袋模型的文本语料库最常用的形式之一。
DTM 的行是文档,列是词项,单元格表示每个词项在每篇文档中出现的频率。这种形式的优势
是允许数据能够用向量和矩阵代数来分析,有效地从文本转换为数字。进一步说,利用稀疏矩
阵,DTM 中的文本数据是有高记忆效率的,能够利用高度优化的操作来分析。
R 中 DTM 最常用的两个包是 tm 和 quanteda,其中 tm 包更常用,很多其他 R 包用 tm 包
DTM 格式作为各类分析函数的输入。而 quanteda 包比 tm 包更新,它的 DTM 格式,即 dfm
或 document-feature matrix,是基于 Matrix 包来作为底层的,但也包含了一些函数转换为几乎
每个其他包会用到的稀疏 DTM 格式(包括 tm 包的格式)
。quanteda 的 dfm 格式由于其功能性
和灵活性,推荐度高于 tm 包。
另一个值得注意的选择是 tidytext 包,该文本分析包是 tidyverse 包的一部分。tidyverse 包
是一系列同理念和格式的 R 包的合集,遵循(1)“每个变量组成一列”;(2)“每次观察组成一
行”;(3)“每种形式的观察单位组成一个表”。同样地,tidytext 包并非严格地使用一个文档-词

© 贝石拌饭 7
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

项矩阵,而是利用长格式代表相同的数据,其中 DTM 的每个非零值是一行,而一列包括文档,


词项和计数(注意这本质上是稀疏矩阵的三联体格式,列指定了行、列和值)。这种格式内存
效率更低,同时让矩阵代数更不方便应用,但是其优点是能够加入更多的变量(如情感分数),
并且可以使用整个 tidyverse 库。因此,对于倾向于 tidy data 理念的用户来说,tidytext 包是
quanteda 或者 tm 包的一个很好的代替。当然这些包也可以视具体情况,很好地组合使用。
下面展示用 quanteda 包来创建 DTM。该包的 dfm 函数提供了从原始文本创建 DTM 的单
行代码解决方法,同时也将上面提到的预处理方法整合在了一起。虽然可以用一系列的低级函
数来创建,但用这个单行代码的函数来直接将文本或语料库转为 DTM 是比较方便的。
text <‐c(d1 = "An example of preprocessing techniques",
d2 = "An additional example",
d3 = "A third example")
dtm <‐ dfm(text, # input text
tolower = TRUE, stem = TRUE, # set lowercasing and stemming to TRUE
remove = stopwords("english")) # provide the stopwords for deletion

dtm

Document‐feature matrix of: 3 documents, 5 features (53.3% sparse).


3 x 5 sparse Matrix of class "dfmSparse"
features
docs exampl preprocess techniqu addit third
d1 1 1 1 0 0
d2 1 0 0 1 0
d3 1 0 0 0 1

DTM 也可以从 quanteda 语料库对象中创建,该对象存储文本和相关的元数据,包括文档级


变量。当一个语料库被词元化或转换为 DTM 时,这些文档级的变量会被保存在对象中,这在
DTM 中的文档需要被用作监督机器学习的协变量(covariates)时可能会很有用。存储的文档变
量也可以让按组来汇总 quanteda 对象。这在文本以小单位存储时非常有用,如 Tweets,但需要
在 DTM 中通过分组变量(如用户、日期或这些变量的组合)进行汇总。
由于 quanteda 与 pkgreadtext 包兼容,从磁盘上的文本创建一个语料库只需要一个额外的步
骤。在下面的例子中,我们从上面导入的 readtext 数据中创建一个 DTM。
fulltext <‐ corpus(rt) # create quanteda corpus

© 贝石拌饭 8
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

dtm <‐ dfm(fulltext, tolower = TRUE, stem = TRUE, # create dtm with preprocessing
remove_punct = TRUE,remove = stopwords("english"))
dtm

Document‐feature matrix of: 5 documents, 1,405 features (67.9% sparse).

2.5 筛选与加权

并非所有的词项对于文本分析都具有同等的信息量。处理这个问题的方法之一是从 DTM 中
删除这些词项。我们已经讨论了使用止损词列表来删除非常常见的词项,但是很可能还有其他
常见的词汇,这在不同的语料库之间会有所不同。此外,对于类别预测(category prediction)或
话题建模(topic modeling)等任务来说,去除非常少见的词项也是非常有用的。这对提高效率
特别有用,因为它可以减少词汇量,也可以提高准确性。一个简单而有效的方法是根据文档频
率(一个词项出现的文档数量)进行过滤,使用最小和最大文档数量或比例的阈值来实现。
与其删除信息量较小的词项,不如给它们分配可变的权重。如果词项的权重考虑到了一个估
计的信息值,而不是直接使用它们的出现频率,那么许多文本分析技术的表现会更好。如果给出
一个足够大的语料库,我们可以使用关于语料库中的词项分布的信息来估计这个信息值。一个
流行的加权方案是词频-逆文档频率(tf-idf),它降低了语料库中许多文档中出现的词项的权重。
quanteda 包括函数 docfreq、tf 和 tfidf,分别用于获取文档频率、词项频率和 tf-idf。每个
函数都有许多选项来实现 SMART 加权方案。作为这些函数的高级包装,quanteda 还提供了
dfm_weight 函数。在下面的例子中,”senat[e]” 这个词的权重高于信息量较小的”inter”,这两个
词都在第一个文档中出现过一次。
文档频率阈值和加权操作可以很容易地在 DTM 上执行。quanteda 包包括函数 docfreq、tf
和 tfidf,分别用于获取文档频率、词项频率和 tf-idf。每个函数都有许多选项来实现 SMART
加权方案。作为这些函数的高级包装,quanteda 还提供了 dfm_weight 函数。在下面的例子中,
”senat[e]” 这个词的权重高于信息量较小的”inter”,这两个词都在第一个文档中出现过一次。
doc_freq <‐ docfreq(dtm) # document frequency per term (column)
dtm <‐ dtm[, doc_freq >= 2] # select terms with doc_freq >= 2
dtm <‐ dfm_weight(dtm, "tfidf") # weight the features using tf‐idf
head(dtm)

© 贝石拌饭 9
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

Document‐feature matrix of: 5 documents, 6 features (40% sparse).


5 x 6 sparse Matrix of class "dfmSparse"
features
docs fellow‐citizen senat hous repres among life
text1 0.2218487 0.39794 0.79588 0.4436975 0.09691001 0.09691001
text2 0 0 0 0 0 0
text3 0.6655462 0.39794 1.19382 0.6655462 0.38764005 0.19382003
text4 0.4436975 0 0 0 0.2218487 0.09691001 0.09691001
text5 0 0 0 0 0.67837009 0.19382003

§3 分析
对于文本分析方法的概述,我们以 Boumans 和 Trilling(2016)† 提出的分类为基础,其中区
分了三种方法:计数和字典方法、有监督的机器学习和无监督的机器学习。他们将这些方法按照
这个顺序定位在一个从最具演绎性到最具归纳性的维度。在这种情况下,演绎式是指使用先验
定义的编码方案。换句话说,研究人员事先知道他们在寻找什么,只想把这种分析自动化。与演
绎推理概念的关系是,研究者假设某些规则,或前提是真实的(例如,表示积极情绪的词汇列
表),因此可以应用于对文本的结论。相比之下,归纳法在这里指的是,不是使用先验的编码方
案,而是计算机算法本身以某种方式从文本中提取有意义的编码。例如,通过寻找词语共现的
模式,并找到解释这些模式的潜在因素(例如,主题、框架、作者)–至少在数学上。就归纳推
理而言,可以说该算法在具体观察的基础上创造了广泛的概括。
除了这三个类别之外,我们还考虑了一个统计学类别,包括所有用数字描述文本或语料库的
技术。与无监督学习一样,这些技术是归纳性的,即没有使用先验的编码方案,但它们不使用机
器学习。
对于每种类型的分析的示例代码,我们使用 quanteda 软件包中包含的美国总统的就职演说
(N = 58)。
dtm <‐ dfm(data_corpus_inaugural, stem = TRUE, remove = stopwords("english"),
remove_punct = TRUE)


《Taking stock of the toolkit: An overview of relevant automated content analysis approaches and techniques
for digital journalism scholars》

© 贝石拌饭 10
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

dtm

## Document‐feature matrix of: 58 documents, 5,405 features (89.2% sparse).

3.1 计数和字典方法

字典方法泛指使用从简单的关键词到复杂的布尔查询和正则表达式模式来计算文本中某些概
念的出现频率。这是一种演绎的方法,因为字典先验地定义了哪些代码被测量以及如何测量,而
这不会受到数据的影响。使用字典是一种计算简单但功能强大的方法。它已经被用来研究诸如
媒体对政治人物的关注和企业新闻的框架。词典也是测量情绪的一种流行方法以及主观语言的
其他层面。通过将这种类型的分析与先进的 NLP 技术识别句法条款的信息相结合,也有可能进
行更精细的分析,比如归属于特定行为人的情感表达,或者一个行为人指向另一个行为人的行
动和情感。
下面的例子显示了如何将字典应用于 quanteda DTM。第一步是使用字典函数创建一个字
典对象(这里称为 myDict)。为了简单起见,我们的例子使用了一个非常简单的字典,但也可
以导入大型的、预先制作的字典,包括其他文本分析字典格式的文件,如 LIWC、Wordstat 和
Lexicoder。词典也可以从 YAML 文件中编写和导入,并且可以包括固定匹配的模式、正则表达式
或许多词典格式中常见的更简单的”glob ” 模式匹配(只用 和?作为通配符)
。通过 dfm_lookup
函数,字典对象可以应用在 DTM 上,创建一个新的 DTM,其中的列代表字典代码。
myDict <‐ dictionary(list(terror = c("terror*"),
economy = c("job*", "business*", "econom*")))
dict_dtm <‐ dfm_lookup(dtm, myDict, nomatch = "_unmatched")
tail(dict_dtm)

Document‐feature matrix of: 6 documents, 3 features (16.7% sparse).


6 x 3 sparse Matrix of class "dfmSparse"
features
docs terror economy _unmatched
1997‐Clinton 2 3 1125
2001‐Bush 0 2 782
2005‐Bush 0 1 1040
2009‐Obama 1 7 1165

© 贝石拌饭 11
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

2013‐Obama 0 6 1030
2017‐Trump 1 5 709

3.2 有监督的机器学习

直观的想法是,如果我们给这些算法提供足够多的例子来说明它们应该如何编码,那么这些
算法就能学会如何编码文本。一个直接的例子是情感分析,使用一组被手动编码为正面、中立或
负面的文本,在此基础上,算法可以学习哪些特征(单词或单词组合)更有可能出现在正面或负
面文本中。给定一个未见过的文本(该算法没有经过训练),然后可以根据这些特征的存在来估
计该文本的情绪。演绎的部分是,研究人员提供训练数据,其中包含代表研究人员试图预测或
测量的类别的良好例子。然而,研究人员并没有提供如何寻找这些代码的明确规则。归纳的部分
是,有监督的机器学习算法从训练数据中学习这些规则。套用一个经典的论证:如果训练数据
是一个要么是凡人要么是不死之身的人的名单,那么该算法将学习到所有男人都极有可能是凡
人,因此会估计苏格拉底也是凡人。
为了证明这一点,我们训练了一个模型来预测就职演说是否在二战之前发表。我们期待这一
点,因为突出的问题会随着时间的推移而转移,特别是在战争之后。一些专门用于监督机器学
习的软件包是 RTextTools 和 kerasR。然而,在这个例子中,我们使用了一个包含在 quanteda
中的分类器。在开始之前,我们为 R 的随机数生成器设置了一个自定义的种子,这样代码的随
机部分的结果总是相同的。为了准备数据,我们在 DTM 中添加了文档(元)变量 is_prewar,
表示哪些文档在 1945 年之前。这是我们的模型将尝试预测的变量。然后我们将 DTM 分成训练
(train_dtm)和测试(test_dtm)数据,使用 40 个文档的随机样本进行训练,其余 18 个文档进
行测试。训练数据被用来训练一个多项式 Naive Bayes 分类器,我们将其分配给 nb_model。为
了测试这个模型对就职演说是否早于战争的预测程度,我们对测试数据的代码进行了预测,并
制作了一个表格,表格中的行显示预测值,列显示 is_prewar 变量的实际值。
set.seed(2)
# create a document variable indicating pre or post war
docvars(dtm, "is_prewar") <‐ docvars(dtm, "Year") < 1945

# sample 40 documents for the training set and use remaining (18) for testing
train_dtm <‐ dfm_sample(dtm, size = 40)
test_dtm <‐ dtm[setdiff(docnames(dtm), docnames(train_dtm)), ]

© 贝石拌饭 12
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

# fit a Naive Bayes multinomial model and use it to predict the test data
nb_model <‐ textmodel_NB(train_dtm, y = docvars(train_dtm, "is_prewar"))
pred_nb <‐ predict(nb_model, newdata = test_dtm)

# compare prediction (rows) and actual is_prewar value (columns) in a table


table(prediction = pred_nb$nb.predicted, is_prewar = docvars(test_dtm, "is_prewar"))

is_prewar
prediction FALSE TRUE
FALSE 8 0
TRUE 0 10

3.3 无监督的机器学习

在无监督的机器学习方法中,没有指定编码规则,也没有提供注解的训练数据。相反,一个
算法通过识别文本中的某些模式来建立一个模型。研究人员的唯一影响是指定某些参数,如文
件被归入的类别数量。流行的例子是主题建模,用于根据潜在的主题结构对文档进行自动分类,
以及”Wordfish ” 参数因子模型,用于在单一的潜在维度上对文档进行缩放,如左右意识形态。
Grimmer 和 Stewart(2013)‡ 认为,有监督和无监督的机器学习并不是互相竞争的方法,而
是实现了不同的目的,很可以用来互补。如果需要将文件放在预先确定的类别中,有监督的方
法是最合适的方法,因为无监督的方法不太可能产生反映这些类别和研究者如何解释它们的分
类。无监督方法有点不可预测,其优点是它可以提出研究者未曾考虑过的类别。(反之,当结果
不明确时,这也可能给事后解释带来挑战)。
为了展示无监督学习的本质,下面的例子展示了如何使用 topicmodels 包在 R 中拟合一个主
题模型。为了更具体地关注就职演说中的主题,并增加建模的文本数量,我们首先按段落分割
文本并创建一个新的 DTM。从这个 DTM 中,我们删除了文档频率为 5 或更低的词项,以减少
词汇量(对目前的例子不太重要),并使用 quanteda 的转换功能将 DTM 转换成主题模型使用
的格式。然后,我们用五个主题训练一个普通的 LDA 主题模型–使用一个固定的种子来使结果
可重复,因为 LDA 是非确定性的。

《Text as data: The promise and pitfalls of automatic content analysis methods for political texts》

© 贝石拌饭 13
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

install.packages("topicmodels")
library(topicmodels)

texts = corpus_reshape(data_corpus_inaugural, to = "paragraphs")

par_dtm <‐ dfm(texts, stem = TRUE, # create a document‐term matrix


remove_punct = TRUE, remove = stopwords("english"))
par_dtm <‐ dfm_trim(par_dtm, min_count = 5) # remove rare terms
par_dtm <‐ convert(par_dtm, to = "topicmodels") # convert to topicmodels format

set.seed(1)
lda_model <‐ topicmodels::LDA(par_dtm, method = "Gibbs", k = 5)
terms(lda_model, 5)

Topic 1 Topic 2 Topic 3 Topic 4 Topic 5


[1,] "govern" "nation" "great" "us" "shall"
[2,] "state" "can" "war" "world" "citizen"
[3,] "power" "must" "secur" "new" "peopl"
[4,] "constitut" "peopl" "countri" "american" "duti"
[5,] "law" "everi" "unit" "america" "countri"

结果显示了五个主题的前五个词项。虽然这只是一个基本的例子,但从同一主题内各词项的
语义一致性可以看出,” 主题” 是自下而上从数据中发现的。特别是,话题一似乎围绕着治理,
有” 治理”、” 权力”、” 国家”、” 宪法” 和” 法律” 等词项。

3.4 统计

各种统计数据可以用来描述、探索和分析一个文本语料库。一个流行技术的例子是对语料库
内的词的信息价值进行排序,然后将信息量最大的词可视化为一个词云,以快速了解语料库的
内容。文本统计(如平均字数和句子长度、字数和音节数)也常用来作为可读性或词汇多样性等
概念的操作化。R 语言中的 koRpus 包可以提供大量的此类测量方法。此外,计算术语和文档的
相似性(通常基于 DTM 或转置 DTM 的内积)有很多有用的应用,例如分析词或概念之间的语
义关系和测量内容同质性。这两种技术在 quanteda、corpustools 或专门的软件包(如 textreuse)
中都有支持,用于文本重叠。

© 贝石拌饭 14
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

一个特别有用的技术是比较两个语料库的词项频率,或同一语料库的两个子集之间的频率。
例如,看看哪些词更有可能出现在关于某个主题的文件中。除了提供一种方法来快速探索这个
话题在语料库中的讨论情况外,这还可以为开发更好的查询提供输入。在下面的例子中,我们
展示了如何在 quanteda 中执行这一技术(见图 2)。

# create DTM that contains Trump and Obama speeches


corpus_pres = corpus_subset(data_corpus_inaugural,
President %in% c("Obama", "Trump"))
dtm_pres = dfm(corpus_pres, groups = "President",
remove = stopwords("english"), remove_punct = TRUE)

# compare target (in this case Trump) to rest of DTM (in this case only Obama).
keyness = textstat_keyness(dtm_pres, target = "Trump")
textplot_keyness(keyness)

output in Figure 2.

这里,有符号的 2
关联度测量表明,特朗普使用”america”、”american ” 和”first ” 的频率远
远高于奥巴马,而”us”、”can”、”freedom”、”peace ” 和”liberty ” 是奥巴马比特朗普更容易使用
的词汇。

© 贝石拌饭 15
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

§4 深入
上面讨论的数据准备和词包分析技术是目前传播研究中使用的大多数文本分析方法的基础。
然而,对于某些类型的分析,可能需要依赖外部软件模块的技术,对计算的要求更高,或者使用
起来更复杂。在本节中,我们将简要地阐述其中一些值得注意的先进方法。

4.1 更深入的 NLP

除了在数据准备部分讨论的预处理技术外,还有一些强大的预处理技术,依赖于更先进的自
然语言处理(NLP)
。目前,这些技术在原生的 R 中并不存在,而是依赖于外部的软件模块,而
这些软件模块往往需要在 R 之外安装。许多先进的 NLP 技术对计算的要求也更高,因此需要
更多的时间来执行。另一个复杂的问题是,这些技术是特定的语言,往往只适用于英语和其他
一些大语言。
coreNLP 包提供了斯坦福 CoreNLP java 库的绑定,这是一个完整的英语 NLP 分析器,也支
持(尽管有限制)阿拉伯语、中文、法语、德语和西班牙语。spacyr 包为 Python 的 spaCy 模块
提供了一个接口,它与 CoreNLP 相当,但速度更快,并支持英语和(同样有一些限制)德语和
法语。第三个包,cleanNLP,方便地包装了 CoreNLP 和 spaCy,还包括一个不依赖于外部依赖
的最小后端。这样,它可以作为一把瑞士军刀使用,选择最适合的场合和后端可用的方法,但要
有标准化的输出和方法。
高级 NLP 解析器通常一次就能完成所有的技术。在下面的例子中,我们使用 spacyr 包来解
析一个句子,它将被用来说明四种高级 NLP 技术:词法、语篇(POS)标记、命名实体识别
(NER)和依赖性解析。
install.packages("spacyr")
library(spacyr)
spacy_initialize()

d <‐ spacy_parse("Bob Smith gave Alice his login information.", dependency = TRUE)


d[, ‐c(1,2)]

token_id token lemma pos head_token_id dep_rel entity


1 1 Bob bob PROPN 2 compound PERSON_B
2 2 Smith smith PROPN 3 nsubj PERSON_I

© 贝石拌饭 16
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

3 3 gave give VERB 3 ROOT


4 4 Alice alice PROPN 3 dative PERSON_B
5 5 his ‐PRON‐ ADJ 7 poss
6 6 login login NOUN 7 compound
7 7 information informationNOUN 3 dobj
8 8 . . PUNCT 3 punct

词形还原(Lemmatization): 词形还原的目的与词干提取(stemming)类似,但不是切断
词项的末端来使其正常化,而是用字典来替换词项的词缀。这种方法的主要优点是,它可以更
准确地规范不同的动词形式,例如例子中的” 给” 和” 给”。这对荷兰语或德语这样的重度词性语
言特别重要。
词性标注(Part-of-speech tagging):POS 标签是单词的形态-句法类别,如名词、动词、冠
词和形容词。在这个例子中,我们看到三个专有名词(PROPN)
,一个动词(VERB)一个形容
词(ADJ)
,两个名词(NOUN)
,以及标点符号(PUNCT)
。这些信息可以用来集中分析某些类
型的语法类别,例如,使用名词和专有名词来衡量新闻项目中的类似事件,或者使用形容词来
关注主观语言。同样,这也是过滤掉某些类型的词,如冠词或代词的好方法。
命名实体识别(Named Entity Recognition,NER): 命名实体识别用于识别一个词或词
的序列是否代表一个实体,以及什么类型的实体,如一个人或组织。”Bob Smith” 和”Alice” 都
被识别为人。理想情况下,命名的实体识别是与共同参考解析相搭配的。这是一种对同一实体
的不同引用进行分组的技术,如拟声词(例如,他、她、总统)。在该例句中,”his” 一词指的
是”Bob Smith”。目前只有斯坦福大学的 CoreNLP 支持协同参考解析,但 spaCy GitHub 页面
上的讨论表明,这项功能已经提上日程。
依存句法(Dependency parsing): 依存句法分析提供了标记之间的句法关系,可用于在句
法句子层面上分析文本。在 spacyr 的输出中,这一信息在 head_token_i 和 dep_rel 列中给出,
前者表示一个标记与哪个标记相关,后者表示关系的类型。例如,我们看到”Bob ” 与”Smith” 是
复合关系,因此将”Bob Smith ” 作为一个实体来识别。另外,由于”Smith ” 是动词”given ” 的名
词性主语(nsubj),而 Alice 是助动词情况(dative),我们知道”Bob Smith ” 是给予”Alice ” 的
人。例如,这种类型的信息可以用来分析在关于加沙战争的新闻报道中谁在攻击谁。

© 贝石拌饭 17
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

4.2 单词位置和语法

如上所述,文本的词包表示法对于各种类型的分析来说,具有记忆效率和便利性,这往往超
过了丢掉词的位置而丢失信息的缺点。然而,对于某些分析来说,词的顺序和句法属性即使不
是关键,也是非常有益的。在本节中,我们将讨论一些保留词位的文本表示法和分析技术。
一个简单但潜在的强大解决方案是使用高阶 n-grams。也就是说,不是将文本标记为单个词
(n=1;unigrams),而是使用两个词(n=2;bigrams)、三个词(n=3;trigrams)或更多词的序
列。其他选项包括形成” 跳格”,或从具有可变相邻窗口的词中形成 n-grams。这种非相邻的搭配
构成了计算加权接近向量的基础,用于基于深度学习技术的向量空间网络模型)。下面,我们说
明如何使用 0 和 1 跳的向量来形成大小为 3 的三语法和跳语法。
text <‐ "an example of preprocessing techniques"
tokens(text, ngrams = 3, skip = 0:1)

tokens from 1 document.


text1 :
[1] "an_example_of" "an_example_preprocessing"
[3] "an_of_preprocessing" "an_of_techniques"
[5] "example_of_preprocessing" "example_of_techniques"
[7] "example_preprocessing_techniques" "of_preprocessing_techniques"

这种方法的优点是这些 n-grams 可以以与 unigrams 相同的方式使用:我们可以用 n-grams


制作 DTM,并进行上面讨论的所有类型的分析。因此,在 R 中从原始文本中创建 DTM 的功
能通常允许使用单字格以外的 n-grams。对于某些分析,这可以提高性能。例如,考虑到否定词
和放大器在情感分析中的重要性,如” 不好” 和” 非常不好”。然而,一个重要的缺点是,使用
n-grams 对计算的要求更高,因为有许多独特的词的序列比单个词更多。这也意味着需要更多的
数据来获得对 n-grams 分布的良好估计。
另一种方法是在标记化之后保留单词的位置。这有三个主要优点。首先,在分析中可以考虑
到标记的顺序和距离,从而可以进行分析,如在一个词窗口内的词的共现。第二,数据可以被转
化为全文语料库(通过将标记粘贴在一起)和 DTM(通过删除标记的位置)
。这也使得一些文本
分析技术的结果能够在文本中得到可视化,比如根据词表模型给单词着色或者为话题模型制作
浏览器。第三,每个标记可以用标记的具体信息进行注释,比如从先进的 NLP 技术中获得。例
如,这使得使用依赖性分析在句法句子的层面上进行分析。保留位置的主要缺点是内存效率很

© 贝石拌饭 18
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

低,尤其是在保留所有标记并添加注释的情况下。
表示有位置的标记的常见方法是一个数据框架,其中行代表标记,按其位置排序,列代表与
标记有关的不同变量,如字面文本、其词法形式和其 POS 标记。上文高级 NLP 部分的 spacyr
标记输出中显示了这种表示方式的一个例子。几个 R 包为这种格式的标记提供了专门的类。
一个是 koRpus 包,它专门研究各种类型的文本统计,特别是词汇多样性和可读性。另一个是
corpustools),它专注于管理和查询注释的标记,以及重构文本,将原始文本内容中的定量文本
分析结果可视化,以便进行定性调查。第三种选择是 tidytext,它不关注注释标记的这种格式,
但提供了一个框架,用于处理数据框架中的标记化文本。
为了简要展示利用词位的情况,我们用 corpustools 软件包进行词典搜索,该软件包支持在
给定的词距内搜索单词。然后在上下文中的关键词(KWIC)列表中查看结果。在这个例子中,
我们使用乔治-W-布什和巴拉克-奥巴马的国情咨文演说,在五个词的距离内寻找” 自由” 和” 美
国 *”。
install.packages("corpustools")
library(corpustools)

tc <‐ create_tcorpus(sotu_texts, doc_column = "id")


hits <‐ tc$search_features(’"freedom americ*"~5’)
## created index for "token" column
kwic <‐ tc$kwic(hits, ntokens = 3)
head(kwic$kwic, 3)

[1] "...making progress toward <freedom> will find <America> is their friend..."
[2] "...friends, and <freedom> in Iraq will make <America> safer for generations..."
[3] "...men who despise <freedom>, despise <America>, and aim..."

§5 结论
R 是一个强大的计算性文本分析平台,可以成为传播研究的宝贵工具。首先,其完善的软件
包提供了对前沿文本分析技术的便捷访问。如图所示,不仅实现了大多数常见的文本分析技术,
而且在大多数情况下,多个软件包为用户在选择实现这些技术的工具时提供了选择。其中许多
软件包是由学者开发的,也是为学者开发的,并为数据准备和分析提供了既定程序。其次,R 的

© 贝石拌饭 19
派蒙大学应急食品学院
UNIVE
ON

【论文翻译】R 语言文本分析

RS
PAIM
蒙派

ITY
煮水
11 4 5 1 4
School of Emergency Food, Paimon University

开源性和处理软件包的优秀系统使它成为一个方便的平台,可以弥合研究和工具开发之间的差
距,这对于在传播研究中建立一个强大的计算方法范式是最重要的。新的算法不必局限于针对
方法论专家的期刊文章中的抽象而复杂的解释,也不必通过许多感兴趣的人不知道该如何处理
的神秘代码来提供。作为一个 R 包,算法可以以一种标准化的、熟悉的格式随时提供。
然而,对于新用户来说,从 R 中广泛的文本分析包中进行选择也是令人生畏的。由于大多数
技术都有不同的选择,要确定哪些软件包值得投入精力去学习是很困难的。因此,这个教师角
的主要目标是为寻找将计算文本分析纳入其研究的方法的学者提供一个起点。我们选择的软件
包是基于我们作为 R 语言文本分析软件包的使用者和开发者的经验,并且应该涵盖最常见的使
用情况。特别是,我们建议用户至少要熟悉一个处理数据准备和管理的成熟的、维护良好的软件
包,如 quanteda、tidytext 或 tm。从这里开始,将数据转换为与大多数可用的文本分析包兼容
的格式,通常只是一小步。
应该强调的是,本教师园地所介绍的软件包的选择并不详尽,也不代表哪些软件包最适合相
关的功能。通常情况下,最好的软件包在很大程度上取决于具体的功能和问题的具体优先级,如
速度、内存效率和精确度。此外,当涉及到建立一个富有成效的工作流程时,个人偏好和经验的
重要性也不应被低估。一个很好的例子是 tidytext 软件包的工作流程,熟悉 tidyverse 理念的人
可能会喜欢它。因此,本教师园地推荐的软件包提供了一个很好的起点,对于许多用户来说,这
可能是他们所需要的全部,但还有许多其他优秀的软件包在那里。对于一个更完整的软件包列
表,一个好的起点是 CRAN 自然语言处理的任务视图。
Marshall McLuhan 有句名言:” 我们塑造了我们的工具,此后我们的工具又塑造了我们”,而
在科学中,工具如何塑造我们的发现也是如此。因此,我们认为,在传播研究中建立一个强大的
计算方法范式,与拥抱开源工具的开发作为科学实践的一个固有部分是相辅相成的。因此,我
们最后呼吁研究者们像引用其他科学工作一样引用 R 包。这给了开发者应有的荣誉,从而为开
发者提供了公正的激励,让他们发布和维护新的代码,包括适当的测试和文档,以方便其他人
正确使用代码。引用软件包对于研究的透明度也是至关重要的,这在使用新的计算技术时尤其
重要,因为结果可能会因实现方式的不同而不同,而且往往不能保证没有错误。就像我们的理
论是通过合作、透明和同行反馈形成的一样,我们也应该塑造我们的工具。

© 贝石拌饭 20

You might also like