ããã¯ã èªç¶èšèªåŠç Advent Calendar 2021 ã®20æ¥ç®ã®èšäºã§ãã æ°å2幎ç®ã®ãšã³ãžãã¢ãåæã§ãã æ®æ®µã¯ãã©ã«ã·ã¢ã®DXãã©ãããã©ãŒã éšã»æè¡ç ç©¶æãšãã2ã€ã®éšçœ²ã«æå±ããwebéçºãšèªç¶èšèªåŠçã®äºè¶³ã®èéãå±¥ããŠããŸããäºå
ã远ãè
ã¯äžå
ããåŸããšããèšèããããŸãããä»ã¯ã²ãŒã²ãŒèšããªãããäºå
ã远ãããšã³ãžãã¢ãç®æããŠããŸãã ãšããã§çãããäŸåæ§é è§£æããŠãŸããïŒ äŸåæ§é è§£æã¯èªç¶èšèªåŠçã®å®å¿çšã«ãããŠéèŠãªåºç€è§£æã®1ã€ã§ããæäžã®ã©ã®åèªïŒãããã¯å¥ïŒãã©ã®åèªïŒå¥ïŒã«äŸåããŠãããããŸããããã®åèªïŒå¥ïŒéã¯ã©ããªé¢ä¿ãæã£ãŠããã®ãïŒäŸåæ§é ïŒãè§£æããŸããäžè¬çã«äŸåæ§é è§£æã¯ãæãåèªã圢æ
çŽ ã«åå²ããããåèªã圢æ
çŽ ã«åè©ã®ã©ãã«ãä»äžããããã圢æ
çŽ è§£æãšåŒã°ããåŠçã®åŸã«è¡ãããŸãã ïŒç»åïŒãéšå±ããèŠãã倿¯ãçŸããã£ãããã®äŸåæ§é è§£æã®çµæïŒ äžã®å³ã¯ããéšå±ããèŠãã倿¯ãçŸããã£ããããšãããããã«ã®ã¬ãã¥ãŒãæ³å®ããèªç¶èšèªæã«å¯ŸããŠäŸåæ§é ãè§£æããçµæã§ããåèªã®äžã«æžããŠãã NOUN , ADP ãªã©ã®æååã¯ããããåè©ãå©è©ãšãã£ãåè©ã衚ããŠããŸãããŸããäŸåé¢ä¿ãæã€åèªãšåèªãç¢å°ã§ç¹ãããŠãããããããã®ç¢å°ã«ã¯é¢ä¿ã®çš®é¡ã衚ãã©ãã«ãä»äžãããŠããŸããããã§ã¯ãã¹ãŠã®ã©ãã«ã説æããããšã¯ããŸããããäŸãã°ä»¥äžã®ãããªæå³ããããŸãã 倿¯âèŠãã aclïŒåœ¢å®¹è©çä¿®é£Ÿç¯ çŸããã£â倿¯ nsubjïŒåè©å¥äž»èª äŸåæ§é è§£æã¯æ§ã
ãªå Žé¢ã§åœ¹ç«ãŠãããŸããäŸãã°ããæçãé«çŽããã«ã®ããã«è±ªè¯ã§çŸå³ããã£ããããšãã修食çãªèªå¥ã®ããæããæçãçŸå³ããã£ããããªã©ã®ããã«èŠçŽããããšã§ã人éã倧éã®æç« ãçè§£ããã®ãè£å©ããææžèŠçŽã·ã¹ãã ãããããããã«ã¯ãã€éæ¥ããŸããïŒããšãã質åã«å¯ŸããŠãããããã«ã¯12æ20æ¥ã«éæ¥äºå®ã§ããããšãããããªæãå
ã«ã12æ20æ¥ããšåçãããããªè³ªåå¿çã·ã¹ãã ãªã©ãžã®å¿çšãèããããŸããä»åã¯ç°¡åãªäŸæã䜿ã£ãŠãäŸåæ§é è§£æã䜿ã£ãã¬ãã¥ãŒæããã®æ
å ±æœåºã«ãã£ã¬ã³ãžããŠã¿ãŸãããïŒ æºå ä»åã¯äŸåæ§é è§£æãå«ãå皮解æã« GiNZA ãšããPythonã©ã€ãã©ãªã䜿çšããŸããGiNZAã¯Megagon LabsãéçºãããªãŒãã³ãœãŒã¹ã®æ¥æ¬èªNLPã©ã€ãã©ãªã§ãæå
ç«¯ã®æ©æ¢°åŠç¿æè¡ãçµã¿èŸŒãã èªç¶èšèªåŠçã®ããã®ãã¬ãŒã ã¯ãŒã¯ã§ãã spaCy ãšãã¯ãŒã¯ã¹ã¢ããªã±ãŒã·ã§ã³ãºåŸ³å³¶äººå·¥ç¥èœNLPç ç©¶æã§éçºããããªãŒãã³ãœãŒã¹åœ¢æ
çŽ è§£æåšã®Pythonå®è£
SudachiPy ãåºç€æè¡ãšããŠããŸãã ä»åã®äž»åœ¹ã§ããèšäºã¿ã€ãã«ã«ããªã£ãŠãã DependencyMatcher ã¯spaCyã®APIã«ãããã®ãªã®ã§ãæ¬èšäºã§ DependencyMatcher ã®äœ¿ãæ¹ãçè§£ããã°GiNZAã«ããæ¥æ¬èªã®èªç¶èšèªåŠçã ãã§ãªããspaCyã§å¯Ÿå¿ããŠããä»ã®èšèªã®åŠçã«ãé©çšã§ããŸãã ã§ã¯æ©éãGiNZAãã€ã³ã¹ããŒã«ããŸãããã pip install -U ginza ja-ginza-electra ja-ginza-electra ãšããã®ã¯ãGiNZAçšã®ææ°ã®èšèªã¢ãã«ã§ãåŸæ¥ã®èšèªã¢ãã«ãããé«ãè§£æç²ŸåºŠãæã¡ãŸãã ãã ãã¡ã¢ãªå®¹é16GBä»¥äžæšå¥šãšã®ããšãªã®ã§ãã¡ã¢ãªã®å°ãããã·ã³ã§åŠçãè¡ãå Žåãè§£æç²ŸåºŠãããå®è¡é床ãéèŠãããå Žåã«ã¯ã ja-ginza-electra ã®ä»£ããã« ja-ginza ãã€ã³ã¹ããŒã«ããŠãã ããã ã€ã³ã¹ããŒã«ãæžãã ããã©ã€ãã©ãªãimportããŠè§£æã®æºåãæŽããŸãããã import ginza import spacy nlp = spacy . load ( 'ja_ginza_electra' ) # ååã¯ã¢ãã«ãããŠã³ããŒãããããã«æéãããããŸã # nlp = spacy.load('ja_ginza') # ja-ginzaãã€ã³ã¹ããŒã«ããå Žåã®ã¿ ç¶ããŠäœ¿çšããããã¹ãããŒã¿ãæºåããŸãã ãæå
ã«ããŒã¿ãããã°ããã䜿çšããŠãæ§ããŸããããä»åã¯ãµã³ãã«ãšããŠããããã«ã®ã¬ãã¥ãŒãæ³å®ãã3æãçšæããŸããã ã¬ãã¥ãŒããŒã¿ã¯å®åã«ãããèªç¶èšèªåŠçã§ããæ±ãããããŒã¿ã®1ã€ã§ãã txts = [ "éšå±ããèŠãã倿¯ãçŸããã£ãã" , "ç«å°ã¯æªããé£äºãçŸå³ããã" , "客宀é²å€©é¢šåã¯å€§äººã§ãè¶³ãã®ã°ããŠãšãŠãåºãã£ãã" ] Matcherã«ãããããã³ã° ãŸãã¯äŸåæ§é è§£æããããããŒã¯ã³ïŒåèª, 圢æ
çŽ ïŒåäœã§ã®ãããã³ã°ã§æ
å ±ãæœåºããŠã¿ãŸãããã spaCyã«ã¯MatcherãšãããããŒã¯ã³åäœã§ã®ãããã³ã°ã«é©ããAPIããããŸãã æåã«ãMatcherã䜿ã£ãŠãã®ããã«ã®ã¬ãã¥ãŒã«ã©ã®ãããªåœ¢å®¹è©ã䜿ãããŠããã®ãèŠãŠã¿ãŸãããã from spacy.matcher import Matcher matcher = Matcher ( nlp . vocab ) # æ¥æ¬èªã®èªåœã®éåãæž¡ããŠMatcherãªããžã§ã¯ããäœã patterns = [ [{ "TAG" : { "REGEX" : "^圢容è©" }}] # ã«ãŒã«ã®å®çŸ©ãåè©ã¿ã°ãã圢容è©ãã§å§ãŸããã® ] matcher . add ( "adj" , patterns ) # Matcherãªããžã§ã¯ãã«ã«ãŒã«åadjãšããŠã«ãŒã«ãç»é² s = "" . join ( txts ) # 3ã€ã®æãã€ãªããŠ1ã€ã®æååã«ãã doc = nlp ( s ) # åŒæ°ã«äžããããæååãæç« ãšããŠè§£æãã matches = matcher ( doc ) # matchesã®äžã«ãããã³ã°çµæãå
¥ã ã«ãŒã«ã¯ããããã¹ãããŒã¯ã³ã®å±æ§ãéããdictã®listã§ãã äŸãã°æ¬¡ã®ã«ãŒã«ã¯ããåè©ã¿ã°ã®ååã圢容è©ã§å§ãŸããã®ãã衚ãã«ãŒã«ã§ãã [{ "TAG" : { "REGEX" : "^圢容è©" }}] TAG ã¯åè©ã¿ã°ãæå®ããããšãæå³ããŸãã TAG ã®ä»£ããã« LEMMA ã䜿ãããšã§èŠåºãèªã«å¯Ÿããæå®ã TEXT ã䜿ãããšã§ææžäžåèªã®æååãã®ãã®ã«å¯Ÿããæå®ãå¯èœã§ãã {"REGEX": "^圢容è©"} ã¯åè©ã¿ã°ã ^åœ¢å®¹è© ãšããæ£èŠè¡šçŸã«åœãŠã¯ãŸããã®ïŒïŒãã¹ãŠã®åœ¢å®¹è©ïŒãšããæå³ã§ããæ£èŠè¡šçŸã䜿ããªãå Žåã«ã¯æååã§ "圢容è©-äžè¬" ãªã©ãšæå®ã§ããŸãã GiNZAå
éšã§äœ¿ãããŠãã圢æ
çŽ è§£æåšSudachiPyã®åè©ã¿ã°ã®è¡šçŸæ¹æ³ã§ã¯ããã€ãã³ã€ãªãã§ãã詳现ãªåè©ã衚çŸããŠããŸãããã®ãããåè©ãã圢容è©ããåè©ããšãã£ã倧ããªåé¡ã®ã¿äœ¿ãããå Žåã¯ãæ£èŠè¡šçŸã§åè©ã¿ã°ãæå®ãããšè¯ãã§ããè§£æçµæã® doc ãforã«ãŒãã§åããšã©ã®åèªã«ã©ã®åè©ã¿ã°ãã€ããŠãããèŠãããšãã§ããŸãã ã«ãŒã«ã®æžãæ¹ã«ã€ããŠãã£ãšè©³ããåŠã³ããæ¹ã¯ å
¬åŒããã¥ã¡ã³ã ãå
¬åŒã® USAGE ããåç
§ãã ããã doc = nlp ( txts [ 0 ]) for token in doc : print ( token . text , token . tag_ ) # éšå± åè©-æ®éåè©-äžè¬ # ãã å©è©-æ Œå©è© # èŠãã åè©-äžè¬ # 倿¯ åè©-æ®éåè©-äžè¬ # ã å©è©-æ Œå©è© # çŸãã㣠圢容è©-äžè¬ # ã å©åè© # ã è£å©èšå·-å¥ç¹ ã«ãŒã«ãå®çŸ©ã§ããããæ¬¡ã«ãããMatcherãªããžã§ã¯ãã«ç»é²ããŸãã matcher.add() ã®ç¬¬ïŒåŒæ°ã«ã«ãŒã«ã®ååã第2åŒæ°ã«ã«ãŒã«ã®listãæå®ããããšã§ç»é²ã§ããŸãã ã«ãŒã«ã®listãªã®ã§ãè€æ°ã®æ¡ä»¶ãäžããããšãå¯èœã§ãã äŸãã°ã圢容è©ã«å ããŠåœ¢å®¹åè©ïŒã芪åã ããäžæå¿«ã ããªã©ïŒã«ããããã³ã°ããããå Žåã«ã¯ã次ã®ããã«æžãããšãã§ããŸãã patterns = [ [ { "TAG" : { "REGEX" : "^圢容è©" }} ], [ # ä»å䜿çšããããŒã«ã®åè©äœç³»ã«ããã圢容åè©çžåœã®è¡šçŸ # åèïŒhttps://ccd.ninjal.ac.jp/unidic/glossary { "TAG" : "åè©-æ®éåè©-圢ç¶è©å¯èœ" }, { "LEMMA" : "ã " } ] ] matcher . add ( "multiple patterns" , patterns ) ãããã³ã°çµæãèŠãŠã¿ãŸãããã å
¬åŒããã¥ã¡ã³ã ãèŠãŠã¿ããšãè¿ãå€ã«ã¯ (match_id, start, end) ã®ãããªã¿ãã«ã®ãªã¹ããè¿ã£ãŠããããã§ããã«ãŒã«ã«ãããããéšåã®æååã¯ããšããšã®æç« ãè§£æãã doc ã«å¯Ÿã㊠doc[start:end] ã§ååŸã§ããŸãã for _ , start , end in matches : print ( doc [ start : end ]. lemma_ ) # .lemma_ ã¯èŠåºãèªãååŸããããšãæå³ãã äžèšã®foræãå®è¡ãããšã次ã®ãããªçµæãåºåãããŸãã çŸãã æªã çŸå³ãã åºã ããã«ã«æ³ãŸã£ã人ãã©ããªããšãæããã®ãã¯ãªããšãªãäŒãã£ãŠããŸããããªããšãªã以äžã®ããšã¯åãããŸããã ç¹ã«ããæªããã«ã€ããŠã¯äžäœäœãæªãã£ãã®ãæ°ã«ãªã£ãŠããŸããŸããã ããã§ã«ãŒã«ãæ¹è¯ãããã®åœ¢å®¹è©ã«å¯Ÿãããäœãããåããããã«ããŠã¿ãŸãããã äŸãã°ã次ã®ãããªã«ãŒã«å®çŸ©ãèããããŸãã patterns = [ [ { "TAG" : { "REGEX" : "^åè©" }}, { "TEXT" : { "IN" : [ "ã¯" , "ã" ]}}, #ãã¯ãããããã®ããããã«ããã { "TAG" : { "REGEX" : "^圢容è©" }}] ] ] ãããå
çšã®ããã«Matcherãªããžã§ã¯ãã«ç»é²ãããããã³ã°çµæãèŠãŸãã matcher = Matcher ( nlp . vocab ) matcher . add ( "noun-adj" , patterns ) doc = nlp ( s ) # s 㯠txt ã«å«ãŸããæããã¹ãŠ join ãããã® matches = matcher ( doc ) for _ , start , end in matches : print ( doc [ start : end ]. lemma_ ) ãããšã次ã®ããã«åºåãããŸãã 倿¯ãçŸãã ç«å°ã¯æªã é£äºãçŸå³ãã ãªãã»ã©ããæªãããšèšãããŠããã®ã¯ç«å°ã§ã倿¯ãšé£äºã¯è€ããããŠããããã§ãã ã§ããããã§ã圢容è©ãæœåºãããšãã®çµæãããäžåºŠèŠãŠã¿ãŸãããã çŸãã æªã çŸå³ãã åºã äžã®3ã€ã¯äœã«å¯ŸããŠèšãããŠããã®ãåãããŸããããäœããåºãããšèšãããŠããã®ãã¯æœåºã§ããŠããŸããã ãåºãããšããåèªãå«ãŸããŠããã®ã¯ä»¥äžã®æã§ããã 客宀é²å€©é¢šåã¯å€§äººã§ãè¶³ãã®ã°ããŠãšãŠãåºãã£ãã ä»ã®æãšæ¯ã¹ããšããè€éãªæã§ããã 人éã¯ãã®æãèŠããšãã«ãåºããšèšãããŠããã®ã¯å®¢å®€é²å€©é¢šåïŒãããã¯é²å€©é¢šåïŒã ãªããšããã«å€æã§ããŸãããã³ã³ãã¥ãŒã¿ã«ãšã£ãŠã¯èªæã§ã¯ãããŸããã ãåºãã£ããã®çŽåã®3åèªã¯ãã®ã°ããããŠãããšãŠããã§ãåçŽã«ãåºããã®çŽåãèŠãã°è¯ããšããããã§ã¯ãããŸããã å©è©ãã¯ããããã§å€æããæããããŸããå®éãå©è©ãã¯ãããããå«ãçŽåã®æç¯ã圢容è©ã®æå³ã®å¯Ÿè±¡ãšãªã£ãŠããå Žåãå€ããããŸãããã ãä»åã®å ŽåãçŽåã®ãã¯ãããããã€ãåèªã¯ãè¶³ãã§ããè¶³ãåºãããšèšã£ãŠãããšã¯èãã¥ããã§ããã ãããªãšãã«äœ¿ããã®ãä»åã®ã¡ã€ã³ããŒããäŸåæ§é è§£æã§ãã DepdencyMatcherã«ãããããã³ã° å®ã¯spaCyã«ã¯DepdencyMatcherãšãããäŸåæ§é ã䜿ã£ããããã³ã°ã®ããã®APIããããŸãã äœ¿ãæ¹ã¯MatcherãšäŒŒãŠããŸãããã«ãŒã«ã®æžãæ¹ãšãããã³ã°çµæã®åãåºãæ¹ãç°ãªããŸãã æã«å¯ŸããäŸåæ§é ã¯æšæ§é ããªããŠããŸããã€ãŸãããã ïŒã€ã ãæ ¹ãšãªãããŒã¯ã³ããããæ ¹ä»¥å€ã®ããŒã¯ã³ã¯ãã 1ã€ã®ä¿ãå
ããŒã¯ã³ãæã£ãŠãããšããããšã§ãã ãã®èšäºã®æåã®å³ããããèŠãŠããã ããšãçŸããã£ããšããããŒã¯ã³ãæ ¹ãšããæšæ§é ã«ãªã£ãŠããŸãã æã«å¯ŸããäŸåæ§é ãæšæ§é ãªã®ã§ãäŸåæ§é ã䜿ã£ãã«ãŒã«ãæšæ§é ã«ãªããŸãã äŸåæ§é ã䜿ã£ãã«ãŒã«ã¯ããŒã¯ã³åäœã§ã®ãããã³ã°ãè¡ãã«ãŒã«ããå°ãè€éãªã®ã§ãæåã«ã«ãŒã«ã®äŸããèŠãããŸãã ãœãŒã¹ã³ãŒããšæšæ§é ã®å³ã察å¿ä»ããªããèŠãŠã¿ãŸãããã ä»åã®äŸã¯ããŒãã2ã€ã ãã§ããããããç«æŽŸãªæšæ§é ã§ãã patterns = [ [ { "RIGHT_ID" : "adj" , "RIGHT_ATTRS" : { "TAG" : { "REGEX" : "^圢容è©" }} } ,{ "LEFT_ID" : "adj" , "REL_OP" : ">" , "RIGHT_ID" : "noun" , "RIGHT_ATTRS" : { "TAG" : { "REGEX" : "^åè©" }, "DEP" : "nsubj" } } ] ] ïŒç»åïŒDependencyMatcherçšã®ã·ã³ãã«ãªã«ãŒã«ã®å³è§£ïŒ å³ã®ããã«ãDependencyMatcherçšã®ã«ãŒã«ã¯å·Šãæ ¹ãšããŠå³åŽã«ããŒããçãããŠããæšæ§é ã«ãªã£ãŠããŸãã Matcherã®ãšããšåæ§ã« patterns ãã«ãŒã«ã®listã«ãªã£ãŠããŠããã®äžã«1ã€1ã€ã®ã«ãŒã«ãdictã®listãšããŠè¡šçŸãããŠããŸãã dictã¯ããããæšæ§é ã®å蟺ã«å¯Ÿå¿ããŠããŸããããã§ãã€ã³ãã«ãªãã®ã¯ãããŒãã§ã¯ãªã蟺ã1ã€ã®dictã«å¯Ÿå¿ããŠããããšã§ãã æ ¹ããŒãã®å·Šã«ã¯äœã®æ¡ä»¶æå®ããªããããŒããŒãããã£ã€ããŠããŠããããŒããŒããšæ ¹ããŒãã®éã®èŸºã匵ããªããã°ãªããªãããšèãããšåãããããã§ãã åé
ç®ã®æå³ã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã LEFT_ID ïŒèŸºã®å·ŠåŽã®ããŒãã®IDãšãªãæååãèšå®ããå ŽåããããŸã§ã®èŠçŽ ã® RIGHT_ID ã§ç»å Žããæååã§ãªããã°ãªããŸããã RIGHT_ID ïŒèŸºã®å³åŽã®ããŒãã®IDãšãªãæååãä»ã®ããŒããšãã¶ããªãååãã€ããŸãã REL_OP ïŒå·Šå³ã®ããŒãã®é¢ä¿ã > ã§ããã°å³ã®ããŒããå·Šã®ããŒãã«çŽæ¥äŸåããŠããããšã瀺ãã < ã§ããã°å·Šå³éïŒå·Šã®ããŒããå³ã®ããŒãã«äŸåïŒã§ããäŸå以å€ã®é¢ä¿ãæè»ã«å®çŸ©ã§ããäŸãã° . ã¯æã®äžã§å³ã®ããŒããå·Šã®ããŒãã®çŽåã«æ¥ãããšãã ; ã¯å³ã®ããŒããå·Šã®ããŒãã®çŽåŸã«æ¥ãããšãæå³ããŸãã RIGHT_ATTR ïŒèŸºã®å³ã®ããŒãã«å¯Ÿå¿ããããŒã¯ã³ã®æ¡ä»¶ãèšèŒããŸããMatcherçšã®ã«ãŒã«ãšåæ§ã«åè©ã¿ã°ãèŠåºãèªãªã©ãçŽæ¥æå®ã§ããŸãã DEP ã䜿ãã°äŸåé¢ä¿ã®çš®é¡ãæå®ã§ããŸãã å°éçãªèª¬æã«ã¯ãªããŸãããGiNZA/spaCyã§æ¥æ¬èªããã¹ããè§£æããéã®äŸåé¢ä¿ã®çš®é¡ã«ã€ããŠã¯æ¬¡ã®è«æã«è©³ãããŸãšãŸã£ãŠããŸãã æµ
å æ£å¹ž, éå±± å, 宮尟 ç¥ä», ç°äž 貎ç§, 倧æ è, æè æåŸ, æŸæ¬ è£æ²», Universal Dependencies æ¥æ¬èªã³ãŒãã¹, èªç¶èšèªåŠç, 2019, 26å·», 1å·, p.3-36, https://www.jstage.jst.go.jp/article/jnlp/26/1/26_3/_article/-char/ja . æ
£ããªããã¡ã¯äŸåé¢ä¿ã®çš®é¡ãæå®ããããšãé£ããæããæ¹ãå€ããããããŸããã ããããªãããå®éã«æ§ã
ãªæãè§£æã«ãããªããåç
§ããŠã¿ããšåŸã
ã«åãã£ãŠãããšæããŸãã è§£æçµæã¯äŸãã°æ¬¡ã®ããã«å¯èŠåã§ããã®ã§æŽ»çšããŠãã ããã s = "éšå±ããèŠãã倿¯ãçŸããã£ã" doc = nlp ( s ) displacy . render ( doc ) # jupyteräžã§å¯èŠåããå Žåã¯jupyter=Trueãæå®ãã æ¬¡ã®ãããªç»åãåºåãããŸãã ãŸããåããŒãã«ã¯å¿
é ã®é
ç®ããããŸãã æ ¹ããŒããå®çŸ©ãã dictïŒ RIGHT_ID RIGHT_ATTR 蟺ãå®çŸ©ãã dictïŒ LEFT_ID REL_OP RIGHT_ID RIGHT_ATTR å³ã®ããŒããã©ããªåèªã§ãè¯ãããšããå ŽåããããŸããããã®å Žå㯠RIGHT_ATTR ã«ç©ºã®dict {} ãèšå®ããŠãããŸãã ãã£ãšè€éãªã«ãŒã«ãæžãããå Žåã«ã¯ å
¬åŒããã¥ã¡ã³ã ãå
¬åŒã® USAGE ããåç
§ãã ããã ããŠãã«ãŒã«ã®æžãæ¹ã®èª¬æãé·ããªã£ãŠããŸããŸããããäžèšã®ã«ãŒã«ã§ãããã³ã°ãããŠã¿ãŸãããã from spacy.matcher import DependencyMatcher matcher = DependencyMatcher ( nlp . vocab ) patterns = [ [ { "RIGHT_ID" : "adj" , "RIGHT_ATTRS" : { "TAG" : { "REGEX" : "^圢容è©" }} } ,{ "LEFT_ID" : "adj" , "REL_OP" : ">" , "RIGHT_ID" : "noun" , "RIGHT_ATTRS" : { "TAG" : { "REGEX" : "^åè©" }, "DEP" : "nsubj" } } ] ] matcher . add ( "adj_noun_pair" , patterns ) # txts = [ # "éšå±ããèŠãã倿¯ãçŸããã£ãã", # "ç«å°ã¯æªããé£äºãçŸå³ããã", # "客宀é²å€©é¢šåã¯å€§äººã§ãè¶³ãã®ã°ããŠãšãŠãåºãã£ãã" # ] # s = "".join(txts) doc = nlp ( s ) matches = matcher ( doc ) DependencyMatcherã®ãããã³ã°çµæã¯ããããã³ã°IDãšãã«ãŒã«ãšã®å¯Ÿå¿ä»ãïŒalignmentsïŒã®ã¿ãã«ãšããŠè¿ãããŸãã alignmentsã¯ã«ãŒã«ã®åèŠçŽ ã§å®çŸ©ããã蟺ã®å³åŽã®ããŒãã«ãããããŒã¯ã³ã®indexãæ ŒçŽãããŠããŸãã ãã®ãããæ¬¡ã®ããã«ããŠçµæãåãåºããŸãã for _ , alignments in matches : print ([ doc [ alignment ]. lemma_ for alignment in alignments ]) # ['çŸãã', '倿¯'] # ['æªã', 'ç«å°'] # ['çŸå³ãã', 'é£äº'] # ['åºã', 'é²å€©é¢šå'] åãããã³ã°çµæã«ã€ããŠãæåã«ID adj ã«å¯Ÿå¿ããããŒã¯ã³ã®indexããæ¬¡ã«ID noun ã«å¯Ÿå¿ããããŒã¯ã³ã®indexãæ ŒçŽãããŠããããšãããããŸãã ãŸãã 客宀é²å€©é¢šåã¯å€§äººã§ãè¶³ãã®ã°ããŠãšãŠãåºãã£ãã ã«ã€ããŠãåºãã®ãé²å€©é¢šåã§ãããšããããšãæŸããŠããŸãã æ¬²ãèšããšåºãã®ã¯ãé²å€©é¢šåããšããããã客宀é²å€©é¢šåããšããŠã»ããå Žé¢ããããšæããŸãããè€ååè©ãæœåºã§ããããã«ãã察å¿ãDependencyMatcherã®ã«ãŒã«ãæ¹è¯ããããšã§å¯èœã«ãªããŸãããèå³ã®ããæ¹ã¯ãã²èããŠã¿ãŠãã ããã ãŸãšã æ¬èšäºã§ã¯ãGiNZAãšspaCyã®DependencyMatcherãçšããŠæ¥æ¬èªã®ã¬ãã¥ãŒããæ
å ±ãæœåºããæ¹æ³ã«ã€ããŠãç°¡åãªäŸãçšããŠèª¬æããŸããã ãŸããDependencyMatcherã®äŸ¿å©ãã瀺ããããMatcherã«ããæ
å ±æœåºãè¡ããŸããã GiNZAãspaCyããå®åã§èªç¶èšèªåŠçãè¡ãéã«ã¯éåžžã«äŸ¿å©ãªã©ã€ãã©ãªã§ãã ä»å玹ä»ããæ©èœã«éãããGiNZA/spaCyã䜿ãããªããŠäžã®äžã®ããã¹ãããŒã¿ãæå¹ã«æŽ»çšããŠãããŸãããïŒ