ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Tensorflow Text Classification – Python Deep Learning
    MACHINE LEARNING 2017. 10. 20. 12:08
    반응형

    이 문서는 영문으로된 내용을 구글 번역기를 활용하여 번역한 내용입니다. 
    개인적인 공부 및 추후 다시 볼 수 있도록 하기 위해 개인 블로그에 번역 내용을 옮겨 놓았습니다.
    원문과 내용이 다를시 책임지지 않으며, 저작권 문제가 발생시 언제든 삭제 될 수 있습니다. 

    원문보기 : https://sourcedexter.com/tensorflow-text-classification/


    Tensorflow 텍스트 분류란 무엇입니까?

    텍스트 분류는 주어진 텍스트에 올바른 라벨을 할당하는 작업입니다. 이 텍스트는 구문, 문장 또는 단락 일 수 있습니다. 우리의 목표는 어떤 텍스트를 입력으로 받아 들여 그것에 첨부하거나 레이블을 할당하는 것입니다. Tensorflow 심층 학습 라이브러리를 사용할 예정이므로 Tensorflow 텍스트 분류 시스템이라고 할 수 있습니다. 간단한것 같지 않습니까? 음,글쎄요.
    이 작업에는 텍스트가 무엇을 나타내는지를 나타내는 많은 데이터가있는 신경망을 학습하는 과정이 포함됩니다. 나는 당신이 "감정 분석"이란 말을 들었을 것입니다. 정서 분석은 텍스트 분류 작업이지만 사람이 뭔가를 말하고 있다는 감정을 식별하기 위해서만 제한됩니다. 예를 들어, "음식은 훌륭했습니다"라는 문장은 긍정적인 감정을 가지고 있습니다. 반면에 "영화는 끔찍했다"는 부정적인 감정이 있고 "태양이 동쪽에서 떠오른다"는 문장은 중립적인 감정을 가지고 있습니다.
    감정적인 분석을 위한 라벨은 긍정, 부정 및 중립이 대부분입니다. 그러나 이것은 텍스트 분류의 한 가지 용도에 불과합니다. 대화 상자 또는 문서 구문 분석 알고리즘과 같은 다른 텍스트 기반 응용 프로그램을 작성하는 경우 특정 문장의 내용을 알고 싶을 수 있습니다. 예 : "Hello! 어떻게 지내세요? "라는 레이블에 "인사말" 이라는 레이블을 붙이거나 "즐거운 회의였습니다"라는 레이블에 "Farewell" 이라는 레이블을 붙일 수 있습니다.

    당신은 무엇을 배우려고 합니까?

    주어진 문장을 분류하기 위해 훈련된 많은 분류 중 하나로 분류하는 텍스트 분류기(classifier)를 만들 수 있습니다. 이 튜토리얼에서는, 우리는 단지 그것을 수행한다. 클래스나 라벨이 많은 텍스트 기반 분류기를 만드는 방법을 살펴 보겠습니다.
    Tensorflow 텍스트 분류(Tensorflow Text Classification; 본문)는 여러 섹션으로 나뉩니다. 첫 번째는 텍스트 사전 처리 단계와 bag of words의 작성 및 사용법입니다. 두 번째는 텍스트 분류기의 훈련이고, 마지막으로 분류기의 테스트와 사용이다.
    Tensorflow가 무엇인지 모르는 경우 Tensorflow가 무엇인지 를 먼저 읽으세요.

    시작하기 전에 알아보는 일부 NLP 용어

    NLP(Natural Language Processing)는 텍스트 분류 작업에서 많이 사용되고 있습니다. 그래서 우리가 시작하기 전에, 우리가 사용할 몇 가지 용어와 개념에 대해 설명 하고자 합니다. 이것은 특정 기능이나 프로세스가 호출되는 이유를 이해하는데 도움이 될 것입니다.
    1. Stemming - Stemming은 루트를 파생시키기 위해 한 단어에 적용되는 프로세스입니다. 문장에서 사용되는 많은 단어는 종종 굴절되거나 파생됩니다. 우리의 프로세스를 표준화하기 위해 우리는 그러한 말을 줄이고 근본적인 단어로 끝내기를 원합니다. 예를 들어, stemmer는 다음 단어 "walking", "walked", "walker"를 루트 단어 "walk"로 변환합니다.
    2. Tokenization - Token은 기본적으로 단어입니다. 이것은 텍스트 조각을 가져 와서 텍스트의 모든 고유 단어를 찾는 과정입니다. 텍스트의 단어 목록을 Token의 출력으로 가져옵니다. 예를 들어, "Python NLP는 훌륭하게 진행됩니다." 문장에 대해 우리는 Token list [ "Python", "NLP", "I just", "going", "great"]를 가지고 있습니다. 보시다시피, Token화는 텍스트를 단어로 분리하는 것과 관련이 있습니다.
    3. Bag of Words - Bag of Words는 독특한 단어 목록을 만드는 과정입니다. 이 모델은 feature 생성을 위한 도구로 사용됩니다. 예: 두 문장을 고려하십시오.
      1. Star Wars is better than Star Trek.
      2. Star Trek isn’t as good as Star Wars.
      위의 두 문장에서 단어의 모음은 다음과 같습니다. ["Star", "Wars", "Trek", "better", "good", "isn’t", "is", "as"]. 목록에있는 각 단어의 위치는 고정되어 있습니다. 이제, 문장으로부터 분류를 위한 특징을 만들기 위해, 우리는 이진 배열 (각 원소가 1 또는 0 일 수있는 배열)을 사용합니다.
      예를 들어, 새로운 문장인 "Wars is good"은 [0,1,0,0,1,0,1,0]로 표시됩니다. 배열에서 볼 수 있듯이, 위치 2의 단어는 예제 문장에있는 단어의 봉지에서 "Wars"이기 때문에 위치 2는 1로 설정됩니다. 이것은 다른 단어 인 "is"와 "good"에 대해서도 마찬가지입니다. Bag of Words 모델에 대한 자세한 내용은 여기를 참조하십시오.
    참고 : 아래의 코드는 절차를 설명하기 위해 제공되며 완료되지 않았습니다. Github Repository에서 전체 작업 코드를 찾을 수 있습니다 (링크는 기사 끝에 있습니다).

    1 단계 : 데이터 준비

    특정 텍스트를 특정 카테고리로 분류 할 수 있는 모델을 훈련하기 전에 먼저 데이터를 준비해야 합니다. 교육에 필요한 데이터를 보유할 간단한 JSON 파일을 만들 수 있습니다.
    다음은 내가 만든 5 개의 카테고리가 들어있는 샘플 파일 입니다. 원하는 카테고리를 몇 개 만들 수 있습니다.

     
    {
    "time" : ["what time is it?", "how long has it been since we started?", "that's a long time ago", " I spoke to you last week", " I saw you yesterday"],
    "sorry" : ["I'm extremely sorry", "did he apologize to you?", "I shouldn't have been rude"],
    "greeting": ["Hello there!", "Hey man! How are you?", "hi"],
    "farewell": ["It was a pleasure meeting you", "Good Bye.", "see you soon", "I gotta go now."],
    "age": ["what's your age?", "How old are you?", "I'm a couple of years older than her", "You look aged!"]
    }
    위의 구조에서 우리는 5가지 범주(time, sorry, greeting, farewell, and age)가 있는 간단한 JSON을 가집니다. 각 카테고리에 대해 모델을 훈련하는데 사용할 수 있는 문장 집합이 있습니다.
    이 데이터가 주어지면 주어진 문장을 이 5가지 범주 중 하나로 분류해야 합니다.

    2 단계 : 데이터로드 및 전처리

    이 단계에서 우리가 만든 JSON 데이터를 로드 합니다. 그 데이터가 "data.json"이라는 파일에 저장되어 있다고 가정합시다.
    데이터를 로드하고 나면 데이터를 정리하고 단어 모음을 만들기 위해 데이터에 대한 연산을 수행 해야 합니다.

    x
     
    # a table structure to hold the different punctuation used
    tbl = dict.fromkeys(i for i in range(sys.maxunicode)
    if unicodedata.category(chr(i)).startswith('P'))
    # method to remove punctuations from sentences.
    def remove_punctuation(text):
    return text.translate(tbl)
    #initialize the stemmer
    stemmer = LancasterStemmer()
    #variable to hold the Json data read from the file
    data = None
    # read the json file and load the training data
    with open('data.json') as json_data:
    data = json.load(json_data)
    print (data)
    # get a list of all categories to train for
    categories = list(data.keys())
    words = []
    # a list of tuples with words in the sentence and category name
    docs = []
    for each_category in data.keys():
    for each_sentence in data[each_category]:
    # remove any punctuation from the sentence
    each_sentence = remove_punctuation(each_sentence)
    print (each_sentence)
    # extract words from each sentence and append to the word list
    w = nltk.word_tokenize(each_sentence)
    print ("tokenized words: ", w)
    words.extend(w)
    docs.append((w, each_category))
    # stem and lower each word and remove duplicates
    words = [stemmer.stem(w.lower()) for w in words]
    words = sorted(list(set(words)))
    print (words)
    print (docs)
    위의 코드에서 우리는 여러 목록을 만듭니다. 하나의 "단어" 목록은 훈련을 위해 제공된 모든 문장에서 모든 독특한 stemmed 단어를 포함 합니다. 또 다른 목록 "범주(categories)"는 모든 다른 범주를 포함 합니다.
    이 단계의 출력은 각 문장의 단어와 문장이 속하는 범주를 포함하는 "문서(docs)"목록 입니다. 예제 문서는 ([ "whats", "your", "age"], "age") 입니다.

    3 단계 : Tensorflow 사양으로 데이터 변환

    이전 단계에서 문서가 있지만 여전히 텍스트 형식입니다. Tensorflow는 숫자 형식의 데이터를 허용합니다. 그래서 우리는 Tensorflow 텍스트 분류를 시작하기 전에 텍스트 형식을 취하여 단어 Bag of Words을 적용하여 문장을 숫자 이진 배열로 변환합니다. 그런 다음 같은 방식으로 레이블/범주(labels/category)를 숫자 이진 배열로 저장합니다.

     
    # create our training data
    training = []
    output = []
    # create an empty array for our output
    output_empty = [0] * len(categories)
    for doc in docs:
    # initialize our bag of words(bow) for each document in the list
    bow = []
    # list of tokenized words for the pattern
    token_words = doc[0]
    # stem each word
    token_words = [stemmer.stem(word.lower()) for word in token_words]
    # create our bag of words array
    for w in words:
    bow.append(1) if w in token_words else bow.append(0)
    output_row = list(output_empty)
    output_row[categories.index(doc[1])] = 1
    # our training set will contain a the bag of words model and the output row that tells which catefory that bow belongs to.
    training.append([bow, output_row])
    # shuffle our features and turn into np.array as tensorflow takes in numpy array
    random.shuffle(training)
    training = np.array(training)
    # trainX contains the Bag of words and train_y contains the label/ category
    train_x = list(training[:,0])
    train_y = list(training[:,1])

    4 단계 : Tensorflow 텍스트 분류 시작

    적절한 형식의 문서를 사용하여 Tensorflow 텍스트 분류를 시작할 수 있습니다. 이 단계에서 우리는 간단한 딥 뉴럴 네트워크(Deep Neural Network)를 구축하고 이를 모델 교육에 사용합니다.

     
    # reset underlying graph data
    tf.reset_default_graph()
    # Build neural network
    net = tflearn.input_data(shape=[None, len(train_x[0])])
    net = tflearn.fully_connected(net, 8)
    net = tflearn.fully_connected(net, 8)
    net = tflearn.fully_connected(net, len(train_y[0]), activation='softmax')
    net = tflearn.regression(net)
    # Define model and setup tensorboard
    model = tflearn.DNN(net, tensorboard_dir='tflearn_logs')
    # Start training (apply gradient descent algorithm)
    model.fit(train_x, train_y, n_epoch=1000, batch_size=8, show_metric=True)
    model.save('model.tflearn')
    위의 코드는 1000 개의 epoch 동안 실행됩니다. 나는 30,000 step을 가진 10,000 epoch를 위해 그것을 달리고 훈련을 끝내기 위하여 약 2분이 걸렸다.
    나는 엔비디아 지포스 940MX GPU를 가지고 있습니다. 데이터의 크기와 GPU의 유형에 따라 교육에 소요되는 시간이 크게 좌우됩니다.아래 스크린 샷을 첨부했습니다. 나는 거의 100% 훈련 정확도를 달성했습니다.

    5 단계 : Tensorflow 텍스트 분류 모델 테스트

    아래 코드를 사용하여 신경망 텍스트 분류 파이썬 모델을 테스트 할 수 있습니다.

     
    # let's test the mdodel for a few sentences:
    # the first two sentences are used for training, and the last two sentences are not present in the training data.
    sent_1 = "what time is it?"
    sent_2 = "I gotta go now"
    sent_3 = "do you know the time now?"
    sent_4 = "you must be a couple of years older then her!"
    # a method that takes in a sentence and list of all words
    # and returns the data in a form the can be fed to tensorflow
    def get_tf_record(sentence):
    global words
    # tokenize the pattern
    sentence_words = nltk.word_tokenize(sentence)
    # stem each word
    sentence_words = [stemmer.stem(word.lower()) for word in sentence_words]
    # bag of words
    bow = [0]*len(words)
    for s in sentence_words:
    for i,w in enumerate(words):
    if w == s:
    bow[i] = 1
    return(np.array(bow))
    # we can start to predict the results for each of the 4 sentences
    print( categories[np.argmax(model.predict([get_tf_record(sent_1)]))])
    print( categories[np.argmax(model.predict([get_tf_record(sent_2)]))])
    print( categories[np.argmax(model.predict([get_tf_record(sent_3)]))])
    print( categories[np.argmax(model.predict([get_tf_record(sent_4)]))])
    """
    the output that I got for this code is:
    time
    farewell
    time
    age
    """
    이 훈련만으로 모델은 모든 문장을 정확하게 분류 할 수 있었습니다. 분명히 정확하게 분류되지 않을 문장이 많이 있을 것입니다.이는 데이터 양이 적기 때문입니다. 데이터가 점점 더 많아지면서 모델이 더욱 확신을 가질 수 있습니다.

    결론 및 다음 단계

    이것은 Tensorflow 텍스트 분류를 수행하는 방법입니다. 이 접근 방식을 사용하여 다양한 분류를 수행 할 수 있습니다. 채팅 봇을 만들 때도 사용할 수 있습니다. 여기서 개념을 배우는 데 관심이 있다면 다음은 깊은 학습과 파이썬을 위한 가장 좋은 코스로 연결되는 링크입니다. 나는 이 모든 과정을 통해 많은 것을 배웠으며 기계 학습, 심화 학습 또는 고급 파이썬 학습에 관심이 있는 모든 사람에게 이 점을 적극 권장합니다.
    1. Complete Python Bootcamp: Go from zero to hero in Python - Python 프로그래밍을 습득하고자하는 사람들에게.
    2. Machine Learning A-Z: Hands-On Python & R In Data Science - 기계 학습을 배우고 습득하고자하는 사람들을 위해.
    3. Deep Learning A-Z: Hands-On Artificial Neural Networks - 이미 ML의 기초를 알고 깊은 학습을 배우고 싶다면이 과정이 가장 좋습니다.
    그래서, 이것이 당신이 새로운것을 배우는 데 도움이 되기를 바랍니다. 이 점에 대해 어떻게 생각 하는지, 아니면 이것을 수행 할 수 있는 더 좋은 방법이 있는지 아니면 생각을 공유 할 것인지에 대한 의견을 말하십시오.
    Tenorflow를 위한 Git Repository에서 전체 작업 코드를 찾을 수 있습니다.



    반응형
Designed by Tistory.