跳到内容

JBGruber/LexisNexisTools公司

存储库文件导航

词汇NexisTools

R-CMD检查 CRAN_状态_标签 CRAN_下载_标签 Codecov测试覆盖率

动机

我的博士生导师曾告诉我,每个做报纸分析的人都是从编写代码开始读取“LexisNexis”报纸档案中的文件。然而,虽然我确实推荐这个练习,但并不是每个人都有时间。该软件包提供读取从旧的“LexisNexis”下载的TXT、RTF、DOC和PDF文件的功能,或从新的Nexis Uni、Lexis Advance和类似服务下载的DOCX文件的功能。该软件包还提供了一些其他功能,这些功能在处理流行报纸档案中的数据时应该很有用。

你有没有遇到任何问题,对一个很棒的新功能有什么疑问或想法?那么请不要犹豫提交问题报告.

安装

安装方式:

安装.包("LexisNexis工具")

或者通过直接从GitHub安装获得开发版本(如果没有遥控器还可以通过安装install.packages(“远程”)第一):

遥控器::安装github("JBGruber/LexisNexisTools公司")

演示

加载程序包

图书馆("LexisNexis工具")

如果您还没有来自“LexisNexis”的文件,但想测试包,可以使用lnt_sample()要将包含模拟数据的示例文件复制到当前工作目录中,请执行以下操作:

lnt_sample()

文件重命名

“LexisNexis”没有为其文件提供正确的名称。功能lnt_rename()将文件重命名为标准格式:对于TXT文件,此格式为“searchTerm_startDate-endDate_documentRange.TXT”(例如,“Obama_20091201-20100511_1-500.TXT”)(对于其他文件类型,此格式类似,但取决于可用的信息)。请注意,如果您的文件缺少包含此信息的封面,则此操作将不起作用。目前,似乎“LexisNexis”只在您第一次创建搜索链接(搜索结果页面上的“此搜索链接”),点击此链接,然后从那里下载TXT文件时才提供这些封面(参见此处直观解释).如果不想重命名文件,可以跳到下一节。无论您是否重命名文件,软件包的其余功能都保持不变。然而,在较大的数据库中,您将从一致的命名方案中获益。

有三种方法可以重命名文件:

  • 直接在工作目录中运行lnt_rename(),不带x参数,这将提示扫描当前工作目录中的TXT文件的选项:
报告 <-lnt_rename()
  • 提供文件夹路径(并设置递归=真如果要递归扫描文件):
报告 <-lnt_rename(重命名)(x个 =获取(),报告 = 真的)
  • 提供具有文件名的字符对象。使用list.files()列表.files()搜索特定路径中的文件。
我的文件(_F) <-列表.files(图案 = ".txt文件",路径 =获取(),完整名称 = 真的,递归的 = 真的,忽略.案例 = 真的)报告 <-lnt_rename(重命名)(x个 = 我的文件(_F),报告 = 真的)报告
名称_钻机 名称_新建 地位 类型
样品。TXT公司 示例文件_20091201-20100511_1-10.txt 重命名 文本

使用list.files()代替内置机制,您可以指定文件模式。如果您有一个文件夹,其中只有一些TXT文件包含来自LexisNexis的报纸文章,但其他文件也有结尾TXT,那么这可能是首选选项。如果您不确定所选文件夹中的TXT文件可能包含哪些内容,请使用选项模拟=真(这是默认设置)。争论报告=真指示中函数的输出R(右)将是一个data.frame,其中包含驱动器上哪些文件已更改以及如何更改的报告。

阅读“LexisNexis”文件以获取元、文章和段落

该软件包的主要功能是lnt_read().它将原始文件转换为三个不同的数据帧嵌套在类的特殊S4对象中LNT输出.这三个数据框架包含(1.)文章的元数据,(2.)文章本身,以及(3.)段落。

有几个重要的关键字用于将原始文章拆分为文章文本和元数据。这些需要以某种形式提供,但可以保留为“auto”,以便在几种语言中使用“LexisNexis”默认值。所有关键字都可以是正则表达式,并且在大多数情况下都需要是:

  • start_关键字:英文默认值为“\d+of\d+DOCUMENTS$”,它代表例如“1/112 DOCUMENT”。它用于将TXT文件中的文本拆分为单独的文章。除了使用当前支持的语言以外的其他语言处理文档外,您不必在此处更改任何内容。
  • end_keyword(结束关键字):此关键字用于删除文章末尾不必要的信息。通常,这是“^LANGUAGE:”。如果找不到关键字,则附加信息将出现在文章文本中。
  • 长度关键字:此关键字通常只是“^LENGTH:”(或其他语言中的等效词),用于查找有关文章长度的信息。然而,由于这始终是元数据的最后一行,所以它用于分隔元数据和文章文本。似乎只有一种情况缺少此信息:如果文章仅由图形组成(“LexisNexis”无法检索)。来自的最终输出lnt_read()具有名为的列图解的,指示是否缺少此关键字。然后,文章文本也包含所有元数据。在这些情况下,您应该在检查完整个文章后将其删除。(使用查看(LNToutput@文章$文章[LNToutput@meta$Graphic])在类似电子表格的查看器中查看这些文章。)

要使用此函数,您可以再次提供文件名、文件夹名或不提供任何内容,以便在当前工作目录中搜索相关文件,如x个参数:

LNT输出 <-lnt_read(读入)(x个 =获取()
##正在从1个文件创建LNToutput。。。##  ...加载的文件[0.0016秒]##  ...物品分割[0.0089秒]##  ...提取的长度[0.0097秒]##  ...提取的报纸[0.01秒]##  ...提取的日期[0.012秒]##  ...作者提取[0.013秒]##  ...提取的部分[0.014秒]##  ...提取的版本[0.014秒]##  ...提取的标题[0.016秒]##  ...转换的日期[0.023秒]##  ...提取的元数据[0.026秒]##  ...提取的文章文本[0.029秒]##  ...提取的段落[0.041秒]##  ...从文章中删除多余的空白[0.044秒]##  ...从段落中删除多余的空白[0.046秒]##经过时间:0.047秒

类的返回对象LNT输出拟用作中间容器。由于它将文章和段落存储在两个单独的data.frames中,嵌套在S4对象中,因此相关的文本数据将以几乎相同的格式存储两次。这样做的优点是不需要使用特殊字符,例如“\n”。然而,当您直接保存文件时,它会使文件变得很大。

但是,可以使用以下命令将对象轻松转换为常规data.frames@要选择所需的data.frame:

元数据 <- LNT输出@
文章_df <- LNT输出@条款
段落_df <- LNT输出@段落

#打印元数据以了解数据头部(图元_df,n个 = )
身份证件 源文件(_F) 报纸 日期 长度 章节 作者 版本 标题 图解的
1 样本文件_20091201-20100511_1-10.txt Guardian.com网站 2010-01-11 355字 不适用 安德鲁·斯派洛 不适用 Lorem ipsum悲哀坐amet 错误的
2 示例文件_20091201-20100511_1-10.txt 守护者 2010-01-11 927字 不适用 提斯多尔 不适用 Lorem ipsum悲哀坐amet 错误的
示例文件_20091201-20100511_1-10.txt 《太阳报》(英国) 2010-01-11 677字 特征;第6页 特雷沃·卡瓦纳 第1版;苏格兰 Lorem ipsum悲哀坐amet 错误的

如果只想保留一个包含元数据和文本数据的data.frame,您可以轻松做到:

元_项目_ df <-lnt_convert(转换)(LNT输出, = "数据帧")#或者保留段落
元段落.df <-lnt_convert(转换)(LNT输出, = "数据帧",什么 = "段落")

或者,您可以使用函数将LNToutput对象转换为其他包中常见的格式lnt_convert(转换):

rDNA_文档 <-lnt_convert(转换)(LNT输出, = "rDNA")数量_ corpus <-lnt_转换(LNT输出, = "夸特达")t珊瑚 <-lnt_convert(转换)(LNT输出, = "企业工具")整齐的 <-lnt_转换(LNT输出, = "潮汐文字")语料库 <-lnt_convert(转换)(LNT输出, = "tm(tm)")数据库位置 <-lnt_convert(转换)(LNT输出, = "数据库")

请参见?lnt_convert(转换)有关详细信息和评论,请参见这个问题如果您想将格式添加到convert函数中。

识别高度相似的文章

在“LexisNexis”中,有一个选项可以对高度相似的文章进行分组。然而,经验表明,此功能并不总是完美的。使用“LexisNexis”数据时的一个常见问题是,许多文章似乎被交付了两次或更多次。虽然可以使用(例如)筛选出直接重复项,LNToutput<-LNToutput[!重复(LNToutput@文章$文章),]这不适用于差异较小的文章。因此,当两篇文章之间的一个逗号或空格不同时,它们被视为不同的。

功能lnt_相似性()结合了来自夸特达相对较慢但更准确Levenshtein距离比较当天发表的所有文章。如果数据集中每天都有许多文章发表,计算Levenshtein距离可能会非常慢。如果您认为在您的情况下,不太准确的相似性度量可能就足够了,只需使用rel_dist=假.最简单的使用方法lnt_相似性()是输入一个LNT输出对象。但是,也可以单独提供文本、日期和ID:

#提供LNToutput
复制_df <-lnt_相似性(LNT输出 = LNT输出,门槛 = 0.97)
#或者将重要部分分开
复制_df <-lnt相似性(文本 = LNT输出@条款$第条,日期 = LNT输出@$日期,标识 = LNT输出@条款$身份证件,门槛 = 0.97)
##正在检查4个日期内10篇文章的相似性。。。##  ...用于相似性比较的quanteda dfm[0.063秒]。##  ...处理日期2010年1月8日:发现0个重复[0.064秒]。##  ...处理日期2010年1月9日:发现0个重复[0.064秒]。##  ...处理日期2010年1月10日:发现0个副本[0.25秒]。##  ...处理日期2010年1月11日:发现5个副本[3.05秒]。##阈值=0.97;处理4天;发现重复5次;在3.05秒内

现在可以使用函数检查结果lnt_diff():

lnt差异(复制_df,最小值 = 0,最大值 = Inf公司)

差异

默认情况下,25个随机选择的文章会一个接一个地显示,按最小和最大限制内的最小到最大差异排序。

选择好截止值后,可以将复制_dfdata.frame并删除相应的文章:

复制_df <- 复制_df[重复_df$关系列表(_D) < 0.2]LNT输出 <- LNT输出[!LNT输出@$身份证件 %单位:% 复制_df$重复ID(_D), ]

注意,您可以使用方括号将LNToutput对象子集化,就像在常规data.frame中一样。

LNT输出[1, ]#>“LNToutput”类的对象:
#>1篇文章
#>5段
#>#A台:1×10
#>ID Source_File报纸日期长度部分作者
#><int><chr><chr><date><chr
#>1 1 SampleFile_2009…卫报。…2010年1月11日355 w.…<NA>安德鲁…
#>#…还有3个变量:版本<chr>、标题<chr>,
#>#图形<lgl>
#>#A台:1×2
#>ID文章
#><int><chr>
#>11 Lorem ipsum dolor sit amet,献祭祭祀精英。埃蒂…
#>#A台:5×3
#>Art_ID Par_ID段落
#><int><int><chr>
#>11 Lorem ipsum悲哀坐在amet,神圣的祈祷…
#>2 1 2 Duis eleifend ipsum vehicula nunc luctus前庭。…
#>3 1 3 Sed ut ex-quis nisi interdum ornare quis velit。…
#>4 1 4 Aliquam ut consectetur urna,et dignissim turpis。Ut…
#>5 1 5 Fusce坐在aliquet lorem,id faucibus nisl。空…

在这种情况下,写[1, ]传递一个LNToutput对象,该对象仅包括第一篇文章以及属于它的元数据和段落。

现在您可以提取其余的文章或将其转换为您喜欢的格式。

#'生成没有高度相似重复的新数据帧
元数据 <- LNT输出@
文章_df <- LNT输出@条款
段落_df <- LNT输出@段落

#打印例如meta以查看数据如何更改头部(元数据,n个 = )
身份证件 源文件(_F) 报纸 日期 长度 章节 作者 版本 标题 图解的
1 示例文件_20091201-20100511_1-10.txt Guardian.com网站 2010-01-11 355字 不适用 安德鲁·斯派洛 不适用 Lorem ipsum悲哀坐amet 错误的
2 示例文件_20091201-20100511_1-10.txt 守护者 2010-01-11 927字 不适用 提斯多尔 不适用 Lorem ipsum悲哀坐amet 错误的
示例文件_20091201-20100511_1-10.txt 《太阳报》(英国) 2010-01-11 677字 特征;第6页 特雷沃·卡瓦纳 第1版;苏格兰 Lorem ipsum悲哀坐amet 错误的

查找关键字

在从“LexisNexis”下载时,您已经使用关键字从更大的集合中筛选相关文章。然而,在处理数据时,您的焦点可能会改变,或者您可能希望在集合中找到关键字的不同版本。两者都可以使用lnt_lookup(查找):

lnt_lookup(查找)(LNT输出,图案 = "统计计算")#> $`1`
#>空
#>
#> $`2`
#>无效
#>
#> $`3`
#>无效
#>
#> $`7`
#>空
#>
#> $`8`
#>空
#>
#> $`9`
#>[1]“统计计算”
#>
#> $`10`
#>空

输出显示,关键字模式仅在ID为9的文章中找到,所有其他值为无效的,这意味着找不到关键字。如果您的焦点转移,并且您希望将数据子集化为仅包含提及此关键字的文章,则可以将此信息附加到LNToutput对象中的元信息,然后将其子集化为列表条目不同于的文章无效的.

LNT输出@$统计数据 <-lnt_lookup(查找)(LNT输出,图案 = "统计计算")LNT输出 <- LNT输出[!愚蠢的(LNT输出@$统计数据,是不完整的), ]LNT输出
#>“LNToutput”类的对象:
#>1篇文章
#>7段
#>#A台:1×11
#>ID Source_File报纸日期长度部分作者
#><int><chr><chr><date><chr
#>1 9 SampleFile_20…Sunday Mi…2010-01-10 446 wo…新闻…罗斯·I…
#>#…还有4个变量:版本<chr>、标题<chr]、,
#>#Graphic<lgl>,统计数据<named list>
#>#A台:1×2
#>ID文章
#><int><chr>
#>19R是一种编程语言和自由软件环境,用于…
#>#A台:7×3
#>Art_ID Par_ID段落
#><int><int><chr>
#>1 9 67 R是一种编程语言和自由软件环境…
#>2 9 68 R是一个GNU包。R软件的源代码…
#>3 9 69 R是S编程语言的一个实现…
#>4 9 70 R由Ross Ihaka和Robert Gentleman在…
#>5 9 71 R及其库实现了多种统计…
#>6 9 72 R的另一个优点是静态图形,它可以…
#>#…还有一行

该函数的另一个用途是找出关键字在集合中的版本。可以通过使用正则表达式来实现。下面查找以“stat”开头的单词,后面跟着更多的字符,直到单词的末尾(模式内部始终以单词边界开始和结束)。

lnt_lookup(查找)(LNT输出,图案 = "统计*?")#> $`9`
#>[1]“统计”“统计学家”“统计”
#>[5]“统计”、“统计”“静态”

你可以使用表格()计算模式的不同版本:

表格(未列出(lnt_lookup(LNT输出,图案 = "统计+?\\b条")))#>
#>静态统计统计学家
#>             1             5             1

问题和疑问?

以下是中的常见功能LexisNexis工具。您是否觉得包中缺少任何内容,或者其中一个功能没有发挥作用?在此处提交问题,让我知道:问题跟踪器.