皆さんこう思いますよね。
「単語間で計算を行いたい」と。
実際Word2Vecというものがあるのですが、初心者の私にはハードルが高くて...
なので今回はPythonのdict型を使って作ってみようと思いました。
(初投稿です)
経緯
作った理由を詳しく話すと、Word2vec自体は他の記事を見ながら書いてみたりしたのですが、
単語の計算(王-男+女=女王)みたいなのもチャレンジしてみようと思いましたが、
モデルのサイズが大きいので断念。
なので自作してみよう!って思いました。
実際に書いてみる
以下コードです。きたないです。申し訳ございません。(コメントでif文について指摘が来ていたので修正しました)
import random
import json
import sys
num_range=100
textlist=["Search","Microsoft","Phone","GameConsole","Facebook","Community","Sony","Valve","Apple","Pie","Tech","PC","SmartPhone","China","UnitedStates","GAFAM","VR","FaceBook"]
if len(sys.argv) == 1:
WordVec={_:random.uniform(-num_range,num_range) for _ in textlist}
WordVec["ApplePie"]=WordVec["Apple"]+WordVec["Pie"]
WordVec["AppleInc."]=WordVec["Apple"]+WordVec["Tech"]
WordVec["IPhone"]=WordVec["AppleInc."]+WordVec["SmartPhone"]
WordVec["MacOS"]=WordVec["AppleInc."]+WordVec["PC"]
WordVec["BATH"]=WordVec["GAFAM"]+WordVec["China"]
WordVec["GAFAM"]=WordVec["BATH"]+WordVec["UnitedStates"]
WordVec["MetaQuest2"]=WordVec["Facebook"]+WordVec["VR"]
WordVec["Pico4"]=WordVec["China"]+WordVec["VR"]
WordVec["Steam"]=WordVec["Valve"]+WordVec["Community"]
WordVec["SteamVR"]=WordVec["VR"]+WordVec["Steam"]
WordVec["ValveIndex"]=WordVec["VR"]+WordVec["Valve"]
WordVec["PlayStation"]=WordVec["GameConsole"]+WordVec["Sony"]
WordVec["PSVR"]=WordVec["VR"]+WordVec["PlayStation"]
WordVec["TrinusPSVR"]=WordVec["PSVR"]+WordVec["PC"]
WordVec["iVRyPSVR"]=WordVec["PSVR"]+WordVec["SteamVR"]
WordVec["Windows"]=WordVec["Microsoft"]+WordVec["PC"]
WordVec["Bing"]=WordVec["Microsoft"]+WordVec["Search"]
WordVec["Skype"]=WordVec["Microsoft"]+WordVec["Phone"]
json.dump(WordVec, open("WordVec.json","w",encoding="utf-8"), indent=4) #数値の保存
else:
#数値の読み込み
fp_read=open(sys.argv[1],"r",encoding="utf-8")
WordVec=json.load(fp_read)
reverse_WordVec={v:k for k,v in WordVec.items()}
while True:
try:
originalText=input(">").replace(" ","")
if "+" in originalText: #足し算の場合
originalText_Splits=originalText.split("+")
a=originalText_Splits[0]
b=originalText_Splits[1]
try:
print(reverse_WordVec[WordVec[a]+WordVec[b]])
except:
print(f"エラーが発生しました。:{WordVec[a]+WordVec[b]}")
elif "-" in originalText: #引き算の場合
originalText_Splits=originalText.split("-")
a=originalText_Splits[0]
b=originalText_Splits[1]
try:
print(reverse_WordVec[WordVec[a]-WordVec[b]])
except:
print(f"エラーが発生しました。:{WordVec[a]-WordVec[b]}")
else:
print("+ もしくは - を書いてください。")
except IndexError:
print("エラーが発生しました。マイナス記号もしくはプラス記号の前と後ろに単語を書いてください。")
except KeyError:
print("エラーが発生しました。辞書を参照してみましたが、そのような単語が見つからないためです。")
実際に実行するとこうなったりします。
>Phone+Microsoft
Skype
>Skype-Phone
Microsoft
>Windows-Microsoft
PC
おわりに
ここまで読んでいただきありがとうございます。
誤字脱字があったらコメントで指摘していただければ助かります。
(お手柔らかにお願いいたします)