Archive/통계&코딩이것저것

n-gram을 이용해서 철자를 교정해보자

입짧은달님 2021. 9. 2. 15:17

NER을 이용해서 회사명을 추출한 데이터를 사용해서, 정답명과 살짝 틀린 단어(예:Epple)이 들어갔을 때 Apple로 나오게끔 철자를 교정해주는 간단한 코드이다. 

 

df_answer_name['회사명'] : 정상적인 회사명 컬럼이 들어간다. 

 

이 알고리즘의 장점은 간단하다는 것인데, 단점은 df_answer_name['회사명']에 없는 회사는 뱉어내지 못한다는 것. 

import collections

ngram_size=3 
words=set([w.lower() for w in list(df_answer_name['회사명'])]) #소문자 변환

def ngrams(word):#ngram set을 생성한다.
    all_ngrams=set()
    for i in range(0,len(word)-ngram_size+1):
        all_ngrams.add(word[i:i+ngram_size])
    return all_ngrams


ngram_words=collections.defaultdict(set)
for word in words: #ngram (ex. app) 별로 매칭되는 word(ex. apple, appo,..) 들을 저장한다. 
    for ngram in ngrams(word):
        ngram_words[ngram].add(word)


def suggested_words(target_word,results=3):#targetword를 넣으면 해당 워드를 ngram으로 분해한 뒤, 
각각의 ngram마다 해당되는 word에 표를 준다. 가장 많은 표를 받은 word가 정확한 회사명..!!
    word_ranking=collections.defaultdict(int)
    possible_words=set()
    for ngram in ngrams(target_word):
        words=ngram_words[ngram]
        for word in words:
            word_ranking[word]+=1

    ranked_word_pairs=sorted(word_ranking.keys(),reverse=True)
    return [word_pair for word_pair in ranked_word_pairs[0:results]]