2017-11-09 13 views
2

우수한 tidytext 패키지를 사용하여 몇 가지 단락으로 문장을 토큰 화합니다. 예를 들어, 다음 단락을 갖고 싶습니다.약어를 무시하고 unnest_tokens()를 사용하여 문장의 토큰 화하기

"나는 다르 씨가 결함이 없다는 것을 완벽하게 확신합니다. 그는 자기 자신을 변장없이 소유하고 있습니다."

두 문장

  1. 로를 토큰 화는 "나는 미스터 다아시가 결함이 없다고 그것으로 완벽하게 확신합니다."
  2. "그는 변장없이 직접 소유하고 있습니다."

그러나 tidytext의 기본 문장 토크 나이저를 사용할 때 나는 세 문장을 얻습니다.

코드

df <- data_frame(Example_Text = c("I am perfectly convinced by it that Mr. Darcy has no defect. He owns it himself without disguise.")) 


unnest_tokens(df, input = "Example_Text", output = "Sentence", token = "sentences") 

문장을 토큰 화하는 tidytext를 사용하는 간단한 방법은 무엇 결과

# A tibble: 3 x 1 
           Sentence 
           <chr> 
1 i am perfectly convinced by it that mr. 
2     darcy has no defect. 
3 he owns it himself without disguise. 

하지만 예 : "씨"와 같은 일반적인 약어 문제로 실행하지 않고 또는 "Dr." 문장 끝으로 해석 되는가?

+0

다음은 중대한 답변입니다. 간단히하기 위해 tidytext의 기본 토큰 화는 tokenizers 패키지에서 제공되며 문장 토큰 화가 여기 구현 된 방법을 볼 수 있습니다. https://github.com/ropensci/tokenizers –

답변

2

당신은 분할 조건으로 정규식을 사용할 수 있지만,이 모든 일반적인 hororifics 포함 것이라는 보장은 없습니다 :

unnest_tokens(df, input = "Example_Text", output = "Sentence", token = "regex", 
       pattern = "(?<!\\b\\p{L}r)\\.") 

결과 :

# A tibble: 2 x 1 
                Sentence 
                 <chr> 
1 i am perfectly convinced by it that mr. darcy has no defect 
2       he owns it himself without disguise 

당신은 물론 항상 만들 수는 공통 제목의 나만의 목록을 만들고 그 목록을 기반으로하는 정규 표현식을 만듭니다.

titles = c("Mr", "Dr", "Mrs", "Ms", "Sr", "Jr") 
regex = paste0("(?<!\\b(", paste(titles, collapse = "|"), "))\\.") 
# > regex 
# [1] "(?<!\\b(Mr|Dr|Mrs|Ms|Sr|Jr))\\." 

unnest_tokens(df, input = "Example_Text", output = "Sentence", token = "regex", 
       pattern = regex) 
+1

이 해결책은 불행히도 "따옴표"로 끝나는 문장을 중단시킵니다. " (미국 타이포그래피에서는 인용 부호 안에 닫는 구두점을 넣습니다.) 구두점을 없애면 문제가되지 않을 수도 있습니다. –

2

corpusquanteda은 문장 경계를 결정할 때 약어를 특별하게 처리합니다. 당신이 unnest_tokens을 고수 할 경우

library(dplyr) 
library(corpus) 
df <- data_frame(Example_Text = c("I am perfectly convinced by it that Mr. Darcy has no defect. He owns it himself without disguise.")) 

text_split(df$Example_Text, "sentences") 
## parent index text               
## 1 1   1 I am perfectly convinced by it that Mr. Darcy has no defect. 
## 2 1   2 He owns it himself without disguise. 

하지만, 영문 약어에 대한보다 완전한 목록은, 사용자의 조언 @ 따를 수 싶지만합니다 (코퍼스 약어 목록을 사용하여 다음과 같습니다 신체와 문장을 분할하는 방법 그 중 대부분은 Common Locale Data Repository에서 가져 왔습니다.) :

abbrevations_en 
## [1] "A."  "A.D."  "a.m."  "A.M."  "A.S."  "AA."  
## [7] "AB."  "Abs."  "AD."  "Adj."  "Adv."  "Alt."  
## [13] "Approx." "Apr."  "Aug."  "B."  "B.V."  "C."  
## [19] "C.F."  "C.O.D." "Capt." "Card." "cf."  "Col."  
## [25] "Comm." "Conn." "Cont." "D."  "D.A."  "D.C."  
## (etc., 155 total)