
æç« ã®ãè¿ãããæ°åã§æž¬ãïŒembeddingãšã³ãµã€ã³é¡äŒŒåºŠããå ç©ã®æ°åŠãšPythonã§å³è§£
ãããŒã ããŒãžããšæžãããããã°èšäºããããŠã§ããµã€ãããšããèšèã§æ¢ããŠãããµã€ãã®ããŒã¯ãŒãæ€çŽ¢ã§ã¯èŠã€ãããŸãããæåãäžã€ãåãã§ã¯ãªãããã§ããäžæ¹ã§ã人ãèªãã°ãã©ã¡ããåã話ã ãšããã«åãããŸãã
ãã®ãæå³ã®è¿ãããã³ã³ãã¥ãŒã¿ãŒã§æ±ãããã®æ¹æ³ããæç« ãæ°ã®äžŠã³ïŒãã¯ãã«ïŒã«çœ®ãæããembeddingïŒãšã³ããã£ã³ã°ïŒãšã2ã€ã®ãã¯ãã«ã®åãã®è¿ããæž¬ãã³ãµã€ã³é¡äŒŒåºŠã§ããçæAIã«ç€Ÿå ã®è³æãèªãŸããŠçããããä»çµã¿ãã䌌ãèšäºã®ãããããªã©ã身è¿ãªãšããã§äœ¿ãããŠããŸãã
NDã·ã¹ãã ãºã¯ããã®èšäºã§ãæ¶ç©ºã®å°ããªäºæ¥è ã®ããã°èšäº6æ¬ãäŸã«ãæç« ããã¯ãã«ã«ããŠãã³ãµã€ã³é¡äŒŒåºŠãèšç®ããPythonã®scikit-learnïŒãµã€ãããã»ã©ãŒã³ïŒã§äžŠã¹ãŠè¡šç€ºãããŸã§ããå®éã«åãããã³ãŒããšçµæã§ç޹ä»ããŸããéäžã§ãã³ãµã€ã³é¡äŒŒåºŠã®åå°ã«ãªã£ãŠããããã¯ãã«ã®é·ããå ç©ã®æ°åŠããå³ã§é ã«èª¬æããŸãã

ããŒã¯ãŒãæ€çŽ¢ãšãæå³ã®æ€çŽ¢ã®éã
ããŒã¯ãŒãæ€çŽ¢ã¯ãå ¥åããæåãšåãæåãå«ãèšäºãæ¢ããŸããããŠã§ããµã€ããã§æ€çŽ¢ãããšãããŠã§ããµã€ãããšããæåãå«ãèšäºã¯èŠã€ãããŸããããããŒã ããŒãžããããµã€ãããšæžãããèšäºã¯ãæå³ãåãã§ãèŠã€ãããŸããã
embeddingãäœ¿ãæ€çŽ¢ã¯ãæåã§ã¯ãªããæç« ã®æå³ãè¡šãæ°ã®äžŠã³ã©ãããæ¯ã¹ãŸãããã®ããã䜿ã£ãŠããèšèãéã£ãŠããæå³ãè¿ããã°äžäœã«åºãŠããŸãããã®èšäºã®äŸã§ããããŠã§ããµã€ããå ¬éããŸãããã§æ€çŽ¢ãããšãããµã€ãã®ãã¶ã€ã³ã倿ŽããŸããããšãããŒã ããŒãžãæ°ããäœããŸããããäžäœã®2æ¬ã«ãªããŸããã

embeddingãšã¯ïŒæç« ãæ°ã®äžŠã³ã«ãã
embeddingã¯ãåèªãæç« ããæ±ºãŸã£ãåæ°ã®æ°ã®äžŠã³ã«çœ®ãæããããšã§ãããã®æ°ã®äžŠã³ãããã¯ãã«ããšåŒã³ãŸãããã®èšäºã§äœ¿ãã¢ãã«ã§ã¯ãã©ã®æç« ã300åã®æ°ã®äžŠã³ã«ãªããŸãã
äŸãã°ããæ¢šã®åç©«ãå§ãŸããŸããããšããæç« ã¯ãâ0.07ãâ0.20ã0.22ãâ0.14ã0.02âŠâŠãšç¶ã300åã®æ°ã«ãªããŸããäžã€äžã€ã®æ°ã«ããæç©ããããã®ãããªåãããããæå³ãããããã§ã¯ãããŸããã300åã®æ°ã®çµã¿åããå šäœã§ãæç« ã®æå³ã衚ããŠããŸãã

倧åãªã®ã¯ãæå³ã®è¿ãæç« ã»ã©ãäŒŒãæ°ã®äžŠã³ã«ãªãããã«äœãããŠããç¹ã§ããæ°ã®äžŠã³ã䌌ãŠãããã©ããã¯ãèšç®ã§æ¯ã¹ãããŸãããã®èšç®ã«äœ¿ãã®ããåŸã§èª¬æããã³ãµã€ã³é¡äŒŒåºŠã§ãã
åèªãã¯ãã«ãšãæç« ã®ãã¯ãã«
ãã®èšäºã§ã¯ãç¡æã§æå ã®ããœã³ã³ã§äœ¿ãããspaCyïŒã¹ãã€ã·ãŒïŒãšããèšèªåŠçã®ã©ã€ãã©ãªã®æ¥æ¬èªã¢ãã«ïŒja_core_news_mdïŒã䜿ããŸãããã®ã¢ãã«ã«ã¯ãã¯ãŒã¯ã¹ã¢ããªã±ãŒã·ã§ã³ãºãå ¬éããŠããæ¥æ¬èªã®åèªãã¯ãã«ãchiVeïŒãã£ã€ãïŒããå ¥ã£ãŠããŸããchiVeã¯ãçŽ1åã®ãŠã§ãããŒãžã®æç« ãããšã«ãword2vecãšããæ¹æ³ã§äœãããã300次å ã®åèªãã¯ãã«ã§ãã
åèªãã¯ãã«ã¯ãæç« ã®äžã§äŒŒã䜿ããæ¹ãããåèªã»ã©ãè¿ããã¯ãã«ã«ãªãããã«åŠç¿ãããŠããŸããäŸãã°ããã®ã¢ãã«ã§ã梚ããšãæç©ãã®ã³ãµã€ã³é¡äŒŒåºŠïŒåŸã§èª¬æããŸãïŒã¯0.59ããããŒã ããŒãžããšããµã€ããã¯0.70ã§ãé¢ä¿ã®ãªããæ¢šããšãããŒã ããŒãžãã®0.07ããããã£ãšé«ããªããŸãã

æç« ã®ãã¯ãã«ã¯ãæç« ã«å«ãŸããåèªã®ãã¯ãã«ãå¹³åããŠäœããŸãããã ãããã®ããããããŸãããã®ãããªèšèãŸã§å¹³åã«å ¥ãããšãã©ã®æç« ãäŒŒãæ°ã«ãªã£ãŠããŸããŸããããã§ãã®èšäºã§ã¯ãåè©ã»åè©ã»åœ¢å®¹è©ã«çµã£ãŠå¹³åããŸããã

ãªããåèªãã¯ãã«ã®å¹³åã«ã¯ãèªé ãåæ ãããªããšãã匱ç¹ããããŸããçŸåšã¯ãæç« å šäœãäžåºŠã«èªãã§ãã¯ãã«ã«ãããæåã蟌ã¿ã¢ãã«ããå€ã䜿ãããŠãããSentence Transformersãšããã©ã€ãã©ãªããçæAIã®äºæ¥è ãæäŸããembeddingã®APIããã®äŸã§ããã©ã®æ¹æ³ã§ãããæç« ãæ±ºãŸã£ãåæ°ã®æ°ã®äžŠã³ã«ããããšããç¹ã¯åãã§ããã®åŸã®èšç®ã¯ããã®ãŸãŸäœ¿ããŸãã
ãã¯ãã«ã®æ°åŠïŒç¢å°ãšãæ°ã®äžŠã³
ã³ãµã€ã³é¡äŒŒåºŠãçè§£ããããã«ããŸããã¯ãã«ã®åºæ¬çãªèšç®ãé ã«èŠãŠãããŸãã300次å ã®ç¢å°ã¯æããªãã®ã§ã2次å ã®äŸã§èããŸããæšªã®è»žããæç©ã®è©±ããããã瞊ã®è»žãããŠã§ãã®è©±ãããããšãã3ã€ã®èšäºã次ã®ãã¯ãã«ã§è¡šãããšããŸãã
Aãæ¢šã®åç©«ãïŒïŒ12, 5ïŒ
Bãæç©ã®é信販売ãïŒïŒ4, 3ïŒ
CãããŒã ããŒãžå¶äœãïŒïŒ0, 5ïŒ
ãã¯ãã«ã¯ãåç¹ãã䌞ã³ãç¢å°ãšããŠæããŸããAã®ïŒ12, 5ïŒã¯ã暪ã«12ã瞊ã«5é²ãã ç¹ãŸã§äŒžã³ãç¢å°ãã§ã12ã5ããæåããšåŒã³ãŸãã300次å ã®ãã¯ãã«ãåãã§ãæåã300åãããaïŒïŒaâ, aâ, âŠ, aâââïŒã®ããã«çªå·ãä»ããŠæžããŸãã

è¶³ãç®ãšãæ°ãæããããšïŒå¹³åã®æ£äœ
ãã¯ãã«ã®è¶³ãç®ã¯ãåãçªå·ã®æåã©ãããè¶³ããŸããAïŒBïŒïŒ12ïŒ4, 5ïŒ3ïŒïŒïŒ16, 8ïŒã§ããç¢å°ã§èŠããšãAã®å ã«Bãã€ãªãã å ã®ç¹ã«ãªããŸãã
ãã¯ãã«ã«æ°ãæãããšããã¹ãŠã®æåã«ãã®æ°ãæãããç¢å°ã®åãã¯ãã®ãŸãŸã§é·ããå€ãããŸããïŒ16, 8ïŒã2ã§å²ãïŒÂœãæããïŒãšïŒ8, 4ïŒã«ãªãããããAãšBã®å¹³åã§ããå ã»ã©ã®ãåèªãã¯ãã«ãå¹³åããŠæç« ã®ãã¯ãã«ã«ãããèšç®ã¯ããã®è¶³ãç®ãšå²ãç®ãã300åã®æåã§åæã«è¡ã£ãŠããŸãã

ãã¯ãã«ã®é·ãïŒãã«ã ïŒïŒäžå¹³æ¹ã®å®ç
ãã¯ãã«ã®é·ãã¯ãç¢å°ã®é·ãã®ããšã§ãããã«ã ããšãåŒã³ã|a| ãšæžããŸãã倧åŠã®æ°åŠãèª¬ææžãªã©ã§ã¯ãæ°ã®çµ¶å¯Ÿå€ãšèŠåããããã«ç·ã2æ¬ã«ã㊠âaâ ãšæžãããšããããŸãããæå³ã¯åãã§ãã
2次å ã§ã¯ãæšªã®æåãšçžŠã®æåã2蟺ãšããçŽè§äžè§åœ¢ã®æèŸºãªã®ã§ãäžå¹³æ¹ã®å®çã§èšç®ã§ããŸããAãªã âïŒ12²ïŒ5²ïŒïŒâ169ïŒ13 ã§ãã
300次å ã§ãèãæ¹ã¯åãã§ãæåããããã2ä¹ããŠå šéšè¶³ããã«ãŒããåããŸããΣïŒå šéšè¶³ãïŒãšã«ãŒãã®èªã¿æ¹ã¯ãåå·®å€ã®èšäºã§ãæšæºåå·®ã®åŒã䜿ã£ãŠèª¬æããŸãããåŒã®åœ¢ããæšæºåå·®ã®åŒãšãã䌌ãŠããŸãã

å ç©ïŒåãçªå·ã©ãããæããŠãå šéšè¶³ã
2ã€ã®ãã¯ãã«ã®ãå ç©ãã¯ãåãçªå·ã®æåã©ãããæããŠãå šéšè¶³ããæ°ã§ããaã»b ãšæžããŸããAãšBãªãã12Ã4ïŒ5Ã3ïŒ48ïŒ15ïŒ63 ã«ãªããŸãã
å ç©ã®çãã¯ããã¯ãã«ã§ã¯ãªã1ã€ã®æ°ã§ãã300次å ãªãã300çµã®æãç®ãããŠã300åã®ç©ãè¶³ããŸãããªããèªåèªèº«ãšã®å ç© aã»a ã¯ãæåã®2ä¹ã®åèšããªã®ã§ãé·ãã®2ä¹ãšåãã«ãªããŸãïŒAã»AïŒ169ïŒ13²ïŒã

å ç©ã®ç¬Šå·ïŒåããããããšæ£ãçŽè§ã§0ãéåãã§è²
å ç©ã®å€ã¯ã2æ¬ã®ç¢å°ã®åãã®é¢ä¿ã§ãæ£ã«ã0ã«ãè² ã«ããªããŸããäŸãã° uïŒïŒ3, 1ïŒãšãåãã®éã3æ¬ã®ãã¯ãã«ã§èšç®ãããšã次ã®ãšããã§ãã
ïŒ1, 3ïŒïŒ3Ã1ïŒ1Ã3ïŒ6ïŒåããè¿ãã®ã§æ£ïŒ
ïŒâ1, 3ïŒïŒ3Ã(â1)ïŒ1Ã3ïŒ0ïŒçŽè§ãªã®ã§0ïŒ
ïŒâ3, â1ïŒïŒ3Ã(â3)ïŒ1Ã(â1)ïŒâ10ïŒæ£å察ãªã®ã§è² ïŒ

å ç©ã®æå³ïŒåœ±ã®é·ãÃé·ã
å ç©ã«ã¯ãå³ã§èŠããšåãããããæå³ããããŸããBã®ç¢å°ã«ãAã®æ¹åããçäžã«å ãåœãŠããšãAã®äžã«Bã®ã圱ããã§ããŸããå ç©ã¯ãAã®é·ãÃAã®äžã«ã§ããBã®åœ±ã®é·ããã§ãã
AãšBã®äŸã§ã¯ã圱ã®é·ã㯠63÷13ïŒçŽ4.85 ã§ãAã®é·ã13ãæãããš63ã«æ»ããŸããåãããããã»ã©åœ±ã¯é·ããªããçŽè§ãªã圱ã®é·ãã¯0ãéåããªã圱ã¯å察åŽã«ã§ããŠè² ã«ãªããŸããå ã»ã©ã®ç¬Šå·ã®è©±ã¯ããã®åœ±ã®åãã§èª¬æã§ããŸãã

å ç©ãšã³ãµã€ã³ã®é¢ä¿ïŒäœåŒŠå®çãã
圱ã®é·ãã¯ãBã®é·ãã«ã2æ¬ã®ç¢å°ã®éã®è§åºŠÎžã®ã³ãµã€ã³ãæãããã®ïŒ|b| cosΞïŒã§ãããã®ãããå ç©ã¯ãaã»bïŒ|a|Ã|b|ÃcosΞããšæžããŸããããã¯ã髿 ¡ã®æ°åŠã§ç¿ãäœåŒŠå®çãããå°ããŸãã
AãšBã®ç¢å°ã®å ãçµã¶ãšãäžè§åœ¢ãã§ããŸãããã®èŸºã®é·ãã®2ä¹ãã2éãã®æ¹æ³ã§è¡šããŠã¿ãŸãã
1ã€ç®ã¯äœåŒŠå®çã§ãã蟺ã®é·ãã®2ä¹ã¯ |a|²ïŒ|b|²â2|a||b|cosΞ ã«ãªããŸãã
2ã€ç®ã¯ãè§åºŠã䜿ããã«ããã¯ãã«ã®æ°ïŒæåïŒããçŽæ¥èšç®ããæ¹æ³ã§ããaïŒïŒaâ, aâïŒãbïŒïŒbâ, bâïŒãšãããšã蟺㯠aâbïŒïŒaââbâ, aââbâïŒãªã®ã§ãé·ãã®2ä¹ã¯æ¬¡ã®ããã«å±éã§ããŸãã
ïŒaââbâïŒÂ²ïŒïŒaââbâïŒÂ²
ïŒ aâ²â2aâbâïŒbâ²ïŒaâ²â2aâbâïŒbâ²
ïŒïŒaâ²ïŒaâ²ïŒïŒïŒbâ²ïŒbâ²ïŒâ2ïŒaâbâïŒaâbâïŒ
ïŒ |a|²ïŒ|b|²â2 aã»b
ãã£ããå±éããŠäžŠã¹æ¿ãããšã2ã€ã®é·ãã®2ä¹ãšãå ç©ãåºãŠããŸãã2ã€ã®åŒãèŠæ¯ã¹ããšãâ2|a||b|cosΞ ãš â2 aã»b ãåããã®ãªã®ã§ãaã»bïŒ|a||b|cosΞ ãåºãŠããŸãã
AãšBã§èšç®ãããšãAâBïŒïŒ8, 2ïŒãªã®ã§ã蟺ã®é·ãã®2ä¹ã¯ 8²ïŒ2²ïŒ68 ã§ããå±éããåŒã§ã 169ïŒ25â2Ã63ïŒ68 ãšãªããåãå€ã«ãªããŸããã

ã³ãµã€ã³é¡äŒŒåºŠã®åŒ
aã»bïŒ|a||b|cosΞ ã®äž¡èŸºã |a||b| ã§å²ããšãcosΞïŒaã»b÷ïŒ|a||b|ïŒã«ãªããŸãããããã³ãµã€ã³é¡äŒŒåºŠã®åŒã§ããååã¯å ç©ã§ã忝ã¯ããããã®ãã¯ãã«ã®é·ããæãããã®ã§ãã

AãšBã§ãå®éã«èšç®ããŠã¿ãŸãã
å ç©ïŒ12Ã4ïŒ5Ã3ïŒ48ïŒ15ïŒ63
Aã®é·ãïŒâïŒ12²ïŒ5²ïŒïŒâ169ïŒ13
Bã®é·ãïŒâïŒ4²ïŒ3²ïŒïŒâ25ïŒ5
ã³ãµã€ã³é¡äŒŒåºŠïŒ63÷ïŒ13Ã5ïŒïŒ63÷65ïŒçŽ0.969

åãããã«èšç®ãããšãAãšCã¯25÷65ïŒçŽ0.385ãBãšCã¯15÷25ïŒ0.6ã§ãããæ¢šã®åç©«ããšãæç©ã®é信販売ãã¯ãšãŠãè¿ãããæ¢šã®åç©«ããšãããŒã ããŒãžå¶äœãã¯é ãããšããèŠãç®ã©ããã®çµæã«ãªããŸãã
0.969ãæ¬åœã«è§åºŠã®ã³ãµã€ã³ãªã®ããè§åºŠããèŠãŠã¿ãŸããAã®ç¢å°ã¯æšªã®è»žããçŽ22.62床ãBã¯çŽ36.87床ã®åããªã®ã§ãéã®è§åºŠã¯çŽ14.25床ã§ããcos14.25床ã¯çŽ0.969ã§ãåŒã®çããšäžèŽããŸãã
è§åºŠã0床ïŒåãåãïŒãªãã³ãµã€ã³ã¯1ã90床ïŒçŽè§ïŒãªã0ã180åºŠïŒæ£å察ïŒãªãâ1ã§ããè§åºŠãå°ããã»ã©1ã«è¿ã¥ãã®ã§ãã1ã«è¿ãã»ã©äŒŒãŠããããšèªããŸãã

ãªããè·é¢ãã§ã¯ãªããè§åºŠããªã®ã
2ã€ã®ãã¯ãã«ã®è¿ãã¯ãç¢å°ã®å ã©ããã®è·é¢ã§ã枬ããŸãããã ãæç« ã®å Žåãåã話é¡ã§ããæç« ã®é·ããæžãæ¹ã«ãã£ãŠããã¯ãã«ã®é·ããå€ããããšããããŸãã
äŸãã°ãAã®ã梚ã®åç©«ããšåãå 容ã§ãã¡ããã©2åã®é·ãã®ãã¯ãã«DïŒ24, 10ïŒããããšããŸããAãšDã®ç¢å°ã®å ã®è·é¢ã¯13ãé¢ããŠããŸãããåãã¯å®å šã«åããªã®ã§ãã³ãµã€ã³é¡äŒŒåºŠã¯1ã§ããã³ãµã€ã³é¡äŒŒåºŠã¯ãé·ãã®éãã«å·Šå³ããããåãã®è¿ãã§æ¯ã¹ãããŸãã

é·ãã1ã«ããããïŒæ£èŠåïŒ
ãã¯ãã«ãèªåã®é·ãã§å²ããšãåãã¯ãã®ãŸãŸã§ãé·ãã1ã«ãªããŸããããããæ£èŠåããšåŒã³ãŸããAã¯ïŒ12, 5ïŒÃ·13ïŒçŽïŒ0.923, 0.385ïŒãBã¯ïŒ4, 3ïŒÃ·5ïŒïŒ0.8, 0.6ïŒã«ãªããŸãã
é·ãã1ã«ãããããã¯ãã«ã©ããã§ã¯ã忝ã1Ã1ïŒ1ã«ãªãã®ã§ãã³ãµã€ã³é¡äŒŒåºŠã¯å ç©ãã®ãã®ã«ãªããŸããå®éã« 0.923Ã0.8ïŒ0.385Ã0.6 ãèšç®ãããšçŽ0.969ã§ãå ã»ã©ã®å€ãšåãã§ããembeddingã®ã¢ãã«ã®äžã«ã¯ãé·ãã1ã«ãããããã¯ãã«ãè¿ããã®ããããŸãã

é·ã1ãªããè·é¢ãšã³ãµã€ã³é¡äŒŒåºŠã¯åãé çªã«ãªã
é·ã1ã®ãã¯ãã«ã©ããã§ã¯ãå ã»ã©ã®äœåŒŠå®çã®åŒã® |a| ãš |b| ã1ã«ãªããŸãããã®ãããç¢å°ã®å ã©ããã®è·é¢ã®2ä¹ã¯ã2â2Ãã³ãµã€ã³é¡äŒŒåºŠãã«ãªããŸããAãšBã§ã¯ã2â2Ã0.969ïŒçŽ0.062ã§ãè·é¢ã®2ä¹ãæåããèšç®ããå€ãšåãã§ããã
ãã®åŒãããã³ãµã€ã³é¡äŒŒåºŠãé«ãã»ã©è·é¢ã¯çããªãããšãåãããŸããé·ãã1ã«ããããŠããã°ããè·é¢ã®è¿ãé ããšãã³ãµã€ã³é¡äŒŒåºŠã®é«ãé ãã¯åã䞊ã³ã«ãªããŸãã

Pythonã§äœ¿ãã©ã€ãã©ãªã®åœ¹å²
ããããã¯ãPythonã§å®éã«èšç®ããŸãããã®èšäºã§äœ¿ãã©ã€ãã©ãªã¯ã次ã®4ã€ã§ãããããã圹å²ãéãã®ã§ãçæAIã«ã³ãŒããæžããŠãããå Žåãããã®åæ ãç¥ã£ãŠãããšãåºãŠããã³ãŒããèªã¿ããããªããŸãã
spaCyïŒæç« ããã¯ãã«ã«ããïŒæ¥æ¬èªã®æç« ãåèªã«åããåè©ãå€å®ããåèªãã¯ãã«ãåãåºã
NumPyïŒãã ãã€ïŒïŒæ°ã®äžŠã³ãèšç®ããïŒãã¯ãã«ãé åãšããŠæã¡ãå ç©ã»é·ãã»å¹³åãªã©ããŸãšããŠèšç®ãã
scikit-learnïŒè§£æã®éå ·ç®±ïŒã³ãµã€ã³é¡äŒŒåºŠããŸãšããŠèšç®ãã颿°ããããããã®æ¬¡å ã2次å ã«çž®ããäž»æååæïŒPCAïŒãªã©ãæã€
pandasïŒãã³ãã¹ïŒïŒè¡šã§è¡šç€ºããïŒèšç®ããçµæã«ãè¡ãšåã®ååãä»ããŠè¡šã«ãã

NumPyã§ããããŸã§ã®èšç®ããã
ãŸãã2次å ã®äŸã®AãšBã§ããããŸã§ã®æ°åŠãNumPyã§èšç®ããŸããå ç©ã¯ np.dot(a, b) ã®ã»ããa @ b ãšãæžããŸããé·ã㯠np.linalg.norm(a) ã§ãäœãæå®ããªããã°ã2ä¹ããŠè¶³ããã«ãŒããåããé·ããè¿ããŸãã
import numpy as np
a = np.array([12, 5]) # A 梚ã®åç©«
b = np.array([4, 3]) # B æç©ã®é信販売
print(a + b, (a + b) / 2) # è¶³ãç®ãšã2ã§å²ã£ãå¹³å
print(np.linalg.norm(a)) # é·ãïŒãã«ã ïŒ
print(np.dot(a, b), a @ b, np.sum(a * b)) # å
ç©ïŒ3ã€ã®æžãæ¹ïŒ
cos = a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
print(round(cos, 3), round(np.degrees(np.arccos(cos)), 2)) # ã³ãµã€ã³ãšè§åºŠ
an = a / np.linalg.norm(a) # é·ãã1ã«ãããã
bn = b / np.linalg.norm(b)
print(round(an @ bn, 3)) # é·ã1ã©ããã®å
ç©
print(round(np.sum((an - bn) ** 2), 3), round(2 - 2 * (an @ bn), 3))[16 8] [8. 4.]
13.0
63 63 63
0.969 14.25
0.969
0.062 0.062æã§èšç®ããå€ãšããã¹ãŠåãã«ãªããŸãããæåŸã®è¡ã¯ãé·ã1ã®ãã¯ãã«ã©ããã®ãè·é¢ã®2ä¹ããšã2â2Ãã³ãµã€ã³é¡äŒŒåºŠããçããããšã衚ããŠããŸãã
æç« ããã¯ãã«ã«ããã³ãŒã
次ã«ã6æ¬ã®ããã°èšäºãçšæããæç« ããã¯ãã«ã«ãã颿°ãäœããŸããæç« ãåèªã«åããåè©ã§åè©ã»åè©ã»åœ¢å®¹è©ã«çµããããããã®åèªãã¯ãã«ãåãåºããŠå¹³åããŸãã

import numpy as np
import spacy
nlp = spacy.load("ja_core_news_md")
def to_vector(text):
# åè©ã»åè©ã»åœ¢å®¹è©ã®åèªãã¯ãã«ãå¹³åããŠãæç« ã®ãã¯ãã«ã«ãã
words = [w for w in nlp(text)
if w.pos_ in ("NOUN", "PROPN", "VERB", "ADJ") and w.has_vector]
return np.mean([w.vector for w in words], axis=0)
posts = [
"梚ã®åç©«ãå§ãŸããŸãã", # A
"ä»å¹Žã®æç©ã¯çãè²ã¡ãŸãã", # B
"ããŒã ããŒãžãæ°ããäœããŸãã", # C
"ãµã€ãã®ãã¶ã€ã³ã倿ŽããŸãã", # D
"è«æ±æžã®çºè¡ãèŠçŽããŸãã", # E
"çµçã®åž³ç°¿ãæŽçããŸãã", # F
]1æ¬ç®ã®èšäºããã¯ãã«ã«ããŠãåœ¢ãšæåã®5åã®æ°ã衚瀺ãããšã次ã®ããã«ãªããŸãã
v = to_vector(posts[0])
print(v.shape)
print(np.round(v[:5], 2))(300,)
[-0.07 -0.2 0.22 -0.14 0.02]ã(300,)ãã¯ã300åã®æ°ã1åã«äžŠãã é åã§ããããšã衚ããŠããŸãã6æ¬ã®èšäºããåã圢ã®300åã®æ°ã«ãªããŸãã
300次å ã§ããèšç®ã®äžèº«ã¯åã
å®éã®æç« ã®ãã¯ãã«ã§ãã2次å ã®ãšããšåãåŒã§èšç®ããŸããæ¢šã®Aãšæç©ã®Bã§ãå ç©ãšé·ããåºããŠã¿ãŸãã
X = np.array([to_vector(t) for t in posts]) # 6è¡Ã300å
a, b = X[0], X[1]
print(round(float(a @ b), 3), round(float(np.linalg.norm(a)), 3), round(float(np.linalg.norm(b)), 3))
print(round(float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b))), 2))3.865 2.663 2.386
0.61å ç©ã¯3.865ãé·ãã¯2.663ãš2.386ã§ã3.865÷ïŒ2.663Ã2.386ïŒïŒçŽ0.61 ã«ãªããŸããã2次å ã®ãšãã¯2çµã ã£ãæãç®ã300çµã«å¢ããŠããåŒã®åœ¢ã¯å€ãããŸããã

scikit-learnã§ãå šéšã®çµã¿åããã®é¡äŒŒåºŠãåºã
scikit-learnã®cosine_similarityã«ã6æ¬åã®ãã¯ãã«ãæž¡ããšããã¹ãŠã®çµã¿åããã®ã³ãµã€ã³é¡äŒŒåºŠãã6è¡Ã6åã®è¡šã«ããŠè¿ããŸãããã®è¡šããpandasã§è¡ãšåã«èšäºã®èšå·ãä»ããŠè¡šç€ºããŸãã
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd
sim = cosine_similarity(X) # 6è¡Ã6å
labels = list("ABCDEF")
print(pd.DataFrame(sim, index=labels, columns=labels).round(2)) A B C D E F
A 1.00 0.61 0.23 0.18 0.21 0.18
B 0.61 1.00 0.31 0.26 0.21 0.14
C 0.23 0.31 1.00 0.62 0.43 0.34
D 0.18 0.26 0.62 1.00 0.52 0.27
E 0.21 0.21 0.43 0.52 1.00 0.44
F 0.18 0.14 0.34 0.27 0.44 1.00
æãã«äžŠã¶1.00ã¯ãèªåèªèº«ãšã®æ¯èŒãªã®ã§å¿ ã1ã«ãªããŸããæ¢šã®AïŒæ¢šã®åç©«ïŒãšæç©ã®BïŒæç©ãçãè²ã£ãïŒã¯0.61ãããŒã ããŒãžã®Cãšãµã€ãã®Dã¯0.62ã§ãåã話é¡ã©ãããé«ããªããŸãããäžæ¹ã梚ã®AãšãããŒã ããŒãžãçµçã®èšäºãšã®é¡äŒŒåºŠã¯0.2ååŸã«ãšã©ãŸã£ãŠããŸãã
ãã ããçµçã®EïŒè«æ±æžïŒãšFïŒåž³ç°¿ïŒã¯0.44ã§ãEãšDïŒãµã€ãã®ãã¶ã€ã³ïŒã®0.52ããäœããªããŸããããèŠçŽããã倿Žãã®ãããªãäœæ¥ã衚ãèšèã䌌ãŠãããããšèããããŸããåèªãã¯ãã«ã®å¹³åã¯åãããããåé¢ããã®ããã«è©±é¡ä»¥å€ã®èšèã«åŒã£åŒµãããããšããããŸãã
衚ã¯ãè¡åã®æãç®ã§äžåºŠã«äœãã
cosine_similarityã®äžã§ããŠããããšã¯ãè¡åã®æãç®ã§æžããŸãã6æ¬ã®ãã¯ãã«ãããããé·ã1ã«ãããã6è¡Ã300åã®è¡š Xn ã«ããŸãããããšãè¡ãšåãå ¥ãæ¿ãã300è¡Ã6åã®è¡šãæãããšã6è¡Ã6åã®è¡šãã§ãããã®iè¡jåã¯ãiçªç®ãšjçªç®ã®èšäºã®å ç©ãã«ãªããŸãã
Xn = X / np.linalg.norm(X, axis=1, keepdims=True) # åè¡ã®é·ãã1ã«ãããã
sim2 = Xn @ Xn.T # 6Ã300 ãš 300Ã6 â 6Ã6
print(sim2.shape, np.allclose(sim2, cosine_similarity(X)))
print(np.round(sim2[0], 2))(6, 6) True
[1. 0.61 0.23 0.18 0.21 0.18]ãTrueãã¯ãcosine_similarityã®è¡šãšåãå€ã«ãªã£ãããšã衚ããŠããŸããé·ã1ã©ããã®å ç©ã¯ã³ãµã€ã³é¡äŒŒåºŠãã®ãã®ããšããæ£èŠåã®æ§è³ªãã6æ¬ãŸãšããŠäœ¿ã£ãŠããããšã«ãªããŸãã

æ€çŽ¢ããŠã¿ãïŒè³ªåã«è¿ãèšäºãé ã«äžŠã¹ã
次ã«ãèšäºã«ãªãæç« ã§æ€çŽ¢ããŸããæ€çŽ¢ã®æç« ããã¯ãã«ã«ããŠã6æ¬ã®èšäºãšã®é¡äŒŒåºŠãèšç®ããé«ãé ã«3æ¬ã衚瀺ããŸãã
for query in ["æç©ã®åãå
¥ãã®å£ç¯ã§ã", "ãŠã§ããµã€ããå
¬éããŸãã"]:
q = to_vector(query).reshape(1, -1)
scores = cosine_similarity(q, X)[0]
print("æ€çŽ¢ïŒ", query)
for i in scores.argsort()[::-1][:3]:
print(f" {scores[i]:.2f} {posts[i]}")æ€çŽ¢ïŒ æç©ã®åãå
¥ãã®å£ç¯ã§ã
0.60 ä»å¹Žã®æç©ã¯çãè²ã¡ãŸãã
0.49 梚ã®åç©«ãå§ãŸããŸãã
0.35 ãµã€ãã®ãã¶ã€ã³ã倿ŽããŸãã
æ€çŽ¢ïŒ ãŠã§ããµã€ããå
¬éããŸãã
0.64 ãµã€ãã®ãã¶ã€ã³ã倿ŽããŸãã
0.60 ããŒã ããŒãžãæ°ããäœããŸãã
0.46 è«æ±æžã®çºè¡ãèŠçŽããŸãã
ãæç©ã®åãå ¥ãã®å£ç¯ã§ããã§ã¯ããæ¢šã®åç©«ãå§ãŸããŸãããã2äœã«å ¥ããŸããããã®2ã€ã®æç« ã«ã¯ãåãåèªãäžã€ããããŸãããåèªããšã«èŠããšããæç©ããšã梚ãã0.59ããæç©ããšãåç©«ãã0.47ããå£ç¯ããšãåç©«ãã0.34ãšãåèªãã¯ãã«ã©ãããè¿ããããæå³ã§èŠã€ããããŠããŸãã
äžæ¹ã§ããåãå ¥ãããšãåç©«ãã®é¡äŒŒåºŠã¯0.06ã§ããã®ã¢ãã«ã¯ãåãå ¥ãããåç©«ã®æå³ãšããŠã¯æããŠããŸããã§ããã1äœã®ãä»å¹Žã®æç©ã¯çãè²ã¡ãŸããããããæç©ããšããåãåèªãå¹ããŠããŸããåèªãã¯ãã«ã®å¹³åã§æ¢ããç¯å²ã«ã¯ããã®ãããªéãããããŸãã
çæAIã«ç€Ÿå ã®è³æãèªãŸããŠçããããä»çµã¿ã§ããè³æã现ããåããŠãã¯ãã«ã«ããŠããã質åã«è¿ãè³æãåãåºãéšåã§ããã®ãæ€çŽ¢ã®æç« ã«è¿ãé ã«äžŠã¹ããèšç®ã䜿ãããŠããŸãã
300次å ã2次å ã«ããŠãå°å³ã®ããã«è¡šç€ºãã
é¡äŒŒåºŠã®è¡šã¯æ£ç¢ºã§ãããèšäºãå¢ãããšèªã¿ã«ãããªããŸããããã§ãscikit-learnã®äž»æååæïŒPCAïŒã䜿ãã300次å ã®ãã¯ãã«ã2次å ã«çž®ããŠãç¹ã®å°å³ãšããŠè¡šç€ºããŸããPCAã¯ãããŒã¿ã®ã°ãã€ãã倧ããæ¹åãé ã«éžã³ããã®æ¹åã®åº§æšã«çœ®ãæããæ¹æ³ã§ãã
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
xy = pca.fit_transform(X) # 300次å
â 2次å
for t, (x, y) in zip(posts, xy):
print(f"{x:6.2f} {y:6.2f} {t}")
print(pca.explained_variance_ratio_.round(2)) 1.58 -1.03 梚ã®åç©«ãå§ãŸããŸãã
1.39 -0.44 ä»å¹Žã®æç©ã¯çãè²ã¡ãŸãã
-0.25 1.24 ããŒã ããŒãžãæ°ããäœããŸãã
-0.19 1.32 ãµã€ãã®ãã¶ã€ã³ã倿ŽããŸãã
-0.47 0.35 è«æ±æžã®çºè¡ãèŠçŽããŸãã
-2.06 -1.44 çµçã®åž³ç°¿ãæŽçããŸãã
[0.39 0.29]
æç©ã®2æ¬ã¯å³ã«ãããŒã ããŒãžã®2æ¬ã¯äžã«éãŸããŸãããæåŸã®è¡ã®0.39ãš0.29ã¯ã暪ã®è»žãšçžŠã®è»žããå ã®ã°ãã€ãã®ãããã39ïŒ ãš29ïŒ ã衚ããŠããããšã瀺ããŠããŸããåãããŠçŽ7å²ãªã®ã§ãæ®ãã®çŽ3å²ã¯å³ããèœã¡ãŠããŸãã
2次å ã®å°å³ã¯å šäœã®æ§åãèŠãããã®ãã®ã§ãè¿ããæ£ç¢ºã«æ¯ã¹ããšãã¯ãå ã®300次å ã®ã³ãµã€ã³é¡äŒŒåºŠã䜿ããŸãã
䜿ããšãã«æ³šæããããš
å€ã®å€§ããã¯ãã¢ãã«ã«ãã£ãŠéãïŒåã2ã€ã®æç« ã§ããã¢ãã«ãéãã°é¡äŒŒåºŠã®å€ã¯å€ãããã0.5以äžãªã䌌ãŠãããã®ãããªæ±ºãŸã£ãåºæºã¯ãªããåãã¢ãã«ã®äžã§æ¯ã¹ãŠäœ¿ã
èšäºãšæ€çŽ¢ã®æç« ã¯ãåãã¢ãã«ã§ãã¯ãã«ã«ããïŒã¢ãã«ãéããšãæ°ã®äžŠã³ã®æå³ãéããããæ¯ã¹ãããªããã¢ãã«ãå€ããããä¿åããŠãããã¯ãã«ãäœãçŽã
次å ã®æ°ãããããïŒãã®èšäºã®ã¢ãã«ã¯300次å ãå ç©ã¯åãçªå·ã©ãããæããã®ã§ã次å ã®æ°ãéããã¯ãã«ã©ããã¯èšç®ã§ããªã
åèªãã¯ãã«ã®å¹³åã¯ãèªé ãåæ ããªãïŒãAãBãããšãBãAãããåããã¯ãã«ã«ãªããæç« ã®æå³ã现ããæ¯ã¹ãããšãã¯ãæåã蟌ã¿ã¢ãã«ã䜿ã

ãŸãšãïŒembeddingãšã³ãµã€ã³é¡äŒŒåºŠã®ç¢ºèª
embeddingã¯ãæç« ãæ±ºãŸã£ãåæ°ã®æ°ã®äžŠã³ïŒãã¯ãã«ïŒã«ããããš
æç« ã®ãã¯ãã«ã¯ãåèªãã¯ãã«ã®è¶³ãç®ãšå²ãç®ïŒå¹³åïŒã§äœãã
ãã¯ãã«ã®é·ãã¯äžå¹³æ¹ã®å®çã2ä¹ããŠå šéšè¶³ããã«ãŒããåã
å ç©ã¯ãåãçªå·ã©ãããæããŠå šéšè¶³ããæ°ããé·ãÃ圱ã®é·ããã§ããã
äœåŒŠå®çãã aã»bïŒ|a||b|cosΞãã³ãµã€ã³é¡äŒŒåºŠã¯ãå ç©Ã·ïŒé·ãÃé·ãïŒã
é·ãã1ã«ãããããšãã³ãµã€ã³é¡äŒŒåºŠã¯å ç©ãšåãã«ãªããè·é¢ã®è¿ããšãåãé çªã«ãªã
scikit-learnã®cosine_similarityã§å šéšã®çµã¿åãããèšç®ã§ããäžèº«ã¯è¡åã®æãç®
é¡äŒŒåºŠã®å€ã¯ã¢ãã«ã«ãã£ãŠéããèšäºãšæ€çŽ¢ã®æç« ã¯åãã¢ãã«ã§ãã¯ãã«ã«ãã

æç« ããã¯ãã«ã«ããŠããŸãã°ãã䌌ãŠãããã䌌ãŠããªããã¯ãå ç©ãšé·ãã䜿ã£ãèšç®ã§æ¯ã¹ãããŸãã300次å ã§ããäžã§ããŠããããšã¯2次å ã®ç¢å°ãšåãæãç®ãšè¶³ãç®ãªã®ã§ãå³ã®ç¢å°ãæãæµ®ãã¹ããšãèšç®ã®æå³ãèŠéãããããªããŸãã
â» éå»ã®èšäºâ
NDã·ã¹ãã ãºã®ãµãŒãã¹ã«ã€ããŠ
NDã·ã¹ãã ãºã¯ãæé¡å¶ã®ããŒã ããŒãžå¶äœãäžå¿ã«ãAIã»DXæ¯æŽãç¬èªã·ã¹ãã éçºãªã©ãäºæ¥ã®ããžã¿ã«åãæ¯æŽããŠããŸããååã®ç¡æçžè«ïŒãªã³ã©ã€ã³ã»30åïŒã¯ããåãåããã®ãã©ãŒã ãŸãã¯ã¡ãŒã«ã§æ¿ããŸãã
åèè³æ
chiVe: Sudachi ã«ããæ¥æ¬èªåèªãã¯ãã«ïŒã¯ãŒã¯ã¹ã¢ããªã±ãŒã·ã§ã³ãºãGitHubïŒ
Linguistic FeaturesïŒWord vectors and semantic similarityïŒspaCy ããã¥ã¡ã³ãïŒïŒè±èªïŒ
sklearn.metrics.pairwise.cosine_similarityïŒscikit-learn ããã¥ã¡ã³ãïŒïŒè±èªïŒ
sklearn.decomposition.PCAïŒscikit-learn ããã¥ã¡ã³ãïŒïŒè±èªïŒ
numpy.linalg.normïŒNumPy ããã¥ã¡ã³ãïŒïŒè±èªïŒ
Dot productïŒWikipediaïŒïŒè±èªïŒ
What is cosine similarity?ïŒIBMïŒïŒè±èªïŒ
Sentence TransformersïŒGitHubïŒïŒè±èªïŒ