「男の子-左、女の子-右」、または「性別」フィールドをOracleデータベースに追加

...ドラゴンには、ゼロ、虚数、負の3つのタイプがあります。 それらのすべてが存在するわけではありませんが、各タイプは独自の特別な方法です。 プロの言語である虚数やヌルコンと呼ばれる想像上のドラゴンやヌルドラゴンは、ネガティブなドラゴンほど興味深いものではありません。
スタニスラフ・レム、
サイバー

前文


記事「複雑なテーブルOracleでのレコードのマージの問題」の記事に対する建設的な批判。 Oracleデータベースのクライアントデータに基づいて個人の性別を識別する問題を解決する方法を分析します。

ソースデータ


hotel.cardsテーブルの顧客データを含む特定の実験データベースがOracleにあるとします。 少なくとも、クライアントの姓(cards.last_name)、名(cards.first_name)、さらにはミドルネーム(cards.middle_name)があります。このデータから何を抽出できるか見てみましょう。

ミドルネーム


クライアントの性別を特定するための最も明確で些細な決定は、彼の愛顧に関する情報を提供します。 ロシア語にはロシア語のミドルネームの接尾辞はそれほど多くありません。
愛称についてのウィキペディア
2番目の偏位の男性名から形成された愛称は、接尾辞-ovich / -ovna、-evich / -evnaのベースに追加することにより形成されます:Roman-Romanovich、Nikolai-Nikolaevich。 -iで終わる名前は-b-に変更します:Vitaliy-Vitalievich。
最初の偏位の男性名から形成される男性のミドルネームは、接尾辞-ichをベースに追加することで形成されます。Nikita-Nikitich、Luka-Lukich。
女性のミドルネームは、最初の偏位の男性の名前から形成され、末尾にストレスがかかっていない場合は接尾辞-yichnaを追加することによって形成されます。

実際、すべてのミドルネームがデータベースに入力されている場合、フロアフィールドは非常に簡単な方法で入力できます。
DBサーバー上のOracleユーザーコンソール
sqlplus / sysdbaとして
alter hotel hotel.cards add gender varchar2(10);
hotel.cards hc set hc.gender = 'male'を更新します。hc.middle_nameは '%ich'のようになります。
hotel.cards hc set hc.gender = 'female'を更新します。hc.middle_nameは '%on'のようになります。
コミット;

しかし、この方法は、いくつかの理由から常に適用できるものではありません。
1)システムは外国の顧客によって開発されたものであり、データベーススキーマは愛称を提供しません。
2)外国のパスポートの外国人クライアントには「Patronymic」フィールドがなく、オペレーターはこれらのデータを指定しません。

そのような場合、クライアントの姓と名はまだ残っています。


Googleとの共同瞑想の時間は、私を以下の残念な事実に導きました。
1)外国人の姓は、通常、男性と女性の性別で変化しません(英語:Mr. and Mrs. Smidt、ウクライナ語:Grigory and Maria Beloshtan、IvanおよびGalina Krasnoshapka)。
2)外国の姓の最後の文字は、その所有者の性別を明確に示すことはできません。
3)その一部の1つは、複合姓の所有者の性別を示す場合があります。

一般に、姓には非常に多くの例外があるため、手作業は絶対に避けてください。 当然、私たちのオペレーターはそれを行うので、来週には、クッキーを使ったお茶への招待を待ってはいけません。


個人の性別を分析するためのデータベースで最もユニークなパラメーターは、名前です。 男性と女性の名前のリストを持つ多くのサイトがあり、男性と女性の名前の説明を含む本は紙と電子形式で見つけることができますが、...私たちの怠inessのために、性別の名前の既製のデータベースを見つける必要があります(これらはちなみに販売されています)機械加工に適した形式のこの情報。 必要なのはサンプルだけです
select distinct hc.first_name from hotel.cards hc;

性別フィールドを追加し、値に「男性/女性」を入力します。 「i-gender.com」サービスに出くわしたとき、名前のディレクトリとデータベース、ソーシャルネットワークのさまざまなAPI、さまざまなデータベースの販売ポイントに関するGoogleとの瞑想が突然停止しました。 非常に便利なAPI、キリル文字と音訳の名前の認識、およびその結果の信of性の短いテストにより、オペレーターの日常業務をこのサービスの肩に移して、クッキーで私を処理するプロセスから気を散らさないようにすることはかなり可能であると確信しました。

このサービスは非常に気取らず、name = Innocentという形式のhttp-requestを送信する必要があります。 応答として、{"gender": "male"、 "confidence": "100"}という形式の行を取得します。 確かに、POSTメソッドを使用して要求を行う必要があります。 curlの場合、これは問題ではありません。答えの解析は、単純なbashスクリプトで簡単に任せられます。 多数の日常的なジェスチャーを実行し、 i-genderサービスの潜在的な間違いがないか作業者に作業結果を確認するよう説得することが残っています 。 私はネタバレの下で好奇心を尋ねます。
データベースサーバー上
bash-3.2 $ uname -a
Linux ******* 2.6.39-300.26.1.el5uek#1 SMP木1月3日18:31:38 PST 2013 x86_64 x86_64 x86_64 GNU / Linux

bash-3.2 $ sqlplus / as sysdba
SQL * Plus:リリース11.2.0.1.0本番7月30日火曜日09:39:27 2013
Copyright©1982、2009、Oracle。 すべての権利を留保します。
接続先:
Oracle Database 11g Enterprise Editionリリース11.2.0.1.0-64ビット本番
パーティショニング、OLAP、データマイニング、およびリアルアプリケーションテストオプション

mkdir / u02 / xtern
cd / u02 / xtern
sel.sqlにタッチします

sel.sql(クライアントベースの一意の名前を選択する要求):
行サイズ9999を設定
ページサイズを0に設定
頭を下げる
下線をオフに設定
フィードバックをオフに設定
トリムスプールをオンに設定
エコーをオフに設定
スプールresult.log
Termoutをオフに設定します
hotel.cards hcから個別のhc.first_nameを選択します。
終了をオンに設定
巻き取る
出る

選択範囲をファイルにアンロードします
sqlplus -s / as sysdba @ sel.sql

余分なスペースを削除します
cat ./result.log | sedの/ ^ * //; s / * $ // '> ./result.csv

外部への出口があるマシン上
[****] $ uname -a
Linux ******* 2.6.32-358.6.2.el6.i686#1 SMP木5月16日18:12:13 UTC 2013 i686 i686 i386 GNU / Linux
[****] $ curl -V
curl 7.19.7(i386-redhat-linux-gnu)libcurl / 7.19.7 NSS / 3.14.0.0 zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2
プロトコル:tftp ftp telnet dict ldap ldaps http file https ftps scp sftp
機能:GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

./myget.shをタッチします
chmod 751 ./myget.sh

myget.sh(i-gender.comサービスへのリクエストのスクリプト):
#!/ bin / bash

NAMEを読みながら
する
答え= $(curl -d "name = $ NAME" www.i-gender.com/ai
#答えは次のようになります
#{"性別": "男性"、 "自信": "100"}
GENDER = $(echo $ ANSWER | cut -f 4 -d '"')
CONFIDENCE = $(echo $ ANSWER | cut -f 8 -d '"')
echo "$ NAME、$ GENDER、$ CONFIDENCE" >> ./names.csv
#サーバーをフラッディングする必要がないので、休憩する時間を与えてください)))
寝る1
done <./ result.csv

result.csv(入力):
ドミトリー
アナスタシア
バレンタイン
エリッサ
アナトリー
ナタリア
イリーナ
イゴール
パベル
エリザベス
リディア
グレゴリー
アッラ
オサマ

names.csv(結果ファイル)
ドミトリー、男性、100
アナスタシア、女性、100
バレンタイン、女性、85
エリッサ、女性、100
アナトリー、男性、100
ナタリア、女性、100
イリーナ、女性、100
イゴール、男性、100
パベル、男性、100
エリザベス、女性、100
リディア、女性、100
グレゴリー、男性、100
アッラ、女性、100
オサマ、男性、100

結果をデータベースに接続します
sqlplus / sysdbaとして

ディレクトリxtern_data_dirを「/ u02 / xtern」として作成または置換します。
テーブルpcmd.xtern_namesを作成します

first_name varchar2(50)、
性別varchar2(10)、
信頼番号

組織外部

デフォルトディレクトリxtern_data_dir
アクセスパラメータ
(改行で区切られたレコード
「、」で終わるフィールド

場所( 'names.csv')
);

select * from pcmd.xtern_names;

データがデータベースに接続されている場合、人的労力を使用して予備検証を行う必要があります。 次に、それらを既存のスキーマに統合し、既存のテーブルを展開し、それらに関連付けられた新しいビューとトリガーを作成できます。 しかし、これは私たちの記事のトピックとはほとんど関係ありません。

おわりに


クライアントの姓、名、愛用のみを使用して、タスクを自動的に解決することはできません。 しかし、タスクをスピードアップして自動化すると、サードパーティのメーカーのデータベースやサンプル、またはwww.i-gender.comのようなサービスを購入できる

Source: https://habr.com/ru/post/J188358/


All Articles