「男の子-左、女の子-右」、または「性別」フィールドを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のようなサービスを購入できる



All Articles