《文本挖掘:基于R语言的整洁工具.html.pdf》由会员分享,可在线阅读,更多相关《文本挖掘:基于R语言的整洁工具.html.pdf(98页珍藏版)》请在三一文库上搜索。
1、OReilly Media,Inc.介绍 OReilly Media通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。自1978年开始,OReilly一直都是前沿发展的见证者和推动者。超级极客们正在开创着未来,而我们关注真正重 要的技术趋势通过放大那些“细微的信号”来刺激社会对新科技的应用。作为技术社区中活跃的参与者,OReilly的发展充满了对创新的倡导、创造和发扬光大。 OReilly为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组织了影响深远的开放源代码峰会,以至于开源软件运动以此命名;创立了Make杂志,从而成为DIY革命的主要 先锋;公司一如既往地通过
2、多种形式缔结信息与人的纽带。OReilly的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创新产业的革命性思想。作为技术人士获取信息的选 择,OReilly现在还将先锋专家的知识传递给普通的计算机用户。无论是通过书籍出版,在线服务或者面授课程,每一项OReilly的产品都反映了公司不可动摇的理念信息是激发创新的力量。 业界评论 “OReilly Radar博客有口皆碑。” Wired “OReilly凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。” Business 2.0 “OReilly Conference是聚集关键思想领袖的绝对典范。” CRN “一
3、本OReilly的书就代表一个有用、有前途、需要学习的主题。” Irish Times “Tim是位特立独行的商人,他不光放眼于最长远、最广阔的视野并且切实地按照Yogi Berra的建议去做了:如果你在路上遇到岔路口,走小路(岔路)。回顾过去Tim似乎每一次都选择了小路,而 且有几次都是一闪即逝的机会,尽管大路也不错。” Linux Journal 译者序 文本挖掘是一种从文本数据中抽取有价值的信息和知识的计算机处理技术,也是自然语言处理的热门话题。本书主要介绍整洁数据的文本挖掘与分析。整洁数据具有简单且新颖的结构,对其进行分析 会更有效、更容易。本书的所有代码都是基于R语言来编写的,采用t
4、idytext软件包以及其他整洁工具来挖掘文件中的有用信息,并用图形展示出来,这对理解文本内容非常有帮助。本书提供了非常有用的真 实案例,这会为对文本分析工作感兴趣的人提供有价值的信息。 全书共9章,主要介绍如何使用基于R的整洁工具来进行文本分析。首先介绍了整洁文本的格式,以及如何获取整洁文本数据集;并通过tidytext中的情感数据集来进行情绪分析;接着介绍了如何根据tf- idf统计量来识别特定文档中的重要单词,以及如何利用n-gram来分析文本中的文字网络;之后介绍了如何将整洁文本转换为文档词项矩阵和Corpus对象格式,并给出了主题建模的概念;最后通过整合多种已 知的整洁文本挖掘方法,
5、给出了一些研究案例,这些案例涉及Twitter归档文件、NASA数据集以及来自新闻组的即时通信信息。总的来说,本书侧重于分析文学、新闻和社交媒体方面的文本,非常适合从事 相关文本挖掘的工作人员和自然语言的初学者阅读。与此同时,使用书中提供的大量针对性编程例子,不但可以提高工程实战能力,而且可以在本书提到的整洁框架上建立自己的分析任务。 翻译本书的过程也是译者不断学习的过程。为了保证专业词汇翻译的准确性,我们在翻译过程中查阅了大量相关资料。但由于时间和能力有限,书中内容难免出现差错。如果你在阅读中发现了问题, 欢迎通过电子邮件或与我们联系,期待与你一起探讨,共同进步。 译者 2017年11月 前
6、言 如果你从事分析或数据科学方面的工作,那么一定熟知这样一个事实:数据正在以前所未有的速度快速生成(也许这样的话有很多人都讲过)。通常培训分析人士来处理数字的表格或规整的数据。但 现在大部分新增的数据都是非结构化的文本,而许多在分析领域工作的人都没有接受过乃至简单接受过处理自然语言方面的训练。 尽管我们熟悉许多数据处理和可视化方法,但是将这些方法应用于文本处理并非易事,所以开发了tidytext R包(Silge和Robinson,2016)。我们发现采用数据整洁原则可以使许多文本挖掘任务变得 更简单、更有效,并且该原则和广泛使用的工具也是相一致的。把文本当作由单个单词构成的数据框的优势在于:
7、(1)有助于轻松地操作、汇总以及展示文本特征;(2)有助于将自然语言处理整合到有 效的工作流程中。 本书介绍了如何使用tidytext包以及其他基于R语言的tidy工具来进行文本挖掘。tidytext包提供的函数相对简单,但如何使用这个包则很重要。因此,本书还提供了真实的、极具吸引力的文本挖掘案 例。 大纲 本书首先介绍整洁文本格式,一些有关dplyr、tidyr和tidytext包的使用方法则按如下过程来介绍: 第1章概述了整洁文本格式和unnest_tokens()函数,同时介绍了gutenbergr和janeaustenr包,这些包提供了与文学相关的文本数据集,本书会使用这些数据集来进行
8、介绍。 第2章介绍了如何使用tidytext中的sentiments数据集以及dplyr包中的inner_join()函数来对整洁文本数据集进行情感分析。 第3章介绍了tf-idf统计量(词项频率乘以逆文档频率),它可用来识别特定文档中特别重要的词项。 第4章介绍了n-gram以及如何使用widyr包和ggraph包来分析文本中的文字网络。 文本在分析的所有阶段并不是整洁的,能够在整洁和不整洁格式之间进行转换就显得非常重要。 第5章介绍了通过tm包和quanteda包来使文档词项矩阵和Corpus对象变整洁的方法,以及如何将整洁文本数据集转换为文档词项矩阵和Corpus对象格式。 第6章介绍了
9、主题建模的概念,并使用tidy()方法对topicmodels包的输出进行解释和可视化。 通过整合多种已知的整洁文本挖掘方法,还给出了几个研究案例: 第7章通过作者自己的Twitter档案展示了整洁文本分析的应用。例如,Dave和Julia的Twitter习惯有什么不同? 第8章通过查看超过32000个NASA数据集(可用于JSON格式)中的关键字与标题、描述字段的关系来探索元数据。 第9章分析不同新闻组(与政治、曲棍球、技术、无神论等有关的主题)的即时通信消息数据集来了解新闻组中共同的模式。 本书不包括的主题 本书对整洁文本挖掘框架进行了介绍,并给出了一系列的示例,但对于全面研究自然语言处理
10、领域而言,这些依然不够。CRAN Task View on Natural Language Processing(https:/cran.rproject.org/view=NaturalLanguageProcessing)提供了其他使用R进行计算语言学研究的详细信息。根据个人需求,你可能还想在以下方面进一步研究: 聚类、分类和预测 文本机器学习是一个广泛的话题,可以轻松地找到很多与之相关的内容。第6章将介绍一种无监督聚类(主题建模)方法,但是还有更多其他的机器学习方法可以用来处理文本。 词嵌入 当前流行的一种文本分析方法是将单词映射为向量,以便能检查单词之间的语言关系并对文本进行分类。尽
11、管这些单词表示并不像我们理解的那样整洁,但已经可以在机器学习方法中得以广泛应用。 更复杂的词条化 tidytext包通过信任词条化包(Mullen,2016)来进行标记,其本身使用统一的界面并包括各种词条化方法,但是在具体的应用程序中还有许多其他的词条化方法。 除英文以外的其他语言 一些用户已经成功地将tidytext应用于除英语以外的其他语言的文本挖掘,但是本书不涵盖这方面的例子。 关于本书 本书重点介绍实际软件示例和数据展示,几乎没有公式,但是有大量的代码。我们重点关注在分析文学、新闻和社交媒体时的深入理解。 本书不需要读者具有文本挖掘知识,而专业语言学家和文本分析师可能会认为本书的示例比
12、较初级,但我们相信,他们也可以在这个框架上建立自己的分析。 本书假设读者至少熟悉R中的dplyr、ggplot2和(管道)运算符,并且对如何应用这些工具进行文本数据挖掘感兴趣。对于没有这种专业背景的读者,推荐阅读Hadley Wickham和Garrett Grolemund(OReilly)的R for Data Science一书。若读者有一点背景并对整洁文本感兴趣,即使是R初学者也可以理解和使用本书的示例。 如果你正在阅读本书的纸质版本,那么图像会以灰度而不是彩色的形式呈现。要查看彩色版本的图像,请参阅本书的GitHub页面(http:/ 本书约定 本书使用以下惯例: 斜体(Italic
13、) 表示新的术语、网址、电子邮件地址、文件名和文件扩展名。 等宽字体(Constant width) 用于程序清单,以及段落中引用的程序元素,如变量或函数名称、数据库、数据类型、环境变量、语句和关键字。 等宽粗体(Constant width bold) 展示用户应直接输入的命令或其他文字。 等宽斜体(Constant width italic) 表示应使用用户提供的值来替换或由上下文确定的值。 表示提示或建议。 表示普通注释。 表示警告或注意。 使用代码示例 本书在大部分分析的过程中都给出了代码,但出于篇幅考虑,如果生成图形的代码已经出现过,则不再提供类似的代码。相信读者可以学习并延伸本书示
14、例,另外本书代码可以在GitHub公共库中找 到。 本书旨在帮助读者完成工作,一般来讲,读者可以在程序和文档中使用本书提供的示例代码。除非对代码的重要部分进行加工出版,否则不需要与我们联系。例如,使用本书中多个代码块开发程序不 需要经过我们许可,但出售或发行OReilly书籍示例的CD-ROM则需要许可,引用本书和示例代码来回答问题不需要许可,将本书中重要的示例代码合并到产品文档则需要许可。 如果你引用了本书中的内容,我们希望你能注明出处,包括标题、作者、出版商和ISBN。 例如:“Text Mining with R by Julia Silge and David Robinson(ORe
15、illy).Copyright 2017 Julia Silge and David Robinson,978-1-491-98165-8”。 如果你认为本书代码示例或上述许可不合理,请随时通过与我们联系。 Safari在线图书 Safari是一个为企业、政府、教育和个人提供的会员制培训、参考平台。 会员可以访问数以千计的书籍、培训视频、学习路径、互动教程以及来自250多个出版社策划的播放列表,包括OReilly Media、Harvard Business Review、Prentice Hall Professional、Addison- Wesley Professional、Micro
16、soft Press、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley # # http:/ with 45 more rows 从上面的结果可以看出这可能是按顺序进行了文本清理。“K1”是Einstein取的坐标系名称。 physics % filter(str_detect(text, “K1“) % select(text) # # A tibble: 59 1 # text # # 1 to a second co-ordinate system K1 provided that the latter is
17、 # 2 condition of uniform motion of translation. Relative to K1 the # 3 tenet thus: If, relative to K, K1 is a uniformly moving co-ordinate # 4 with respect to K1 according to exactly the same general laws as with # 5 does not hold, then the Galileian co-ordinate systems K, K1, K2, etc., # 6 Relativ
18、e to K1, the same event would be fixed in respect of space and # 7 to K1, when the magnitudes x, y, z, t, of the same event with respect # 8 of light (and of course for every ray) with respect to K and K1. For # 9 reference-body K and for the reference-body K1. A light-signal is sent # 10 immediatel
19、y follows. If referred to the system K1, the propagation of # # http:/ with 49 more rows 也许保持这个是有道理的。还要注意,在这一行中有“coordinate”,这里解释为什么在Einstein文本中tf-idf值高的单词中有单独的“co”和“ordinate”项,unnest_tokens()函数分隔开标点符 号。请注意,“co”和“ordinate”的tf-idf值几乎相同! “AB”“RC”等分别表示Huygens的射线、圆圈、角度等名称: physics % filter(str_detect(te
20、xt, “AK“) % select(text) # # A tibble: 34 1 # text # # 1 Now let us assume that the ray has come from A to C along AK, KC; the # 2 be equal to the time along KMN. But the time along AK is longer than # 3 that along AL: hence the time along AKN is longer than that along ABC. # 4 And KC being longer t
21、han KN, the time along AKC will exceed, by as # 5 line which is comprised between the perpendiculars AK, BL. Then it # 6 ordinary refraction. Now it appears that AK and BL dip down toward the # 7 side where the air is less easy to penetrate: for AK being longer than # 8 than do AK, BL. And this suff
22、ices to show that the ray will continue # 9 surface AB at the points AK_k_B. Then instead of the hemispherical # 10 along AL, LB, and along AK, KB, are always represented by the line AH, # # http:/ with 24 more rows 删除没有多少意义的单词,得到一个更好、更有意义的图形。即制作一个自定义停用词列表,并使用anti_join()删除这些没什么意义的词,这种方法非常灵活,可以在许多场景中
23、使用。由于从整洁 数据框中删除了一些单词,所以需要退回到前几步重新运行程序(见图3-6)。 mystopwords % bind_tf_idf(word, author, n) % arrange(desc(tf_idf) % mutate(word = factor(word, levels = rev(unique(word) % group_by(author) % top_n(15, tf_idf) % ungroup % mutate(author = factor(author, levels = c(“Galilei, Galileo“, “Huygens, Christiaan
24、“, “Tesla, Nikola“, “Einstein, Albert“) ggplot(plot_physics, aes(word, tf_idf, fill = author) + geom_col(show.legend = FALSE) + labs(x = NULL, y = “tf-idf“) + facet_wrap(author, ncol = 2, scales = “free“) + coord_flip() 图3-6:经典物理学文本中tf-idf值最高的单词 从图3-6可以得出结论,现在已经很少听到一些物理元素单词了。 总结 词项频率和逆文档频率可从文档集合中找到反
25、映某个文档特征的单词,这些文档类型包括:小说、物理文本和网页等。研究词频有助于深入了解自然语言集合中语言是如何使用的,并且tidytext包提供 了研究词频的工具,比如count()函数、rank()函数等。用tidytext包来实现基于整洁数据原则的tf-idf,这使我们能够看到文档集合(或语料库)中各个文档里面不同单词的重要性。 第4章 词之间的关系:n-gram及相关性 目前为止,本书把单词当作独立的单元来研究如何分析单词与情感、文档的关系。但还有许多有趣的文本分析方法会通过查看单词与紧随其后的单词,以及在同一文档中哪些单词通常会同时出现来研 究单词之间的关系。 本章将介绍一些由tidy
26、text提供的方法,这些方法可以用来计算和显示文本数据集中单词之间的关系。例如,token=“ngrams”参数,对于成对的相邻单词而不是单个单词来进行词条化。这里还将介 绍两个新的软件包:ggraph(该包由Thomas Pedersen开发)和widyr,其中ggraph包通过扩展ggplot2包来构建网络图;widyr包可以通过整洁数据框来计算单词之间的相关性和距离。这些包扩展了的 工具箱,可以使用户在整洁数据框上研究文本。 n-gram词条化 本书使用unnest_tokens函数对单词或句子进行词条化,这对于前面介绍的情感分析和词项频率分析很有用。另外还可使用该函数来获取连续的单词序
27、列,称为n-gram,即通过查看单词X在单词Y之 后出现的频率,建立两者之间关系的模型。 在notify_tokens()中添加token=“ngrams”选项,并将n设置为希望在每个n-gram中捕获的单词数量。若将n设置为2时,那么会检查两个连续的单词对,通常称为“二元组”: library(dplyr) library(tidytext) library(janeaustenr) austen_bigrams % unnest_tokens(bigram, text, token = “ngrams“, n = 2) austen_bigrams # # A tibble: 725,04
28、8 2 # book bigram # # 1 Sense & Sensibility sense and # 2 Sense & Sensibility and sensibility # 3 Sense & Sensibility sensibility by # 4 Sense & Sensibility by jane # 5 Sense & Sensibility jane austen # 6 Sense & Sensibility austen 1811 # 7 Sense & Sensibility 1811 chapter # 8 Sense & Sensibility ch
29、apter 1 # 9 Sense & Sensibility 1 the # 10 Sense & Sensibility the family # # http:/ with 725,038 more rows 这种数据结构是改进的整洁文本格式,这种格式是按每行一个序列的形式构建的(一些额外的元数据,如book,在该数据结构中仍然保留),但每个词条都表示一个二元组。 请注意这会有重叠的二元组:“sense and”是一个词条,而“and sensibility”则是另一个词条。 计数和n-gram过滤 前面使用的整洁工具同样适用于n-gram分析,使用dplyr包的count()来检查最常
30、见的二元组: austen_bigrams % count(bigram, sort = TRUE) # # A tibble: 211,237 2 # bigram n # # 1 of the 3017 # 2 to be 2787 # 3 in the 2368 # 4 it was 1781 # 5 i am 1545 # 6 she had 1472 # 7 of her 1445 # 8 to the 1387 # 9 she was 1377 # 10 had been 1299 # # http:/ with 211,227 more rows 正如所期待的那样,很多最常见的二
31、元组是常见的单词,例如“of the”和“to be”,这些单词被称为“停用词”(见第1章)。这时需要使用tidyr的separate()函数来进行处理,separate()函 数可以根据分隔符将单词分隔成多个列,这里把单词分成两列“word1”和“word2”,若这两个单词中任何一个是停用词就删除它们。 library(tidyr) bigrams_separated % separate(bigram, c(“word1“, “word2“), sep = “ “) bigrams_filtered % filter(!word1 %in% stop_words$word) % filte
32、r(!word2 %in% stop_words$word) # new bigram counts: bigram_counts % count(word1, word2, sort = TRUE) bigram_counts # Source: local data frame 33,421 x 3 # Groups: word1 6,711 # # word1 word2 n # # 1 sir thomas 287 # 2 miss crawford 215 # 3 captain wentworth 170 # 4 miss woodhouse 162 # 5 frank churc
33、hill 132 # 6 lady russell 118 # 7 lady bertram 114 # 8 sir walter 113 # 9 miss fairfax 109 # 10 colonel brandon 108 # # http:/ with 33,411 more rows 可以看到这些名字(不管是姓名,还是称呼)都是Jane Austen的小说中最常见的。 在其他分析中,可能想要使用重组的单词。tidyr包中的unite()函数会执行与separate()函数相反的操作,因此可用它将切分的单词重新组合成一个。因此,通 过“separate/filter/count/un
34、ite”可以找到不含停用词的最常见二元组。 bigrams_united % unite(bigram, word1, word2, sep = “ “) bigrams_united # # A tibble: 44,784 2 # book bigram # * # 1 Sense & Sensibility jane austen # 2 Sense & Sensibility austen 1811 # 3 Sense & Sensibility 1811 chapter # 4 Sense & Sensibility chapter 1 # 5 Sense & Sensibility
35、 norland park # 6 Sense & Sensibility surrounding acquaintance # 7 Sense & Sensibility late owner # 8 Sense & Sensibility advanced age # 9 Sense & Sensibility constant companion # 10 Sense & Sensibility happened ten # # http:/ with 44,774 more rows 在其他分析中,可能对最常见的三元组感兴趣,三元组是三个单词的连续序列,可以通过设置n=3来获取三元组。
36、 austen_books() % unnest_tokens(trigram, text, token = “ngrams“, n = 3) % separate(trigram, c(“word1“, “word2“, “word3“), sep = “ “) % filter(!word1 %in% stop_words$word, !word2 %in% stop_words$word, !word3 %in% stop_words$word) % count(word1, word2, word3, sort = TRUE) # Source: local data frame 8,
37、757 x 4 # Groups: word1, word2 7,462 # # word1 word2 word3 n # # 1 dear miss woodhouse 23 # 2 miss de bourgh 18 # 3 lady catherine de 14 # 4 catherine de bourgh 13 # 5 poor miss taylor 11 # 6 sir walter elliot 11 # 7 ten thousand pounds 11 # 8 dear sir thomas 10 # 9 twenty thousand pounds 8 # 10 rep
38、lied miss crawford 7 # # http:/ with 8,747 more rows 分析二元组 这种每行一个元组的格式有助于研究文本分析,下面给出一个简单的例子,该例子可能对每本书中提到的最常见的“streets”一词感兴趣。 bigrams_filtered % filter(word2 = “street“) % count(book, word1, sort = TRUE) # Source: local data frame 34 x 3 # Groups: book 6 # # book word1 n # # 1 Sense & Sensibility ber
39、keley 16 # 2 Sense & Sensibility harley 16 # 3 Northanger Abbey pulteney 14 # 4 Northanger Abbey milsom 11 # 5 Mansfield Park wimpole 10 # 6 Pride & Prejudice gracechurch 9 # 7 Sense & Sensibility conduit 6 # 8 Sense & Sensibility bond 5 # 9 Persuasion milsom 5 # 10 Persuasion rivers 4 # # http:/ wi
40、th 24 more rows 一个二元组也可以被视为文档的一个词项,就像单个的单词一样。例如,可查看Austen小说中二元组的tf-idf值(见第3章)。像对单词的处理那样,也可以可视化每本书中二元组的tf-idf值(如图4-1 所示)。 图4-1:每本Jane Austen小说中最高的12个二元组的tf-idf值 bigram_tf_idf % count(book, bigram) % bind_tf_idf(bigram, book, n) % arrange(desc(tf_idf) bigram_tf_idf # Source: local data frame 36,217 x
41、6 # Groups: book 6 # # book bigram n tf idf tf_idf # # 1 Persuasion captain wentworth 170 0.02985599 1.791759 0.05349475 # 2 Mansfield Park sir thomas 287 0.02873160 1.791759 0.05148012 # 3 Mansfield Park miss crawford 215 0.02152368 1.791759 0.03856525 # 4 Persuasion lady russell 118 0.02072357 1.7
42、91759 0.03713165 # 5 Persuasion sir walter 113 0.01984545 1.791759 0.03555828 # 6 Emma miss woodhouse 162 0.01700966 1.791759 0.03047722 # 7 Northanger Abbey miss tilney 82 0.01594400 1.791759 0.02856782 # 8 Sense & Sensibility colonel brandon 108 0.01502086 1.791759 0.02691377 # 9 Emma frank church
43、ill 132 0.01385972 1.791759 0.02483329 # 10 Pride & Prejudice lady catherine 100 0.01380453 1.791759 0.02473439 # # http:/ with 36,207 more rows 就像在第3章中看到的那样,区分每本Austen著作的单元基本上都是名字,并且还会看到一些普通动词和名字的搭配,例如在傲慢与偏见中的“replied elizabeth”,在爱玛中的“cried emma”。 二元组(而不是单个词)的tf-idf既有优点也有缺点。对连续单词对进行计数得到的结构可能是单个单词计数捕获不到的,并且得到的词条可能更容易理解上下文(例如,诺桑觉寺中的“pulteney street”比“pulteney”含有更多的信息)。然而,每个二元组计数比较稀疏:通常的词组比组成该词组的单词的数量要少一些。因此,对于一个非常大的文本数据集,使用二元组格式可能会特别有用。 使用二元组来得到情感分析的上下文 第2章中的情感分析方法根据所参考的词典简单地计算正面单词或负面单词出现的次数。这种方法的问题是单词及其上下文对
链接地址:https://www.31doc.com/p-5518778.html