자바스크립트를 활성화 해주세요

v030 한국인 이름 데이터 얻기

 ·  ☕ 3 min read

계기

취미로 소설이나 상황극, 꽁트극등을 적고 있습니다. 전문적인 수준은 아니고 아마추어수준의 글입니다만, 언젠가는 멋진 소설을 써보고 싶다는 생각도 있습니다. 그런데, 가끔 등장인물의 이름을 정하는 것에 시간을 쓰는 경우가 있습니다.

등장인물의 이름은 인물의 성격이나 운명을 나타내기도 하는 중요한 아이템입니다. 고민하지 않고, 쓱 하고 캐릭터의 이름을 작명하는 분도 계시겠지만, 저는 여기에서도 고민하게 됩니다. 그래서 일단은 머리속에 떠오른 이야기를 써내려가다가 나중에 작명하는 경우도 있습니다.
나중에 치환할 placeholder정도만 정해둔 채로 말이죠 예를 들면

{{청년1}}, {{여자아이1}}, {{상인1}}`

등과 같이 말이죠. 대게 나이나 직업등과 같이 캐릭터를 대표하는 단어에 일련번호를 붙여놓고 사용합니다만, 캐릭터의 정의가 되어있지 않다는 점에서 이야기가 뻗어가지 않습니다. 특히 비중이 있는 캐릭터인 경우는 더 그렇습니다.

한국인 이름 구하기

등장인물이 한국인인 경우는 랜덤으로 만들어내는 경우도 있겠습니다만, 인터넷을 통해서 검색을 해봅니다. 간혹 매스컴을 타고 있는 인물의 이름과 겹치는 경우가 있다면, 가능하면 피하려고 합니다. 그러던 중에, 이름을 검색해 볼 수 있는 사이트를 알게 되었습니다.

https://efamily.scourt.go.kr/ 에서 정보를 얻을 수 있나 봅니다. 그런데 이미 이 사이트로부터 통계등을 취득해 서비스하고 있는 사이트가 있었습니다. 조사하면 더 있는 지도 모르겠습니다만, 다음의 두개의 사이트를 참조할 수 있었습니다.

그중에서도 https://www.namechart.kr 가 가장 심플한 인터페이스를 사용하고 있어서 사용하기가 편했습니다.

https://www.namechart.kr

v030_namechart_kr.png

namechart.kr

이 사이트는 Ajax로 데이터를 취득하고 있었는데, 헤더를 보니 Access-Control-Allow-Origin: *으로 사용하고 있었습니다. 다른 사이트에서도 Ajax사용을 허용해 주시고 있어서 다른 곳에서도 API로 사용해 보는 것이 가능했습니다.

v030_namechart_kr_chrome_network.png

호출하는 uri의 패턴은 다음과 같았습니다. 호출하는 파라메터의 패턴이 알기 쉽게 설계되어 있었습니다..
https://api.namechart.kr/search?query=%EC%A7%80*&order=tc&page=1&size=30

이런 식으로 호출을 해주더라구요. 그래서, page의 parameter만 바꾸어 호출해보았습니다. 언어는 powershell.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
foreach($i in 1..1169) {
    $res = curl "https://api.namechart.kr/chart/overall?gender=t&page=$i&size=50"
    $objs = convertfrom-json $res.Content
    $objs = [System.Text.Encoding]::UTF8.GetString( [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($res.Content) )
    $objs = convertfrom-json $objs
    $objs.items | Export-Csv -NoTypeInformation korean_name.csv -Encoding UTF8 -Append 
    write-host $i
}

$korean_names = Import-Csv -Encoding UTF8 .\korean_name.csv -Header @('ranking', 'name', 'count', 'total', 'male', 'female')
$korean_names | ft

여기서 curl 은 Invoke-WebRequest의 alias입니다. 이를 사용하면, defaut encoding을 사용하기 때문에 UTF8의 데이터는 약간의 가공을 거쳐야 합니다.

Invoke-WebRequest와 비슷한 것으로 Invoke-WebRequest이 있는데, 이는 API쪽이라면 이쪽도 사용할 수 있습니다. 바로 object 로 deserialized시켜서 되돌려 주거든요. Invoke-WebRequest를 사용한다면 UTF8로 변환은 다음과 같이 해줍니다.

1
2
$res = Invoke-RestMethod "https://api.namechart.kr/chart/overall?gender=t&page=1&size=50"
$html=[system.Text.Encoding]::UTF8.GetString($resp.RawContentStream.ToArray());

실행해본 결과는 다음과 같습니다.

v030_korean_name_csv.png

2,271,637 의 크기 정도의 csv를 얻었네요

이로써, 최신의 데이타는 아닙니다만, 소설에서 사용할 용도의 이름사전정도로는 사용할만한 데이터를 얻었습니다.

사용하기

네. 이런 식으로 사용합니다.

1
2
$korean_names | ? {( [int]($_.female) -gt [int]($_.male)) -and ( [int]($_.ranking) -lt 1000)} | `
    Get-Random -Count 3 -SetSeed (Get-Date).Second | ft
1
2
3
4
5
6
7
8
(base) PS D:\Users\Administrator> $korean_names | ? {( [int
]($_.female) -gt [int]($_.male)) -and ( [int]($_.ranking) -lt 1000)} | Get-Random -Count 3 -SetSeed (Get-Date).Second | ft

ranking name count total male female
------- ---- ----- ----- ---- ------
746     서경   1376  1376  114  1262  
694     아정   1534  1534  3    1531  
745     루다   1377  1377  520  857  

개선사항

개선사항으로 얘기해보자면,

  • header string도 포함해서 저장합니다. 저장된 파일의 첫 줄을 보면 알 수 있습니다.
    • import-csv할 때, 이것도 함께 load 해버리기 때문입니다.
    • 자동화 해서 처리하자면 할 수 있습니다만, 그냥 필요할 때 하시면 될 것 같습니다.
  • 저장할 떼, 숫자도 문자타입으로 저장합니다. int로 변환해서 저장할 수도 있습니다만,
    • 그냥 필요할 때 하시면 될 것 같습니다.

이상입니다.

Ref

공유하기

tkim
글쓴이
tkim
Software Engineer