슈퍼 간단한 검색 엔진을 만들어 본 조!

소개



이하의 기사를 바라보고 있으면, 자연언어 처리를 사용해, 대량 데이터중에서, 자신이 요구하고 있는 데이터를 추출할 수 있는 것이 멋지다-라고 느끼고 있었습니다.
  • htps : // 이 m / 나오타카 1128 / ms / 87d717961bd0c34에 7 아 64

  • 그래서 매우 간단한 검색 엔진을 만들었습니다.

    만든 검색 엔진의 작동 방식



    ① 축적한 문장군으로부터 언어 모델(이번은 tfidf), 벡터를 작성.
    ② 입력 문장을 언어 모델로부터 벡터화
    ③ 입력 문장 벡터와 축적된 문장군의 하나 하나와 cos 유사도를 계산
    ④ cos 유사도가 높은 순서로 정렬하여 출력

    소스 코드는 이런 느낌



    트위터에서 얻은 데이터를 사용하여 언어 모델, 벡터 작성.
    ※데이터 취득에 대해서는, 이 기사의 본질이 아니기 때문에, 이번은 할애합니다.
    #データサイエンティスト、自然言語処理、機械学習を含むtwitterデータを使います。
    #search_tweet_listが、取得したデータを保持しているリスト変数です。
    
    #tfidfのために、twitterデータを分かち書きする関数
    def wakati_word_list_create(sentences, get_word_class):
        #複数文から、指定の品詞(GET_WORD_CLASS)を抽出した単語リスト
        sentences_word_list = []
    
        for sentence in sentences:
            #一文から、指定の品詞(GET_WORD_CLASS)を抽出した単語リスト
            one_sentence_word_str = ''
            #形態素解析
            node = mecab.parseToNode(sentence)
    
            while node:
    
                #語幹
                word = node.feature.split(",")[-3]
                #品詞
                word_class = node.feature.split(",")[0]  
                #(指定の品詞(GET_WORD_CLASS)である) and (語幹が*のもの(つまり未知語))場合は、単語リストに追加
                if word_class in get_word_class and word != '*': 
                    one_sentence_word_str = one_sentence_word_str + " " + word
    
                node = node.next
            sentences_word_list.append(one_sentence_word_str)
        return sentences_word_list
    
    #twitterデータから、指定品詞の分かち分割形式の単語リストを生成
    GET_WORD_CLASS = ['名詞', '形容詞']
    wakati_word_list = wakati_word_list_create(search_tweet_list, GET_WORD_CLASS)
    
    #tfidfベクトル化
    from sklearn.feature_extraction.text import TfidfVectorizer
    
    tfidf = TfidfVectorizer(use_idf=True, token_pattern=u'(?u)\\b\\w+\\b')
    #言語モデル作成
    tfidf_model = tfidf.fit(wakati_word_list)
    #ベクトル空間作成
    vectors = tfidf_model.transform(wakati_word_list).toarray()
    

    tfidf와 cos 유사도로 유사도를 계산하고 내림차순으로 정렬하여 출력합니다.
    
    import numpy as np
    
    #cos類似度を計算する関数
    def cos_sim(v1, v2):
        return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
    
    #検索時に何件を表示させるか
    OUTPUT_NUMBER = 5
    
    #検索したい文章、キーワード(入力データ)
    search_sentence = ["ここに、なに調べたいかを書いてね"]
    
    #wakati_word_list_createは、上のソースコードに書いている関数です。
    wakati_input_texts = wakati_word_list_create(search_sentence, GET_WORD_CLASS)
    
    #作った言語モデルはここで使うよ
    tfidf_vectors = tfidf_model.transform(wakati_input_texts).toarray()
    
    similars_map = {}
    
    for sentence_id, sentence_vector in enumerate(vectors):
        similars_map[sentence_id] = cos_sim(tfidf_vectors[0], sentence_vector)
    sorted_similars_map = sorted(similars_map.items(), key=lambda x: -x[1])
    
    #任意件数(OUTPUT_NUMBER)を表示
    print("入力文章:{}".format(search_sentence[0]))
    for break_flag, similar_map in enumerate(sorted_similars_map):
        if break_flag == OUTPUT_NUMBER:
            break
        sentence_id = similar_map[0]
        sentence_similar = similar_map[1]
        if np.isnan(sentence_similar):
            if break_flag == 0:
                print("類似データは1件もなかったよ")
            break
    
        print("==========================================")
        print("類似度 : {}".format(sentence_similar))
        print("{}".format(search_tweet_list[sentence_id]))
        print("")
    

    실행 결과



    결과①


    결과②


    네 느낌이나데(*´艸`)
    특히 결과②는 제대로 이벤트 정보를 잡고 있어! 멋지다! !

    더 잘하기 위해 생각해 보았습니다.



    이것을 만들어보고 느낀 것은 벡터화 기술이 상당히 중요합니다.
    입니다.
    이번에는 tfidf로 벡터화를 했지만 BM25, SCDV, word2vec 등에서 전혀 다를 것입니다. 게다가 감정 평가와 네거티브 포지티브 (극성)를 캡처하여 벡터화해 보면 네거티브 포지션의 관점을 포함하는 조금 이상한 검색 엔진을 만들 수 있습니다!
    무엇보다도, 이런 것은, Bert라든지 사용해 보고 싶네요! ! ! 어떤 정밀도의 검색이 되는지, 몹시 신경이 쓰입니다! ! ! ! 사양 부족하기 때문에 내 집에서는 만들 수 없지만. . . (눈물)

    마지막으로



    끝까지 읽어 주셔서 감사합니다.
    이번 소스 코드를 쓰고 있어 좀 더 다양한 NLP 수법에 대해 공부하고 싶었습니다.
    다음은, LDA라든지 해보고, 뭔가 만들어 보자~! ! ('◇')ゞ

    좋은 웹페이지 즐겨찾기