氏名の生成(1)

実在する姓と名を組み合わせる方法で、テストに使う氏名のデータ作成をしてみた。


明治安田生命のサイトの情報を使おうとしたが、最近の子の名前がさっぱり読めないのであきらめる。

明治安田生命 全国同姓調査を実施~
https://www.meijiyasuda.co.jp/profile/news/release/2018/pdf/20180808_01.pdf
名前ベスト100
https://www.meijiyasuda.co.jp/enjoy/ranking/best100/index.html


次にbリーグの選手の名前を使用させてもらおうと考えた。


・WSL2, Ubuntu の環境にnokogiriをインストールする。
Installing Nokogiri
https://nokogiri.org/tutorials/installing_nokogiri.html


・以下のプログラムを参考に、指定したURLのページから<a>要素の「文字列」と「href属性のURL」を書き出すプログラムを作成する。


参考にしたプログラム
https://nokogiri.org/#parsing-and-querying

#! /usr/bin/env ruby

require 'nokogiri'
require 'open-uri'

# Fetch and parse HTML document
doc = Nokogiri::HTML(URI.open('https://nokogiri.org/tutorials/installing_nokogiri.html'))

# Search for nodes by css
doc.css('nav ul.menu li a', 'article h2').each do |link|
  puts link.content
end

# Search for nodes by xpath
doc.xpath('//nav//ul//li/a', '//article//h2').each do |link|
  puts link.content
end

# Or mix and match
doc.search('nav ul.menu li a', '//article//h2').each do |link|
  puts link.content
end


作成したプログラム
(scrape_a.rb)

#!/usr/bin/env ruby

require 'nokogiri'
require 'open-uri'

# Fetch and parse HTML document
doc = Nokogiri::HTML(URI.open(ARGV[0]))

puts "### Search for nodes by css"
doc.css('a').each do |link|
  print "#{link.content}\t#{link[:href]}\n"
end


・b1のチーム情報のページにアクセスし、各チームの選手一覧のURLを調べる。
 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/b1/teams/


・上記のscrape_a.rbを使用して、選手一覧のページから、選手名と個人データのページのURLを取り出す。

$ ./scrape_a.rb https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/teams/player/693/
...
大浦 颯太	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030513/
細谷 将司	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008712/
野本 建吾	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008486/
アレックス・デイビス	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1033045/
伊藤 駿	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008446/
中山 拓哉	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1010848/
長谷川 暢	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1015829/
多田 武史	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030457/
保岡 龍斗	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1010878/
ハビエル・カーター	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1025267/
カディーム・コールビー	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1012459/
古川 孝敏	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008500/
...


・各選手のページから、氏名、氏名(かな)を取り出す。

大浦 颯太選手のページをみると、氏名、氏名(かな)が見つかる。
https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030513/

...
      <div class="nameContainer"><h1 class="name">大浦 颯太<span class="kana">OuraSota</span></h1></div>
...

氏名(かな)の方は、class="kana" で取り出せそうだが、氏名の方は、他にclass="name"を使っている箇所があるので、class="nameContainer"を指定して、<h1 class="name">大浦 颯太<span class="kana">OuraSota</span></h1> のくくりでしか取り出せないのか?


ー外国人の氏名(かな)の並びー

アレックス・デイビス選手の場合

...
      <div class="nameContainer"><h1 class="name">アレックス・デイビス<span class="kana">DavisAlex</span></h1></div>
...

Davisが先になってる。


ケドリック・ストックマン・ジュニア選手の場合

...
      <div class="nameContainer"><h1 class="name">ケドリック・ストックマン・ジュニア<span class="kana">Stockman Jr.Kedrick</span></h1></div>
...

Jr. が真ん中にきている。!?


ジェームズ・マイケル・マカドゥ選手の場合

...
      <div class="nameContainer"><h1 class="name">ジェームズ・マイケル・マカドゥ<span class="kana">Michael McadooJames</span></h1></div>
...

ミドルネームがある人は、先頭にきている!どういうルール!?


ジュニア
wikipedia:ジュニア


ミドルネーム
https://app-flamingo.com/blog/tip-180210/#:~:text=%E3%83%9F%E3%83%89%E3%83%AB%E3%83%8D%E3%83%BC%E3%83%A0%E3%81%A8%E3%81%AF%E3%80%81%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88,%E3%81%AE%E3%81%93%E3%81%A8%E3%82%92%E6%8C%87%E3%81%97%E3%81%BE%E3%81%99%E3%80%82



・選手のURL一覧を読み込み、姓、ミドルネーム、名を個別のファイルに出力するプログラムを作る
(urls.txt)

$ more urls.txt 
大浦 颯太	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030513/
細谷 将司	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008712/
野本 建吾	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008486/
アレックス・デイビス	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1033045/
...


(scrape_bbplayer.rb)

#!/usr/bin/env ruby

require 'nokogiri'
require 'open-uri'
require 'uri'

file = File.open(ARGV[0], "r")
file_name_family = File.open("name_family.txt","w")
file_name_middle = File.open("name_middle.txt","w")
file_name_first  = File.open("name_first.txt","w")

file.each do |rec|
 
  STDERR.puts rec

  url = rec.chomp.split(/\t/)[1]

  begin
    URI.parse(url)
    doc = Nokogiri::HTML(URI.open(url))
  rescue => e
    p e
    next
  end

  #氏名の処理
  /^<[^>]+>([^<]+)/ =~ doc.at_css('.nameContainer').inner_html
  name = $1
  if /(\S+)(\S+)(ジュニア)/ =~ name #外国人(ジュニア)
    name_first  = $1
    name_middle = ""
    name_family = $2 + $3
  elsif /(\S+)(\S+)(\S+)/ =~ name #外国人(ミドルネームあり)
    name_first  = $1
    name_middle = $2
    name_family = $3
  elsif /(\S+)(\S+)/ =~ name #外国人(ミドルネームなし)
    name_first  = $1
    name_family = $2
    name_middle = ""
  elsif /(\S+)\s(\S+)/ =~ name #日本人
    name_family = $1
    name_first  = $2
    name_middle = ""
  else
  end

  #氏名(かな)の処理
  kana = doc.at_css('.kana').content
  if /([A-Z][a-z]+)\s(Jr\.)([A-Z][a-z]+)/ =~ kana #外国人(ジュニア)
    kana_family = $1 + $2
    kana_first  = $3
    kana_middle = ""
  elsif /([A-Z][a-z]+)\s([A-Z][a-z]+)([A-Z][a-z]+)/ =~ kana #外国人(ミドルネームあり)
    kana_family = $2
    kana_first  = $3
    kana_middle = $1
  elsif /([A-Z][a-z]+)([A-Z][a-z]+)/ =~ kana #日本人、外国人(ミドルネームなし)
    kana_family = $1
    kana_first  = $2
    kana_middle = ""
  else
  end

  #姓、ミドルネーム、名をそれぞれファイルに出力する
  
  file_name_family.print "#{name_family}\t#{kana_family}\n"
  file_name_middle.print "#{name_middle}\t#{kana_middle}\n"
  file_name_first.print  "#{name_first}\t#{kana_first}\n"

  sleep 1

end

file.close
file_name_family.close
file_name_middle.close
file_name_first.close


実行結果

$ ./scrape_bbplayer.rb urls.txt 
大浦 颯太	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030513/
細谷 将司	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008712/
野本 建吾	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008486/
アレックス・デイビス	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1033045/
...
ジョーダン・ヒース	https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1026874/
$ nl name_family.txt | more
     1	大浦	Oura
     2	細谷	Hosoya
     3	野本	Nomoto
     4	デイビス	Davis
     5	伊藤	Ito
...
    14	アウダ	Auda
    15	ストックマンジュニア	StockmanJr.
    16	カーター	Carter
...
   112	西野	Nishino
   113	マカドゥ	Mcadoo
   114	渡辺	Watanabe
...
$ nl name_middle.txt | more
     1		
     2		
     3		
     4		
     5		
...
    14		
    15		
    16		
...
   112		
   113	マイケル	Michael
   114		
...
$ nl name_first.txt | more
     1	颯太	Sota
     2	将司	Masashi
     3	建吾	Kengo
     4	アレックス	Alex
     5	駿	Takashi
...
    14	パトリック	Patrik
    15	ケドリック	Kedrick
    16	ロバート	Robert
...
   112	曜	You
   113	ジェームズ	James
   114	竜之佑	Ryunosuke
...


氏名の生成(2)