텍스트 데이터 파일 읽기에 계속 실패할 경우
read_csv
파일 읽기가 계속 실패할 경우 : 사례 연구
지인이 파일 읽기에서 계속 실패를 해서 2-3시간 동안 고생을 한 내용입니다.
openslr.org/60
에는 LibriTTS corpus라는 자료가 있습니다. 자료는 텍스트 데이터 파일과 텍스트의 육성을 녹음한 오디오 파일로 구성되어 있습니다.
텍스트 데이터 파일 이름은 libritts_train_clean_100.txt
(이름은 간단하게 수정했습니다)입니다. 여기서 열구분문자는 |
(vertical bar)이고, 각 열은 파일경로와 이름, 발화된 텍스트, 그리고 id 번호입니다. 아래는 내용 일부를 보여줍니다.
/home/mcm/pyprojects/Robust_Fine_Grained_Prosody_Control/data/LibriTTS/train-clean-100/7367/86737/7367_86737_000132_000020.wav|There was some surprise, however, that, as he was with his face to the enemy, he should have received a ball between his shoulders. That astonishment ceased when one of the brigands remarked to his comrades that Cucumetto was stationed ten paces in Carlini's rear when he fell.|7367
/home/mcm/pyprojects/Robust_Fine_Grained_Prosody_Control/data/LibriTTS/train-clean-100/7511/102419/7511_102419_000020_000000.wav|Mr. Stewart is the queerest man: instead of letting me enjoy the tableau, he solemnly drove on, saying he would not want any one gawking at him if he were the happy man.|7511
/home/mcm/pyprojects/Robust_Fine_Grained_Prosody_Control/data/LibriTTS/train-clean-100/7078/271888/7078_271888_000062_000000.wav|"It is a strange fancy of mine," she explained, when I had greeted her. "I'm sure the dress is very becoming--isn't it?" And she waved the goblet she was holding above her head.|7078
하지만 파이썬의 구버전 pandas.read_csv()
에서 계속 오류가 났습니다.
R에서 시도를 해 볼까요? 내장 함수 read.table()
보다 readr::read_delim()
이 좀더 안정적이고 편리합니다.
library(readr)
dat <- read_delim('data/libritts_train_clean_100.txt', delim='|',
col_names = c('path', 'text', 'id'))
## Rows: 3 Columns: 3
## -- Column specification --------------------------------------------------------
## Delimiter: "|"
## chr (2): path, text
## dbl (1): id
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
놀랍게도 read_delim()
이 완벽하지는 않지만 거의 정확하게 데이터를 읽었습니다.
dat['text']
## # A tibble: 3 x 1
## text
## <chr>
## 1 There was some surprise, however, that, as he was with his face to the enemy,~
## 2 Mr. Stewart is the queerest man: instead of letting me enjoy the tableau, he ~
## 3 It is a strange fancy of mine, she explained, when I had greeted her. I'm sur~
무엇이 다른가요? 텍스트에 포함된 큰 따옴표가 모두 사라져버렸습니다. 텍스트에서 큰 차이는 아니지만 따옴표 존재 유무에 따라 억양이 달라질 수 있으므로 음성 인식 또는 생성 모형 학습에서는 큰 차이를 불러올 수도 있습니다.
그렇다면 문제가 뭘까요? 우선 다른 함수도 사용해 봅시다.
dat <- read.table('data/libritts_train_clean_100.txt', sep='|',
header = FALSE,
col.names = c('path', 'text', 'id'))
## Warning in read.table("data/libritts_train_clean_100.txt", sep = "|",
## header = FALSE, : incomplete final line found by readTableHeader on 'data/
## libritts_train_clean_100.txt'
dat
## path
## 1 /home/mcm/pyprojects/Robust_Fine_Grained_Prosody_Control/data/LibriTTS/train-clean-100/7511/102419/7511_102419_000020_000000.wav
## 2 /home/mcm/pyprojects/Robust_Fine_Grained_Prosody_Control/data/LibriTTS/train-clean-100/7078/271888/7078_271888_000062_000000.wav
## text
## 1 Mr. Stewart is the queerest man: instead of letting me enjoy the tableau, he solemnly drove on, saying he would not want any one gawking at him if he were the happy man.
## 2 It is a strange fancy of mine, she explained, when I had greeted her. I'm sure the dress is very becoming--isn't it? And she waved the goblet she was holding above her head.
## id
## 1 7511
## 2 7078
두 행밖에 안 읽혔네요. 마지막으로 data.table::fread()
를 시도해 봅니다.
library(data.table)
dat <- fread('data/libritts_train_clean_100.txt', sep='|',
header=FALSE,
col.names = c('path', 'text', 'id'))
## Warning in fread("data/libritts_train_clean_100.txt", sep = "|", header =
## FALSE, : Found and resolved improper quoting in first 100 rows. If the fields
## are not quoted (e.g. field separator does not appear within any field), try
## quote="" to avoid this warning.
dat$text
## [1] "There was some surprise, however, that, as he was with his face to the enemy, he should have received a ball between his shoulders. That astonishment ceased when one of the brigands remarked to his comrades that Cucumetto was stationed ten paces in Carlini's rear when he fell."
## [2] "Mr. Stewart is the queerest man: instead of letting me enjoy the tableau, he solemnly drove on, saying he would not want any one gawking at him if he were the happy man."
## [3] "\"It is a strange fancy of mine,\" she explained, when I had greeted her. \"I'm sure the dress is very becoming--isn't it?\" And she waved the goblet she was holding above her head."
확실치 않지만 제대로 읽은 것 같기도 합니다.
이렇게 함수마다 결과가 다르게 나오네요. 한가지는 모두 경고가 나오긴 했지만 어쨋든 파일을 읽었다는 점입니다. 파이썬 판다스도 버전이 올라가면서 조금 문제가 있어도 파일을 읽기는 합니다.
그렇다면 정확하게 읽는 해결책은 무엇일까요?
해결책 : 열구분자와 인용기호
위의 fread()
결과에 힌트가 있습니다. 그리고 read_delim()
의 주요 매개변수 file
, delim
, quote
에서도 유추할 수 있습니다. 네. file=
, delim=
을 정확하게 정해준 다음에 봐야할 사항은 quote
입니다. quote=
는 열구분문자가 텍스트 자료 안에 존재할 때 이를 열구분문자와 구분하기 위해 열의 시작과 끝을 표시하는 인용기호를 정해줍니다.
그런데 우리가 다루는 텍스트 데이터 파일은 문장을 다루기 때문에 쉼표가 자주 등장하죠. 그래서 열구분문자를 흔히 쓰는 쉼표가 아니라 |
로 정한 것 같습니다. 그리고 만약 열구분자가 아닌 데이터로 |
가 등장하지 않는다면 열을 구분할 때 보조적으로 쓰이는 인용기호는 사용할 필요가 없습니다. 그래서 quote=''
으로 하면 열구분 인용기호를 사용하지 않겠다는 의미입니다.
dat <- read_delim('data/libritts_train_clean_100.txt', delim='|',
quote='',
col_names = c('path', 'text', 'id'))
## Rows: 3 Columns: 3
## -- Column specification --------------------------------------------------------
## Delimiter: "|"
## chr (2): path, text
## dbl (1): id
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
dat['text']
## # A tibble: 3 x 1
## text
## <chr>
## 1 "There was some surprise, however, that, as he was with his face to the enemy~
## 2 "Mr. Stewart is the queerest man: instead of letting me enjoy the tableau, he~
## 3 "\"It is a strange fancy of mine,\" she explained, when I had greeted her. \"~
문자열이 따옴표에 싸여 출력되고 있어서 보기 힘들다면 다음과 같이 행번호와 실제 문자열을 출력해볼 수 있습니다.
for (i in 1:nrow(dat)) {
cat(i, dat$text[i], "\n\n")
}
## 1 There was some surprise, however, that, as he was with his face to the enemy, he should have received a ball between his shoulders. That astonishment ceased when one of the brigands remarked to his comrades that Cucumetto was stationed ten paces in Carlini's rear when he fell.
##
## 2 Mr. Stewart is the queerest man: instead of letting me enjoy the tableau, he solemnly drove on, saying he would not want any one gawking at him if he were the happy man.
##
## 3 "It is a strange fancy of mine," she explained, when I had greeted her. "I'm sure the dress is very becoming--isn't it?" And she waved the goblet she was holding above her head.
보기 좋네요. 다른 함수도 동일하게 열구분 인용 기호를 수정할 수 있습니다.
책에 수록된 다음표를 참고하세요.
이렇게 여러 함수를 한꺼번에 사용하면 좋은 것은 함수마다 특징이나 작동 방식이 다르기 때문에 한 함수가 실패를 해도 다른 함수로 파일 읽기에 성공할 수 있기 때문입니다.
- 표 출처) R로 하는 빅데이터 분석: 데이터 전처리와 시각화
// add bootstrap table styles to pandoc tables function bootstrapStylePandocTables() { $('tr.odd').parent('tbody').parent('table').addClass('table table-condensed'); } $(document).ready(function () { bootstrapStylePandocTables(); });
Leave a comment