如何在R语言中计算文本行数?

3

我希望使用R语言计算不同发言人在一份文本中的发言行数(这是议会发言记录的转录稿)。原始文本如下:

MR. JOHN: This activity has been going on in Tororo and I took it up with the office of the DPC. He told me that he was not aware of it.
MS. SMITH: Yes, I am aware of that. 
MR. LEHMAN: Therefore, I am seeking your guidance, Madam Speaker, and requesting that you re-assign the duty.  
MR. JOHN: Thank you

在这份文件中,每个发言者都有一个以MR/MS开头的标识符,并且始终大写。我想创建一个数据集,计算每个发言者在文档中每次发言时所说的行数,使得上述文本的结果如下:
MR. JOHN: 2
MS. SMITH: 1
MR. LEHMAN: 2
MR. JOHN: 1

感谢使用R语言编程的技巧!

3
请查看qdap软件包中的read.transcript函数。 - Tyler Rinker
数据是什么格式?.docx吗? - Tyler Rinker
我不清楚为什么John先生第一次出现了"2"。这个"2"是否指的是他说话的句子数量?他在一行中说了两句话,在另一行中说了一句话。同样,我也不明白Lehman先生为什么出现了"2"。在你的例子中,他只说了一句话、一行字。每一行都是以先生或小姐开头吗?例如,如果X先生多嘴并连续说了三段落,那么所有的话都会在一行吗?如果不是,每一行的话是否都会以X先生为开头? - Mark Miller
1个回答

10
您可以使用模式:来拆分字符串,然后使用table
table(sapply(strsplit(x, ":"), "[[", 1))
#   MR. JOHN MR. LEHMAN  MS. SMITH 
#          2          1          1 

strsplit - 按:拆分字符串并返回列表
sapply与[[ - 选择列表的第一部分元素
table - 获取频率

编辑:根据OP的评论,您可以将记录保存在文本文件中,并使用readLines在R中读取文本。

tt <- readLines("./tmp.txt")

现在,我们需要找到一种模式来过滤只包含发言者姓名的行。根据您提供的文本,我能想到两种方法。

  • 检查是否存在冒号:,然后向查找:,看看它是否为A-Z[:punct:]中的任何一个字符(也就是说,在:之前出现的字符是大写字母或任何标点符号-这是因为有些标点符号在:之前有一个))。

您可以使用 strsplit 后跟 sapply (如下所示)

使用strsplit:

# filter tt by pattern
tt.f <- tt[grepl("(?<=[A-Z[:punct:]]):", tt, perl = TRUE)]
# Now you should only have the required lines, use the command above:

out <- table(sapply(strsplit(tt.f, ":"), "[[", 1))

还有其他可能的方法(例如使用gsub 或替代模式),但这应该可以让您了解这种方法的思路。如果模式不同,则只需更改它以捕获所有所需行。

当然,这假设没有其他行,例如像这样的行:

"Mr. Chariman, whatever (bla bla): It is not a problem"

因为我们的模式会对):返回TRUE。 如果在文本中发生这种情况,你需要找到一个更好的模式。


2
+t。在你清醒的时候发帖没有意义。你什么时候睡觉? - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto,这里是晚上9点,而那里已经是凌晨1:20了! :) - Arun
只是一个小补充,如果@user2154571不知道,你可以使用x<-readLines("D:/text.txt")将文本行读入R。 - Jouni Helske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接