みみずく通信

あらふぉー

姓名判断

子供の名前を検討している。
苗字+使いたい漢字+一文字で考えているが、姓名判断で良い結果が出ないので、
「姓名判断的に良いラスト一文字の漢字」を列挙するスクリプトを書いた。
例)佐藤 孝〇のように、孝という使いたい漢字があり、ラスト一文字〇を検討中。

姓名判断は様々な流派があるが、Wikipediaをベースにしている。

「苗字+使いたい漢字」から画数を取得するには、「文字情報基盤検索システム」を利用している。
moji.or.jp
昔はAPIでの提供もあったようだが現在はされていないため、
1秒に1回しか取得しないようにしている。
また、「苗字と使いたい漢字」から画数を取得するだけなので、3回程度しかリクエストを出さないことを想定している。
例)佐藤 孝〇の場合は、「佐藤孝」の3文字の画数取得だけなので、3回リクエスト。

文字数→漢字の取得には、「漢字辞典オンライン」様を利用している。
https://kanji.jitenon.jp/cat/jimmei.htm
これは、文字数と漢字が一ページに全てまとまっており、
1回のリクエストで全ての候補漢字を取得することが可能となっている。

関数の説明
def get_kakusu(moji):
mojiに漢字を渡すと、画数が返却される

def calculate_seimei_handan_score(sei_number_of_strokes,mei_number_of_strokes):
苗字の画数の配列、名前の画数の配列を渡すと、
天格,人格,地格,総格,外格,天地同格,陰陽配合,天天地地,天地連鎖が配列で返却される。
0はポジティブ、1はネガティブを意味する。

def recommendation_number_of_strokes(sei_number_of_strokes,mei_number_of_strokes):苗字の画数の配列、名前の画数の配列を渡すと、
名前に追加したほうが良い画数を、配列として返却する

import requests
from bs4 import BeautifulSoup
import time

#漢字の画数を取得する
def get_kakusu(moji):
  time.sleep(1)
  ucs_code=hex(ord(moji))[2:]
  url="https://moji.or.jp/mojikibansearch/result?UCS%E6%BC%A2%E5%AD%97="+ucs_code
  html_text= requests.get(url).text
  soup = BeautifulSoup(html_text, 'html.parser')
  elems = soup.find(class_="table table striped res-table").findAll("td")
  kakusu=elems[6].text.replace("\n","").replace("\t","").replace("画","")
  
  return int(kakusu)

#画数から人名漢字を配列に格納する
def kakusu_to_string(numbers):
  time.sleep(1)
  url="https://kanji.jitenon.jp/cat/jimmei.html"
  html_text= requests.get(url).text
  soup = BeautifulSoup(html_text, 'html.parser')
  kouho=[]
  for num in numbers:
    elems = soup.find(id="parts"+("0"+str(num))[-2:]).findAll("a")
    for item in elems:
      kouho.append(item.text)
  return kouho

#文字列を画数の配列にする
def string_to_kakusu(s):
  kakusus=[]
  for ss in s:
    kakusus.append(get_kakusu(ss))
  return kakusus

#姓と名を入力した際に、姓名判断スコアを回答する
def calculate_seimei_handan_score(sei_number_of_strokes,mei_number_of_strokes):
  #凶意を示す数。但し9は人格数に限り吉に成る
  kyou_su=[2,4,9,10,12,14,19,20,22,26,27,28,34,36,43,44,46,49,50,51,54,56,59,60,62,64,66,69,70,72,74,76,79,80]

  #一般的な吉数。81以降は1と同じ意味になる。
  kichi_su=[1,3,5,6,7,8,11,13,15,16,17,18,21,23,24,25,29,31,32,33,35,37,38,39,41,45,47,48,52,57,58,61,63,65,67,68,81]

  #霊数:一字姓・一字名の場合に足す数。本来、姓名判断では二文字以上の姓名を前提として鑑定方法が確立されているので、一文字の姓名においては天格・地格・外格の鑑定の際、仮数として1を加えて鑑定する流派があり、この仮数を霊数と呼ぶ。
  reisu_sei=0
  reisu_mei=0
  if len(sei_number_of_strokes)==1:
    reisu_sei=1
  elif len(mei_number_of_strokes)==1:
    reisu_mei=1

  #天格:姓の総画数。祖先運。一般的に晩年になるほど影響力を強めるとされる。
  tenkaku=sum(sei_number_of_strokes)+reisu_sei
  if tenkaku in kichi_su or tenkaku>=81:
    tenkaku_kikkyo=0
  else:
    tenkaku_kikkyo=1

  #人格:姓の最後と名の第一字を足したもの。
  #人物の内面をあらわし、家庭・仕事・結婚運、中年期の運勢に影響を与える。
  jinkaku=sei_number_of_strokes[-1]+mei_number_of_strokes[0]
  if jinkaku in kichi_su+[9] or jinkaku>=81:
    jinkaku_kikkyo=0
  else:
    jinkaku_kikkyo=1

  #地格:名の画数の合計。一字名でもその人の性格をあらわす。
  chikaku=sum(mei_number_of_strokes)+reisu_mei
  if chikaku in kichi_su or chikaku>=81:
    chikaku_kikkyo=0
  else:
    chikaku_kikkyo=1

  #総角:人生を歩むにつれて色濃くでてくるといわれ、人生全体の運勢に影響を与え、晩年になるほど総格の影響は大きくなると言われている。
  soukaku=tenkaku+chikaku
  if soukaku in kichi_su or soukaku>=81:
    soukaku_kikkyo=0
  else:
    soukaku_kikkyo=1

  #外格:外格は家族や職場などの外因的要素、対人関係・社会的環境一般の運勢。
  gaikaku=soukaku-jinkaku+min(1,reisu_mei+reisu_sei)
  if gaikaku in kichi_su or gaikaku>=81:
    gaikaku_kikkyo=0
  else:
    gaikaku_kikkyo=1

  #天地同格(天地同画)天格と地格が同数になることを天地同格といい、多くの流派で大凶としている。
  tenchi_doukaku=0
  if tenkaku==chikaku:
    tenchi_doukaku=1

  #陰陽配合:姓名のすべての漢字が偶数のみまたは奇数のみの場合を、陰陽配合と呼び、やはり凶としている。
  inyou_haigou=0
  gusu=0
  kisu=0
  for stroke in sei_number_of_strokes+mei_number_of_strokes:
    if stroke%2==0:
      gusu+=1
    else:
      kisu+=1
  if gusu==0 or kisu==0:
    inyou_haigou=1
  
  #天天地地・精神連鎖:姓の最初の文字と、名の最後の文字が同画であること。精神的に不安定になることが多いとされる。
  tenten_chichi=0
  if sei_number_of_strokes[0]==mei_number_of_strokes[-1]:
    tenten_chichi=1

  #天地連鎖:姓の最初の文字と、名の最初の文字が同画であること。凶現象を引き寄せるとされる。
  tenchi_rensa=0
  if sei_number_of_strokes[0]==mei_number_of_strokes[0]:
    tenchi_rensa=1

  #print("天格:",tenkaku_kikkyo,"人格",jinkaku_kikkyo,"地格",chikaku_kikkyo,"総格",soukaku_kikkyo,"外格",gaikaku_kikkyo)
  #print("天地同格",tenchi_doukaku,"陰陽配合",inyou_haigou,"天天地地",tenten_chichi,"天地連鎖",tenchi_rensa)

  return [tenkaku_kikkyo,jinkaku_kikkyo,chikaku_kikkyo,soukaku_kikkyo,gaikaku_kikkyo,tenchi_doukaku,inyou_haigou,tenten_chichi,tenchi_rensa]

#名前で使いたい漢字がある場合に、名前に追加するお勧めの漢字画数を回答する
def recommendation_number_of_strokes(sei_number_of_strokes,mei_number_of_strokes):
  kouho=[]
  for i in range(26):
    if 1 not in calculate_seimei_handan_score(sei_number_of_strokes,mei_number_of_strokes+[i]):
      kouho.append(i)
  
  return kouho



sei=list(input())
mei=list(input())

#姓名判断をしたい場合
#calculate_seimei_handan_score(string_to_kakusu(sei),string_to_kakusu(mei))

#名前で使いたい漢字がある場合に、追加するべきお勧めの漢字の画数を算出する
number_of_strokes=recommendation_number_of_strokes(string_to_kakusu(sei),string_to_kakusu(mei))
print(number_of_strokes)

kanji_kouho=kakusu_to_string(number_of_strokes)
#print(kanji_kouho)
for item in kanji_kouho:
  #print(item)
  print("".join(sei)+" "+item+"".join(mei))