파이썬으로 나무위키 JSON 덤프 데이터 파싱하기

김희규
4 min readJul 27, 2020

기계학습 등에 사용할만한 한글 데이터가 많지 않은데. 나무위키 문서는 양도 많고(78만개….!) 뉴스나 위키백과에 비해 내용도 풍부하다(신조어 등). 그래서 이걸 미리 파싱해두면 여기저기 쓸 곳이 많다.

준비물

  1. ijson 패키지
  2. namu-wiki-extractor
  3. 나무위키 json 덤프 파일

힘들게 크롤링하지말고 덤프 씁시다 나무위키 덤프

압축을 푼 JSON 파일이 12GB이기 때문에 json.loads 등으로 한번에 파싱하는건 불가능하다. ijson을 이용해서 파일을 천천히 읽으면서 파싱해야한다.

우선 파일 구조는 아래와 같다.

[
{
"namespace": str,
"title": str,
"text": str,
"contributors": [str]
},
...
]

파일은 namespace, title, text, contributors(str array)를 가진 object들의 array이다.

먼저 ijson 으로 파일을 읽어들이면서 yield로 넘긴다. 자세한 사용법은 ijson github 참고. 이제 처리를 좀 해야한다. 텍스트를 보면 아래처럼 위키 형식으로 되있다.

=== [[신 세계수의 미궁 밀레니엄의 소녀|신 세계수의]] [[신 세계수의 미궁 2 파프니르기사|미궁 시리즈]] === 채집 방식이 한 턴으로 끝나는 구조[* 채집으로 한 번 아이템을 획득하면 "다시, (채집 스킬)에 의해..."가 뜨면서 한꺼번에 획득되는 구조.]로 바뀐 덕분인지 강제 조우로 다시 회귀해버렸다(...). 그나마 위험 감지 먹통과 같은 버그성 난점들은 수정되었다. 그 이후에 나온 [[세계수의 미궁 5 오랜 신화의 끝]]과 시리즈의 집대성 작품이자 3DS 마지막 작품인 [[세계수의 미궁 X]]도 마찬가지.

이거를 namu-wiki-extractor 를 이용하면 아래의 결과를 얻는다.

신 세계수의 미궁 시리즈 채집 방식이 한 턴으로 끝나는 구조로 바뀐 덕분인지 강제 조우로 다시 회귀해버렸다(...). 그나마 위험 감지 먹통과 같은 버그성 난점들은 수정되었다. 그 이후에 나온 세계수의 미궁 5 오랜 신화의 끝과 시리즈의 집대성 작품이자 3DS 마지막 작품인 세계수의 미궁 X도 마찬가지.
채집으로 한 번 아이템을 획득하면 "다시, (채집 스킬)에 의해..."가 뜨면서 한꺼번에 획득되는 구조.

주의해야 할 것이 중간에 각주 [* 채집으로 한 번 아이템을 획득하면 “다시, (채집 스킬)에 의해…”가 뜨면서 한꺼번에 획득되는 구조.] 가 사라지고 문장의 끝부분에 추가되는 걸 볼 수 있다. 이게 싫으면 미리 제거해야한다.

거기에 추가적으로 작업을 해준다.

  1. 괄호로 둘러쌓인 부분 제거 — 안녕(하세요) → 안녕
  2. 각주 제거하기 등

위 코드로 이전의 나무위키 텍스트를 다시 파싱하면 아래와 같은 결과물이 나온다.

세계수의 미궁 4 전승의 거신 기본적인 것은 3편과 같지만, 4편에서는 움직이지 않고 채집할 때도 턴이 경과하도록 조정되었기 때문에 주변에 있는 FOE를 잊고 채집에 몰두하다가 FOE와 부딪히면 FOE 버전 !!아앗!!이 뜬다. 그리고 난이도 CASUAL로 플레이시, FOE로 인한 !!아앗!!을 제외하면 절대로 발생하지 않는다.

+추가) 이 방법은 각주 내에 또 다른 마크다운이 있을 경우 제대로 작동하지 않습니다 ㅠㅠ

이제 이거를 jsl 파일(한 줄이 하나의 json object)로 저장하면 이전보다 파싱하기 편할것이다. 한 줄씩 읽으면 되니까

근데 코랩에서 하니까 한 7만개쯤 하면 아무것도 안뜨는 OSError 뜨면서 터진다… 뭐지 ? ㅠㅠ disk IO 를 너무 많이했나…

References

--

--

김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.