名前による性別の識別-正確さが本当に重要な場合

しばらく前、私は彼の名前で人の性別を判断する作業に興味がありました。 その瞬間、私はこの問題が本当に関連する医療保険の分野で働いていました-被保険者の費用、したがってクライアントの性別に応じて人々が保険に加入する率は数倍異なる可能性がありました。 契約のほとんどは法人であり、被保険者は雇用主の従業員です。



私たちは目でそれらのほとんどを見たことはありませんでした。私たちが持っていたのは被保険者のリストだけで、性別が時々示されていました(多くのエラーがありました)。 ほとんどの企業は、仕事や職業の伝統を独自に持っているため、同じ性別の人々がチームに勝つ理由があります。 わずかなミスでも、利益をもたらす可能性のある契約が不採算になる可能性があります(またはその逆もありますが、状況の奇妙な組み合わせにより、これはクライアントにあまり頻繁に起こりませんでした)。 一般に、数十億の契約ポートフォリオのボリュームと約1パーセントの典型的なエラー率では、名前による正しい性決定の価格は数千万でした。



RuNetでは、名前で性別を決定するというトピックが複数回提起されましたが、ほとんどの場合、ミドルネームの末尾(「HIV」/「VNA」)を注意深く調べるか、手動で見つかった同様のパターンを使用することが推奨事項になりました。 残念ながら、私の状況では、この方法は適切ではありませんでした-被保険者の中には、実際には多くの外国人がいました。 ミドルネームの正しいスペルには、目的のエンディングの兆候が含まれていませんでした(場合によってはミドルネーム自体が欠落していました)。



したがって、問題を解決するために、私は統計的アプローチを使用することを決定しました。既存のクライアントベースに応じて、必要な姓、名前、愛用者を持つ性別の人が通常属している人を特定し、これらのデータに従って、新しい被保険者を1つまたは別のクラスに割り当てます。 名前の一部が主に男性に属する場合、私は+1ポイントを獲得しました;女性に1ポイントを差し引いた場合、それがほぼ等しい場合、0ポイントが付与されました。 3つの部分すべての結果が生成され、量が+2以上の場合、性別は男性と判断されました。 -2以下-女性として; そうでなければ、性別を決定することができず、他の方法で性別を計算する必要があると考えられていました。



奇妙なことに、同様の非常に単純なアルゴリズムにより、非常に高い精度を達成できました-数十万人のサンプル(150万人のトレーニングベース)で、たった6つのエラーが発生しました(以下で説明します。人もコミットします)。



予備トレーニングサンプルの準備の詳細:





PL / SQLですべてのロジックを書いたので、アルゴリズムの実装でパッケージ全体をアップロードしません-それはデータベースの内部構造とデータストレージの機能に非常に関係していますが、いくつかの機能について言及したいと思います:



人の性別を判断する必要があるたびに、すべてのレコードで取引先テーブルを調べるのに長い時間がかかるため、名前の特定の部分の頻度に関する集計情報を補助テーブルの保存データに配置しました。 4つのパラメーター-[フルネームの一部-タイプ(、または)-性別-データベース内のレコード数]のように見えます。 統計は毎週自動的に更新されます。



名前の一部の男性と女性の比率が特定の性別に分類するのに十分な理由と考えられるかどうかを判断するために、次の関数を使用しました。



--    ( )   ( )   -- +1 -  -- 0 -   -- -1 -  function get_sex_by_cnt (mcnt number, fcnt number) return number is begin if mcnt=fcnt then return 0; end if; --   if mcnt<=2 and fcnt<=2 then return 0; end if; --      if mcnt>=3 and fcnt=0 then return 1; end if; --    1 if mcnt=0 and fcnt>=3 then return -1; end if; --   2 if mcnt/fcnt>0.5 and mcnt/fcnt<2 then return 0; end if; --      if mcnt>fcnt then return 1; end if; --   .   if mcnt<fcnt then return -1; end if; --   end; -- get_sex_by_cnt
      
      





名前で性別を判別できなかった場合(推定値の合計値は[-1; 1]の範囲にあります)、ほとんどの場合、姓を無視してIOのみを使用できます-正しい操作(+2-男性、-2 -女性、そうでなければ-性別は決定されません)。 これは、「ティモシェンコ」のような不変の姓が誤って1つの性別に起因し、名前と愛称が反対に属する状況を回避するのに役立ちます。



アルゴリズムエラー。 アルゴリズムが誤った結果を生成する可能性がある3つの状況を見つけました。



  1. アジア人。 中国語では、名前を特定の性別に帰属させるための正式な標識はありません。 おそらく、これまでに述べられたことは、他のいくつかの言語にも当てはまります(少なくとも、これはタイ語、ベトナム語、韓国語に関するものと推測できます)。 名前で、原則として性別を決定することは不可能です。 この理由は、関数6の3つの検出されたエラーの原因です。平均して、アジアの名前を持つ男性と女性の数は等しいことが判明しましたが、一部(主にまれな名前と姓)は主に同性に属していました。 統計のセット以外の簡単なソリューションを提案することは困難ですが、これでは問題を完全に解決できません。 難しいが、比較的信頼性の高いソリューション-名前がアジア人かどうかを判断する関数を作成できます(まだ行っていないが、翻訳同僚との会話で判断すると、これは可能です)。収集された統計に関係なく、すべてのアジア人に対して0を返します。
  2. イニシャル。 場合によっては、名前はデータベースに「Ivanov AND」の形式で入力されます。 個別の文字は、名前と愛用者として機能によって認識され、一般的な統計に参加し、人の性別の決定に影響を与えます。 「Kovalchuk OI」などの名前を持つ新しい人物がデータベースに入力されると、実際の性別と計算された性別の間に矛盾が生じる場合があります。 この理由は、検出された6つのうち1つのエラーの原因です。 このようなエラーに対処することは可能です。たとえば、収集された統計に関係なく、性別0の名前と愛称に1文字の姓を割り当てることができます。
  3. ある性別が他の性別よりも頻繁に使用する名前、または国によって慣行が異なる名前。 6つのエラーのうち2つが検出されました。 例(個人データを開示しないように、エラーが発生した本名を少し歪めました):Mohamad Suleiman Farhonda(女性)およびSasha Alexander Jefferson(女性、米国市民)。 そのようなケースをアルゴリズムで修正できるかどうかはわかりませんので、これらの名前を例外テーブルに追加しました。


機能のエラーの検索方法:特定の機能以外の性別で会社の拠点に新しい被保険者を追加することは禁止されました。 このような間違いが発生した場合、従業員は被保険者のリストを提供する組織に連絡し、その人の本当の性別を明らかにしました。 したがって、実際のデータと計算されたデータの不一致はすべて手動で処理されました。 このテストに合格した人の総数は約25万人です。



残念ながら、この方法は特効薬ではなく、私が出会った他のすべての方法よりも優れています。 さまざまな企業の複数のデータベースでメソッドをテストしました。 欠点には、統計が不十分であるために名前で性別を判別できない人がいるという事実が含まれます:150万人に基づいて、そのような人々は、30万人に基づいて1%をわずかに超え、3%に基づいて、約3% 600万人が0.8%の性別を判別できませんでした。 性別を判別できない人の割合は、トレーニングサンプルのサイズの根に反比例すると仮定していますが、これが起こる理由については説明がありません。 もちろん、性別を決定できる人の割合は、人に性別を割り当てることができる条件をより穏やかに設定することで高めることができます(ほぼ100%になりさえします)が、私が作業したタスクでは精度がより重要でした2つのクラスのいずれかに100%を割り当てます。



この方法がさらされる別の欠点は、タイプミスの扱いが悪いことです。 それらのいくつかはかなり標準的であるという事実にもかかわらず(たとえば、「Olga」という名前は非常に正しい「Oktyabrina」よりも一般的です)、ほとんどのタイプミスでは統計はありません=>その名前で性別を判別できるとは限りません。 残念ながら、逆のステートメント(データベースで一度も会ったことのない名前の場合、スペルが間違っていることを意味します)は正しくありません-普通の人の名前のタイプミスよりもユニークな名前を持つ人は少なくありません。



他のツールと同様に、このツールには、作成時に考えない機能があります。



  1. 収集された統計により、特定のタイプのエラーで記述された名前を検索できます。 収集された統計によると、フルネームの一部に一方の性別があり、他方に性別がある場合、おそらくタイプミスがあります。 例は、ナタリアセルゲイブナイワノフです。 この場合、姓にタイプミスが行われる可能性が最も高くなります。末尾の文字「a」は忘れられます。
  2. トレーニングサンプルのデータのほとんどが主に1つの形式(F-I-O)で提示される場合、収集されたデータに基づいて、異なる順序(たとえば、I-O-F)で書かれたフルネームを検索することが可能になります-パーツ名と姓は通常、目的のパーツに属します。 会社が「親愛なるOleg Konstantinovich!」の精神で郵送を行うかどうかは問題になるかもしれません。
  3. 実際に観察したケースでは、トレーニングサンプルのエラーの割合は、予測の精度や、1つまたは別のクラスに帰せられなかった名前の数に影響しません。 私が扱っていたケースの1つでは、トレーニングサンプルの性決定エラーの割合は約4%でした。それらを修正して統計を再収集した後、フルネームを決定することができなかった名前の数は1%未満しか変化しませんでした。




UPD 1

多くの珍しい名前がコメントで提案されました、私はそれらが上記で提案されたアルゴリズムによってどのように決定されるかをチェックしました。 参照による -提案された名前と、姓、名、愛用者による性別の評価を含むバリエーション。

UPD 2

名前による性別の決定は、典型的な分類作業であると以下に示唆されています。 50万人のデータが見つかりました。それぞれの姓(ssecondname)、名(sname)、ミドルネーム(sthirdname)の最後の文字がわかっています。3、2、1という数字は、名前のこの部分の最後の文字の数を意味します。 残念ながら、私には他にそのような選択も、研究用の異なる機能セットでそれを作成する能力もありません。

また、このデータに基づいて決定ツリーを作成しました。

切り捨てられない(したがって、必然的に再訓練される): h1analysis.ru/analysis/download/89

10人未満を含むすべてのブランチを削除するように切り捨てられました: h1analysis.ru/analysis/download/90

分類の質を確認しませんでした。 30/70のようなメソッドは切り捨てませんでした。



All Articles