Last active
March 23, 2025 22:05
-
-
Save ShikiOkasaka/67419f85303e66ef46144f8781c17a30 to your computer and use it in GitHub Desktop.
GiNZAをつかって、複文の入れ子をカッコでしめす
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import spacy | |
nlp = spacy.load('ja_ginza_electra') | |
def is_term(token): | |
if token.dep_ in ('acl', 'advcl', 'csubj', 'dep', 'nsubj', 'obl'): | |
return True | |
return False | |
def is_dependent_clause(token, has_term): | |
if not has_term: | |
return False | |
if token.dep_ in ('acl', 'ccomp', 'csubj', 'dep'): | |
return True | |
if token.dep_ == 'advcl' and token.tag_ != '副詞': | |
return True | |
def is_clause(token): | |
if token.dep_ in ('ROOT', 'acl', 'advcl', 'ccomp', 'csubj', 'dep'): | |
return True | |
return False | |
def in_order(token): | |
text = '' | |
has_term = False | |
children = list(token.children) | |
i = 0 | |
while i < len(children) and children[i].i < token.i: | |
child = children[i] | |
has_term |= is_term(child) | |
text += in_order(child) | |
i += 1 | |
text += token.text | |
while i < len(children): | |
child = children[i] | |
has_term |= is_term(child) | |
text += in_order(child) | |
i += 1 | |
if is_dependent_clause(token, has_term): | |
text = f'({text})/' | |
if is_clause(token.head): | |
if token.i < token.head.i and text[-1] != '/': | |
text += '/' | |
return text | |
def segment(sentence): | |
doc = nlp(sentence) | |
for token in doc[0].sent: | |
indent = ' ' * len(list(token.ancestors)) | |
print(f'{indent}{token.text} ({token.pos_}, {token.tag_}) → {token.head.text} ({token.dep_})') | |
print() | |
root_token = doc[0].sent.root | |
text = in_order(root_token) | |
print(text) | |
print() | |
def main(): | |
# 『日本語作文術』野内良三 2010 (p.54) より。 | |
segment("明智は、安楽イスのクッションにふかぶかと身をしずめ、辻野氏におとらぬ、にこやかな顔で答えました。") | |
segment("辻野氏のなにげないことばには、おそろしい力がこもっていました。") | |
segment("興奮のために、イスのひじ掛けにのせた左手の先が、かすかにふるえていました。") | |
segment("明智は平然として、このおどろくべきことばを語りました。") | |
# NEWS WEB EASY より。 | |
# https://shiki.esrille.com/2018/06/easy.html | |
segment('来年からは、会社が作る車の中で、決まった割合以上を電気自動車などにしなければならないという新しい規則がスタートする予定です。') | |
segment('この技術は、話したり手や足を自由に動かしたりできないタニア・フィンレイスンさんが夫と一緒に考えて作った入力のシステムを使っています。') | |
# 『文明の生態史観』梅棹忠夫 より。 | |
segment('その著書は、いくつか翻訳がでているので、わたしも、そのうちの二つをよんだ。') | |
# 「Universal Dependencies 日本語コーパス」より。 | |
# https://doi.org/10.5715/jnlp.26.3 | |
segment('中国北京大に留学し、帰国後に出産した。') | |
segment('誰があなたに出張を命じたのですか。') | |
segment('高津さんは朝早く起きるのがにがてだ。') | |
segment('鈴木さんはかばんから書類を取り出した。') | |
segment('私の家に来ると言った。') | |
segment('小さな力士が大きな力士をつりだした。') | |
segment('私にとって大きな励みとなった。') | |
segment('ずっとパンを食べている。') | |
segment('朝に学校に行く。') | |
segment('太郎には問題がやさしい。') | |
segment('象は鼻が長い。') | |
segment('鼻が長いのは象だ。') | |
segment('太郎が怒られるのはいやだ。') | |
segment('きれいだと思う。') | |
segment('かわいい犬と猫が走る。') | |
segment('食べて走るひとがいた。') | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
実行結果