如何使用R从全文中提取字符串?

mwngjboj  于 2022-12-25  发布在  其他
关注(0)|答案(2)|浏览(148)

我现在被一个问题搞糊涂了,我有3,000多条观察,每条观察都是全文,比如:

text="Ganluo County People's Court of X Province。The plaintiff X, female, born on May, 1980, lives in X County, X Province。The defendant X, male, born on May, 1971, lives in X County, X Province。
It is a divorce dispute, according to 《marriage law》on June 21, 2016。"

现在,我想为原告和被告提取信息,也想知道这篇全文是否包含“《婚姻法》"一词(T代表是,F代表否)
因此,我希望得到以下结果:
| 正文|原告|被告|定律|
| - ------|- ------|- ------|- ------|
| X省甘洛县人民法院,原告X,女,1980年5月生,住X省X县,被告X,男,1971年5月生,住X省X县,根据2016年6月21日《婚姻法》的规定,属离婚纠纷。|原告X,女,1980年5月生,住X省X县。|被告人X,男,1971年5月生,住X省X县。|T型|
我试了好几次,但都不行.非常感谢你的帮助!
随访:
谢谢您的回答,但难点在于全文可能有很多句子以“原告”开头,以标点符号“."结尾,如何只提取首次出现的有原告出生、居住信息的句子,顺序不固定,标点符号总是用来的。
比如整篇文章也可能有“原告声明自己错了”这样的句子,前面答案给的句型也会提取这句话,我不想要。

gupuwyp2

gupuwyp21#

使用str_extractsub的一种方法。替换将删除任何后续句子(如果它们存在)。因此检测到的 * 原告 * 和 * 被告 * 只能是一个句子长(以作为分隔符)。

library(dplyr)
library(stringr)

tibble(text) %>% 
  mutate(plaintiff = sub("(。).*", "\\1", str_extract(text, "The plaintiff.*。")), 
         defendant = sub("(。).*", "\\1", str_extract(text, "The defendant.*。")), 
         law = grepl("《marriage law》", text)) %>% 
  print(Inf)
# A tibble: 1 × 4
  text                                                     plain…¹ defen…² law  
  <chr>                                                    <chr>   <chr>   <lgl>
1 "Ganluo County People's Court of X Province。The plaint… The pl… The de… TRUE 
# … with abbreviated variable names ¹​plaintiff, ²​defendant

全输出

# A tibble: 1 × 4
  text                                                                          
  <chr>                                                                         
1 "Ganluo County People's …
  plaintiff                                                                  
  <chr>                                                                      
1 The plaintiff X, female, born on May, 1980, lives in X County, X Province。
  defendant                                                                
  <chr>                                                                    
1 The defendant X, male, born on May, 1971, lives in X County, X Province。
  law  
  <lgl>
1 TRUE
扩展数据
text <- "Ganluo County People's Court of X Province。The plaintiff X, female, born on May, 1980, lives in X County, X Province。The defendant X, male, born on May, 1971, lives in X County, X Province。The plaintiff wuen weofioi woe fowie fowie fowei f。The defendant wuen weofioi woe fowie fowie fowei f。The plaintiff wuen weofioi woe fowie fowie fowei f。The defendant wuen weofioi woe fowie fowie fowei f。The plaintiff wuen weofioi woe fowie fowie fowei f。The plaintiff wuen weofioi woe fowie fowie fowei f。\nIt is a divorce dispute, according to 《marriage law》on June 21, 2016。"
x8diyxa7

x8diyxa72#

更新

根据您提供的其他信息,看看这是否适合您。
这里假设原告和被告各只有一个句子,我在"province"的末尾加上了.*(如Province),这样,如果 * Province * 不是句子的末尾,它仍然包含整个句子,我省略了P,这样,如果大小写不一致,也没关系。
我使用[^。]+捕获 * 除句点之外的任何内容 *,因此它只能捕获一个句子。
它仍然假定句子以"原告"(或被告)开头。
如果这不起作用,您确实需要提供更多的潜在内容示例。

library(tidyverse)

td3 <- data.frame(oText = text) %>% 
  extract(into = c('plaintiff', 'defendent'), remove = F, col = oText,
          regex = "^.*(The plaintiff[^。]+rovince.*。).*(The defendant[^。]+rovince.*。).*") %>% 
  mutate(law = str_detect(oText, 'marriage law'))

最初...
你在这里展示的模式有多严密?原告是否总是在第二句话中?被告的描述是否总是跟随原告?是否总是使用标点符号?
这里有一个处理这些数据的方法。这个方法不假设任何给定的顺序,但是它假设使用了标点符号。
在所使用的正则表达式中,您可以看到"原告"(或被告),后面跟着.*,这意味着后面跟着任何内容,然后是?,这告诉我们我们希望先行查找的第一次出现。先行查找,或者我们希望正则表达式停止查找的位置,记录在(?= )中。您在句子末尾奇怪地编码了.(假设这是翻译的)。
如果你的真实数据中有句点或其他可识别的特殊字符,你必须对它进行转义。在这个正则表达式中,你看到句点后面跟星号的代码是...和其他任何东西...所以如果你要查找句点或星号,你必须对它进行"转义",这样正则表达式进程才能知道你指的是字符的字面意思。

library(tidyverse)
library(stringi)

tdf <- data.frame(oText = text) %>% 
  mutate(plaintiff = stri_extract_first_regex(oText, 'The plaintiff.*?(?=(。))'),
         defendent = stri_extract_first_regex(oText, 'The defendant.*?(?=(。))'),
         law = str_detect(oText, 'marriage law'))

如果模式是严格的,您可能会使用dplyr::separate来使这变得更加容易。

相关问题