企業風土をAIで考える

# 目次
[1.はじめに](#1-はじめに)
[2.企業風土を考える](#2-企業風土を考える)
[3.準備](#3-準備)
[4.使ってみよう](#4-使ってみよう)
[5.おわりに](#5-おわりに)

# 1. はじめに
**単語をベクトル化するWord2Vecを使って、企業風土を考えてみました。**
直接的な答えは得られませんが、客観的なデータを使って、考えるヒントを得られた気がします。

# 2. 企業風土を考える
「**組織の三菱、人の三井、結束の住友**」という言葉を聞かれたことがあるだろうか？
日本を代表する企業グループの特徴を表す言葉なのだが、昭和の言葉かもしれない。

企業風土とは何か、考えてみた。
企業を内側から見た場合、社員や関係者にアンケートを取ることが有効かもしれない。
企業を外側から見た場合も、アンケートは有効かもしれないが、**AIを使って、外部データを客観的に見る手もある**。

AIの一つであるWord2Vecを、ご存じだろうか？

**Word2Vecは、自然言語処理のための単語埋め込み（word embedding）モデルの一種です。単語埋め込みは、テキスト内の単語をベクトル化する技術であり、これによってコンピュータが単語を理解しやすくなります。**

Word2Vecは、単語を密なベクトル空間に埋め込む手法であり、似た意味を持つ単語が近い位置に配置される特性を持っています。具体的には、Word2Vecは次の2つの主要なアーキテクチャを利用します。

1. **CBOW（Continuous Bag of Words）**：このアーキテクチャでは、周囲の単語（文脈）を与えられた中央の単語を予測しようとします。例えば、「猫はネコ」という文がある場合、CBOWは「猫」の周囲にある「は」と「ネコ」という単語を使って「猫」を予測します。

2. **Skip-gram**：このアーキテクチャでは、中央の単語から周囲の単語を予測しようとします。例えば、「猫はネコ」という文がある場合、Skip-gramは「猫」から「は」と「ネコ」を予測します。

Word2Vecの訓練が終了すると、各単語は固定次元の密なベクトルで表現されます。これらのベクトルは、単語間の意味的な関係を反映し、例えば類義語や反意語が近い位置にマッピングされます。

類似度（similarity）は、Word2Vecモデルで算出された単語ベクトルの間の距離や類似性を示す指標です。具体的には、コサイン類似度がよく使われます。コサイン類似度は、2つのベクトルの間の角度が小さいほど類似度が高いと判断します。

例えば、"犬"と"猫"という2つの単語がWord2Vecでベクトル化されている場合、それらのベクトルの間のコサイン類似度が高ければ、これらの単語は意味的に似ているとみなされます。

# 3. 準備
それでは、準備からスタートしましょう。
Word2Vecは、今から10年前の2013年に論文発表された手法です。
今回は、個人的に、お気に入りのhuggingfaceのモデルを利用させて頂きます。
参考までに、学術論文の引用情報を記載しておきます。

```python
@inproceedings{yamada2020wikipedia2vec,
  title = "{W}ikipedia2{V}ec: An Efficient Toolkit for Learning and Visualizing the Embeddings of Words and Entities from {W}ikipedia",
  author={Yamada, Ikuya and Asai, Akari and Sakuma, Jin and Shindo, Hiroyuki and Takeda, Hideaki and Takefuji, Yoshiyasu and Matsumoto, Yuji},
  booktitle = {Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing: System Demonstrations},
  year = {2020},
  publisher = {Association for Computational Linguistics},
  pages = {23--30}
}
```

まずは、いつもの通り、transformersをインストールします。
```python
pip install transformers
```

次に、モデルを読み込んで、試しに **「父親 - 男 + 女」のベクトル計算** をしてみます。
答えが何になるか、予測してみて下さいね。

ここで、gensimを使います。

**gensimは、Pythonのライブラリで、自然言語処理のためのライブラリです。gensimは、学習したWord2Vecモデルを使って単語間や文書間の類似度を計算することができます。**

```python
from gensim.models import KeyedVectors
from huggingface_hub import hf_hub_download

# モデルを読み込む
model = KeyedVectors.load_word2vec_format(hf_hub_download(repo_id="Word2vec/wikipedia2vec_jawiki_20180420_100d", filename="jawiki_20180420_100d.txt"))

# ベクトル を計算
result_vector = model["父親"] - model["男"] + model["女"]

# 最も類似した単語を取得 (上位5件)
most_similar_words = model.similar_by_vector(result_vector, topn=5)

for word, score in most_similar_words:
    print(f"{word}: {score}")
```
出力結果は、以下の通りです。

母親: 0.8551760315895081
父親: 0.8488976359367371
両親: 0.8160389065742493
一人娘: 0.8013983368873596
叔母: 0.7812055945396423

想定通り、**父親 - 男 + 女は、母親になりました。**
（ギリギリですが、、、汗）


# 4. 使ってみよう
さて、それでは、いよいよ、企業風土というか、企業イメージを考えてみましょう。
今回、使用しているモデルは、日本語のWikipedia2018年版を使っています。
少々、古いですが、企業イメージは、すぐには、変わらないと思います。

まず、組織との類似度を、各企業グループ毎に計算してみます。

```python
# 各企業名と「組織」との類似度を計算
companies = ["三菱", "三井", "住友"]

for company in companies:
    similarity = model.similarity(company, "組織")
    print(f"{company} と 組織 の類似度: {similarity}")
```
結果は、以下の通りです。
三菱 と 組織 の類似度: 0.20619237422943115
三井 と 組織 の類似度: 0.25940701365470886
住友 と 組織 の類似度: 0.31084758043289185

意外にも、三菱との類似度が、一番、低かったです。
もう、組織は当たり前のことなので、意識されないのかもしれません。

同様に、人との類似度を見てみましょう。

```python
for company in companies:
    similarity = model.similarity(company, "人")
    print(f"{company} と 人 の類似度: {similarity}")
```
結果は、以下の通りです。

三菱 と 人 の類似度: 0.1629810333251953
三井 と 人 の類似度: 0.2016543447971344
住友 と 人 の類似度: 0.2256019115447998

これも、取り立てて、どうこう言う結果では、ありませんでした、、、汗

最後に、結束で、やってみましょう。

```python
for company in companies:
    similarity = model.similarity(company, "結束")
    print(f"{company} と 結束 の類似度: {similarity}")
```
結果は、以下の通りです。
三菱 と 結束 の類似度: 0.15628114342689514
三井 と 結束 の類似度: 0.26786142587661743
住友 と 結束 の類似度: 0.28634876012802124

**三菱と比べると、住友や、住友と親しい三井において、類似度が２倍弱になっているようです。**

## （おまけ）

三菱、三井、住友と類似度が高い単語が何なのか、調べてみましょう。

```python
# 類似度の高い上位5つの単語を表示する関数
def get_top_similar_words(word, topn=5):
    similar_words = model.most_similar(word, topn=topn)
    return similar_words

# 各企業名と類似度の高い上位5つの単語を表示
companies = ["三菱", "三井", "住友"]

for company in companies:
    similar_words = get_top_similar_words(company)
    print(f"{company} の類似度の高い上位5つの単語:")
    for word, score in similar_words:
        print(f"{word}: {score}")
    print()
```
結果は、以下の通りでした。
**三菱 の類似度の高い上位5つの単語:**
ｕｆｊ: 0.7793307900428772
オートリース・ホールディング: 0.7715034484863281
セントラルリース: 0.7628400325775146
マルチエンターテイメントシステム: 0.7602488398551941
日立ツール: 0.7552410960197449

**三井 の類似度の高い上位5つの単語:**
住友: 0.8569939732551575
トラスト・アセットマネジメント: 0.760558545589447
シティインシュアランス: 0.7413414120674133
三井海上火災: 0.7389912009239197
第一中央汽船: 0.7377695441246033

**住友 の類似度の高い上位5つの単語:**
三井: 0.8569939136505127
トラスト・アセットマネジメント: 0.7895866632461548
ビジネスコンサルテイング: 0.7529626488685608
シティインシュアランス: 0.7476378083229065
第一中央汽船: 0.7363008856773376

三井住友銀行や三井住友海上の関係で、三井と住友の類似度が高いですね。
その他にも、親密な先が目白押しですね。
やはり、企業グループの大切さを感じます。

# 5. おわりに
**AIの仲間である、Word2Vecで企業風土について、考えてみました。
様々な手法を駆使して、いろいろ、考えるヒントが得られると良いですね。
使っているデータは、Wikipediaなので、客観性は担保できると思います。**

単語をベクトル化することで、内積を計算すれば、類似度が分かることになります。
数学を勉強しておくと、役に立ちますね。