eubinecto / idiomatch

An implementation of SpaCy(3.0)'s Matcher specifically designed for identifying English idioms.
40 stars 6 forks source link

Refactoring - Do not merge; just identify all the idioms #15

Closed eubinecto closed 3 years ago

eubinecto commented 3 years ago

Why?

하나의 문장에 여러 관용구가 있는 경우, greedly-normalize로 인해 여러개가 있어도 모든 것들을 포함하는 하나의 관용구만 identify를 해버리게 되는 경우가 생김. e.g. I've got too much on my hands to help. 현재, 위 문장이 입력으로 들어오면 확인되는 idiom은 get on to 뿐이다. 사실 on one's hands도 매치를 하긴 하지만 get on to가 해당 관용구를 포함하는 범위에 있기 때문에 최종 결과물에서는 없어져 버린다.

모든 관용구를 다 찾아주는 것이 이 프로젝트의 본래 목표였다는 것을 감안해보면, 머지를 하는 것보단 그냥 찾을 수 있는 모든 관용구를 다 찾아주는 것이 더 좋다.

To-do's

eubinecto commented 3 years ago

merge-idioms 관련된 코드는 버리기

eubinecto commented 3 years ago

IdiomMatcher 구조 생각해보기 & 구현하기

일단.. add_idiom 함수만 나중에 구현하면 될 것.

생각보다 많은 것을 변경했다.

결론만 말하자면 다음과 같이 변경했다:

def main():

    sentences = [
        "You are down to earth.",
        "Have you found your feet on the new job?",
    ]

    nlp = spacy.load("en_core_web_sm")  # idiom matcher needs an nlp pipeline. Currently supports en_core_web_sm only.
    idiom_matcher = IdiomMatcher.from_pretrained(nlp)  # this will take approx 40 seconds.

    for sent in sentences:
        # process the sentence
        doc = nlp(sent)
        # identify all
        matches = idiom_matcher(doc)
        for token_id, start, end in matches:
            print(nlp.vocab.strings[token_id], start, end)
        print("-----")

if __name__ == '__main__':
    main()

nlp & idiomMatcher는 분리해놓음. 어차피 문장을 proess를 해서 doc를 만들 때, 저것이 필요할 것이므로! 훨씬 깔끔해졌다.

eubinecto commented 3 years ago

이후에는 ... idiom_matcher.identify(doc) 함수를 추가하자. json 형식으로 출력을 하면 좋을 듯. (decoding 한 것, span, etc)