{"id":249,"date":"2020-08-04T16:04:08","date_gmt":"2020-08-04T07:04:08","guid":{"rendered":"http:\/\/cedartrees.co.kr\/?p=249"},"modified":"2021-04-03T19:18:19","modified_gmt":"2021-04-03T10:18:19","slug":"text-classification","status":"publish","type":"post","link":"http:\/\/blog.cedartrees.co.kr\/index.php\/2020\/08\/04\/text-classification\/","title":{"rendered":"\ub525\ub7ec\ub2dd \uac10\uc131\ubd84\uc11d(\ud14d\uc2a4\ud2b8 \ubd84\ub958)"},"content":{"rendered":"\n<p>\ubcf8 \uc608\uc81c\ub294 \uac10\uc131\ubd84\uc11d \ud639\uc740 \ud14d\uc2a4\ud2b8 \ubd84\ub958\ub77c\uace0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac10\uc131\ubd84\uc11d\uc774\ub780 \uc27d\uac8c \ub9d0\ud574\uc11c \uc5b4\ub5a4 \uae00\uc774 \ucc2c\uc131\/\ubc18\ub300, \uc88b\uc74c\/\ubcf4\ud1b5\/\uc2eb\uc74c, \uae0d\uc815\/\uc911\ub9bd\/\ubd80\uc815 \ub4f1 \uc5b4\ub5a0\ud55c polarity\ub97c \ub098\ud0c0\ub0b4\ub294\uc9c0\uc5d0 \ub300\ud55c \uc0c1\ud0dc\ub97c \ubd84\uc11d\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"has-text-color has-background has-very-dark-gray-color has-very-light-gray-background-color\"><em>\uc18c\ube44\uc790\uc758 \uac10\uc131\uacfc \uad00\ub828\ub41c \ud14d\uc2a4\ud2b8 \uc815\ubcf4\ub97c \uc790\ub3d9\uc73c\ub85c \ucd94\ucd9c\ud558\ub294 \ud14d\uc2a4\ud2b8 \ub9c8\uc774\ub2dd(Text Mining) \uae30\uc220\uc758 \ud55c \uc601\uc5ed. \ubb38\uc11c\ub97c \uc791\uc131\ud55c \uc0ac\ub78c\uc758 \uac10\uc815\uc744 \ucd94\ucd9c\ud574 \ub0b4\ub294 \uae30\uc220\ub85c \ubb38\uc11c\uc758 \uc8fc\uc81c\ubcf4\ub2e4 \uc5b4\ub5a0\ud55c \uac10\uc815\uc744 \uac00\uc9c0\uace0 \uc788\ub294\uac00\ub97c \ud310\ub2e8\ud558\uc5ec \ubd84\uc11d\ud55c\ub2e4. \uc8fc\ub85c \uc628\ub77c\uc778 \uc1fc\ud551\ubab0\uc5d0\uc11c \uc0ac\uc6a9\uc790\uc758 \uc0c1\ud488\ud3c9\uc5d0 \ub300\ud55c \ubd84\uc11d\uc774 \ub300\ud45c\uc801 \uc0ac\ub840\ub85c \ud558\ub098\uc758 \uc0c1\ud488\uc5d0 \ub300\ud574 \uc0ac\uc6a9\uc790\uc758 \uc88b\uace0 \ub098\uc068\uc5d0 \ub300\ud55c \uac10\uc815\uc744 \ud45c\ud604\ud55c \uacb0\uacfc\uc774\ub2e4.<br>[\ub124\uc774\ubc84 \uc9c0\uc2dd\ubc31\uacfc] \uac10\uc131\ubd84\uc11d<\/em> [Sentimental Analysis , \u611f\u6027 \u5206\u6790]<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import torch\nimport torch.nn as nn\nimport torch.optim as optim\n\nimport random\nimport numpy as np<\/pre>\n\n\n\n<p>\uac10\uc131\ubd84\uc11d\uc5d0 \uc0ac\uc6a9\ud55c \ub370\uc774\ud130\ub294 \ub124\uc774\ubc84\uc5d0\uc11c \uacf5\uac1c\ud55c \uc601\ud654 \ud3c9\uc810 \uc815\ubcf4\uc785\ub2c8\ub2e4. \ud574\ub2f9 \ub370\uc774\ud130\ub294 \uc544\ub798 \ub9c1\ud06c\uc5d0\uc11c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br><a href=\"https:\/\/github.com\/e9t\/nsmc\">https:\/\/github.com\/e9t\/nsmc<\/a><\/p>\n\n\n\n<p>\ubcf8 \uc608\uc81c\ub294 \ud3c9\uc810 \ub370\uc774\ud130\uc758 \uc804\uccb4\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 RNN\uc5d0\uc11c many-to-one \ud615\ud0dc\uc758 \uac10\uc131\ubd84\uc11d \ubaa8\ub378\uc758 \uac1c\ub150\uc744 \uc704\ud574 \uc77c\ubd80 \ub370\uc774\ud130\ub9cc \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \ub610 \uadf8\uc911\uc5d0\uc11c \ubb38\uc7a5\uc758 \uae38\uc774\uac00 30 \ubbf8\ub9cc\uc778 \ub370\uc774\ud130\ub9cc \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sentence = []\nfile = open(\".\/data\/ratings_test.txt\", \"r\")\nfor i in range(1000):\n    line = file.readline()\n    arr = line.split('\\t')\n    if len(arr[1]) &lt; 30:\n        sentence.append(arr[1]+'|'+arr[2].replace('\\n',''))\n\nfile.close()\n\nsentences = sentence[1:]\nlen(sentences) #560<\/pre>\n\n\n\n<p>\ub2e8\uc5b4\uc14b \uc0dd\uc131\uc744 \uc704\ud574\uc11c Vocab \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. &lt;unk&gt;\ub294 \ub370\uc774\ud130\uc758 Sequence Length\ub97c \ub9de\ucdb0\uc8fc\uae30 \uc704\ud574\uc11c \ube48 \ub370\uc774\ud130\ub97c \ucc44\uc6b0\uae30 \uc704\ud574 \uc0dd\uc131\ud55c \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ub370\uc774\ud130\uc758 \ud615\uc2dd\uc740 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.  \ubd84\uc11d\uc5d0 \ud544\uc694\ud55c \ub370\uc774\ud130\ub294 \ud14d\uc2a4\ud2b8 \ubd80\ubd84\uacfc \ub4a4 \uc774\uc5b4 \ub098\uc624\ub294 0,1\uc758 \ub370\uc774\ud130\uc785\ub2c8\ub2e4. 0\uc740 \ubd80\uc815\uc801\uc778 \ud3c9\uac00\uc774\uba70 1\uc740 \uae0d\uc815\uc801\uc778 \ud3c9\uac00\uc785\ub2c8\ub2e4. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">2541728\t\uc544\ucc14\ud55c \uc0ac\ub791 \uc904\ub2e4\ub9ac\uae30???\t0\n9648521\t\uc7ac\ubbf8\uc788\uc5c8\ub2e4! \ub610\ubd10\uc57c\uc9d5\u314e\t1\n9911421\t\uc911\uac04\uc5d0 \ud654\uba74\uc774 \uc880 \ub04a\uae30\ub294\uac83 \ube7c\uace4 \ub118 \uc88b\uc558\uc5b4\uc694~\t1\n3608055\t\uc774 \uc601\ud654\ub97c \ub9d0\ud558\ub294\ub370 \uae34 \ub2e8\uc5b4\ub294 \ud544\uc694\uc5c6\ub2e4. \uc7ac\uc218\uc5c6\ub294 \uc878\uc791 \uc774\uac70\uba74 \ucda9\ubd84\ud558\ub2e4.\t0<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Vocab:\n    def __init__(self):\n        self.vocab2index = {'&lt;unk>':0}\n        self.index2vocab = {0:'&lt;unk>'}\n        self.vocab_count = {}\n        self.n_vocab = len(self.vocab2index)\n\n    def add_vocab(self, sentence):\n        for word in sentence:\n            if word not in self.vocab2index:\n                self.vocab2index[word] = self.n_vocab\n                self.vocab_count[word] = 1\n                self.index2vocab[self.n_vocab] = word\n                self.n_vocab += 1\n            else:\n                self.vocab_count[word] += 1<\/pre>\n\n\n\n<p>\ub2e8\uc5b4\ub294 \ud615\ud0dc\uc18c \ubd84\uc11d\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ud615\ud0dc\uc18c \ubd84\uc11d\uae30\ub85c konlpy\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">vo = Vocab()\n\nfrom konlpy.tag import Okt\nokt = Okt()\n\nfor sentence in sentences:\n    vo.add_vocab(okt.morphs(sentence.split('|')[0]))<\/pre>\n\n\n\n<h2>Model<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">input_size = vo.n_vocab\nhidden_size = 2\n\nclass SentimentModel(nn.Module):\n    \n    # (batch_size, n, ) torch already know, you don't need to let torch know\n    def __init__(self,input_size, hidden_size):\n        super().__init__()\n        self.input_size = input_size\n        self.hidden_size = hidden_size\n        \n        self.embedding = nn.Embedding(self.input_size, 250)\n        \n        self.rnn = nn.LSTM(\n            input_size = 250, \n            hidden_size = 100, \n            num_layers = 4, \n            batch_first = True,\n            bidirectional = False\n        )\n        \n        self.layers = nn.Sequential(\n            nn.ReLU(),\n            nn.Linear(100,50),\n            nn.Linear(50,25),\n            nn.Linear(25,self.hidden_size),\n            #nn.Sigmoid()\n        )\n        \n        self.softmax = nn.LogSoftmax(dim=0)\n         \n        \n    def forward(self, x):\n        x = self.embedding(x) \n        y,_ = self.rnn(x)\n        y = self.layers(y)\n        return self.softmax(y[:,-1,:])\n    \nmodel = SentimentModel(input_size, hidden_size)<\/pre>\n\n\n\n<p>\uc0dd\uc131\ud55c \ubaa8\ub378 \uc815\ubcf4\ub97c \ucd9c\ub825\ud574\ubcf4\uba74 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<br>\uac04\ub7b5\ud788 \uc0b4\ud3b4\ubcf4\uba74 \uc785\ub825 \ub370\uc774\ud130 1751\uc744 250 \ucc28\uc6d0\uc73c\ub85c Embedding \ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 Embedding\uc758 \ub9c8\uc9c0\ub9c9 \uac12\uc744 LSTM\uc758 \uc785\ub825\uac12\uc73c\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. LSTM\uc740 250\uc744 \uc785\ub825 \ubc1b\uc544\uc11c 100\uac1c\uc758 \uc815\ubcf4\ub97c \ucd9c\ub825\ud558\ub294 4\uac1c\uce35\uc758 \ub808\uc774\uc5b4 \uad6c\uc870\ub85c \ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc785\ub825 \ubc1b\uc740 \ub370\uc774\ud130\ub294 Linear \ubaa8\ub378\uc744 \ud1b5\uacfc\ud558\uba70 \ucc28\uc6d0 \uc815\ubcf4\ub97c \ub0ae\ucdb0\uc8fc\uace0 \ub9c8\uc9c0\ub9c9\uc5d0\ub294 \uc774 \ubb38\uc7a5\uc758 \uac12\uc774 &#8220;\uae0d\uc815&#8221; \ud639\uc740 &#8220;\ubd80\uc815&#8221;\uc744 \ub098\ud0c0\ub0b4\ub294 2\uac1c\uc758 \uac12\uc744 \ucd5c\uc885\uc801\uc73c\ub85c \ucd9c\ub825\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ucd5c\uc885  output \ub370\uc774\ud130\ub294 \ubaa8\ub450 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \uac01 \ubc30\uce58 \uc0ac\uc774\uc988\uc758 \ub9c8\uc9c0\ub9c9 Sequence(or Time-Step) \ub370\uc774\ud130\ub9cc \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ud574\ub2f9 \uc815\ubcf4\ub294 (batch_size * hidden_vector)\ub85c \ud45c\uc2dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ub9cc\ub4e4\uc5b4\uc9c4 \uc815\ubcf4\ub97c LogSoftmax\ub97c \ud1b5\uacfc \uc2dc\ud0a4\uace0 \uc608\uce21\uac12\uc744 \uad6c\ud574\ub0c5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub807\uac8c \uad6c\ud574\uc9c4 \uc608\uce21\uac12\uacfc \uc815\ub2f5\uc758 \ucc28\uc774 \uc989, Loss\ub97c \uacc4\uc0b0\ud558\uace0 \uc774 \uac12\uc744 \uc904\uc774\ub294 \uacfc\uc815\uc744 \uc218\ud589\ud558\ub294 \ud559\uc2b5\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SentimentModel(\n  (embedding): Embedding(1751, 250)\n  (rnn): LSTM(250, 100, num_layers=4, batch_first=True)\n  (layers): Sequential(\n    (0): ReLU()\n    (1): Linear(in_features=100, out_features=50, bias=True)\n    (2): Linear(in_features=50, out_features=25, bias=True)\n    (3): Linear(in_features=25, out_features=2, bias=True)\n  )\n  (softmax): LogSoftmax()\n)<\/pre>\n\n\n\n<p>\uc785\ub825 \ubb38\uc7a5\uc758 \ucd5c\ub300 \uae38\uc774\ub294 30\uc73c\ub85c \uc815\ud558\uace0 \uae38\uc774\uac00 30\uc774 \uc548\ub418\ub294 \ubb38\uc7a5\uc5d0\ub294 &lt;unk> \uac12\uc744 \ucc44\uc6cc\uc90d\ub2c8\ub2e4. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def tensorize(vocab, sentence):\n    idx = [vocab.vocab2index[word] for word in okt.morphs(sentence)]\n    #return torch.Tensor(idx).long().item()\n    return idx\n\nten = []\ny_data = []\nfor sentence in sentences:\n    tmp = tensorize(vo,sentence.split('|')[0])\n    tmp_zero = np.zeros(30)\n    \n    for i,val in enumerate(tmp):\n        tmp_zero[i] = val\n    \n    ten.append(tmp_zero)\n    y_data.append(float(sentence.split('|')[1]))\n    \nx_data = torch.Tensor(ten).long()\ny_data = torch.Tensor(y_data).long()<\/pre>\n\n\n\n<h2>Training<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># loss &amp; optimizer setting\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(),lr=0.01)\n\nhist = []\n\n# start training\nfor epoch in range(201):\n    model.train()\n    outputs = model(x_data)\n    \n    loss = criterion(outputs, y_data)\n    \n    optimizer.zero_grad()\n    loss.backward()\n    optimizer.step()\n    \n    hist.append(loss.item())\n    \n    if epoch%20 == 0:\n        print(epoch, loss.item())\n        #result = outputs.data.numpy().argmax(axis=2)\n        #result_str = ''.join([char_set[c] for c in np.squeeze(result)])\n        #print(i, \"loss: \", loss.item(), \"\\nprediction: \", result, \"\\ntrue Y: \", y_data, \"\\nprediction str: \", result_str,\"\\n\")\n    \n    <\/pre>\n\n\n\n<h2>Evaluate<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">with torch.no_grad():\n\n    prediction = model(x_data)\n    correct_prediction = torch.argmax(prediction, 1) == y_data\n    \n    accuracy = correct_prediction.float().mean()\n    print('Accuracy:', accuracy.item()) # \uc815\ud655\ub3c4 \ud45c\uc2dc<\/pre>\n\n\n\n<p>\ud559\uc2b5\uc758 Loss \uac12\uc744 \ud45c\uc2dc\ud574\ubcf4\uba74 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import matplotlib.pyplot as plt\n\nplt.plot(hist)\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"397\" height=\"277\" src=\"http:\/\/cedartrees.co.kr\/wp-content\/uploads\/2020\/08\/\u1109\u1173\u110f\u1173\u1105\u1175\u11ab\u1109\u1163\u11ba-2020-08-04-\u110b\u1169\u1112\u116e-4.54.39.png\" alt=\"\" class=\"wp-image-260\" srcset=\"http:\/\/blog.cedartrees.co.kr\/wp-content\/uploads\/2020\/08\/\u1109\u1173\u110f\u1173\u1105\u1175\u11ab\u1109\u1163\u11ba-2020-08-04-\u110b\u1169\u1112\u116e-4.54.39.png 397w, http:\/\/blog.cedartrees.co.kr\/wp-content\/uploads\/2020\/08\/\u1109\u1173\u110f\u1173\u1105\u1175\u11ab\u1109\u1163\u11ba-2020-08-04-\u110b\u1169\u1112\u116e-4.54.39-300x209.png 300w\" sizes=\"(max-width: 397px) 100vw, 397px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\ubcf8 \uc608\uc81c\ub294 \uac10\uc131\ubd84\uc11d \ud639\uc740 \ud14d\uc2a4\ud2b8 \ubd84\ub958\ub77c\uace0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac10\uc131\ubd84\uc11d\uc774\ub780 \uc27d\uac8c \ub9d0\ud574\uc11c \uc5b4\ub5a4 \uae00\uc774 \ucc2c\uc131\/\ubc18\ub300, \uc88b\uc74c\/\ubcf4\ud1b5\/\uc2eb\uc74c, \uae0d\uc815\/\uc911\ub9bd\/\ubd80\uc815 \ub4f1 \uc5b4\ub5a0\ud55c polarity\ub97c \ub098\ud0c0\ub0b4\ub294\uc9c0\uc5d0 \ub300\ud55c \uc0c1\ud0dc\ub97c \ubd84\uc11d\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc18c\ube44\uc790\uc758 \uac10\uc131\uacfc \uad00\ub828\ub41c \ud14d\uc2a4\ud2b8 \uc815\ubcf4\ub97c \uc790\ub3d9\uc73c\ub85c \ucd94\ucd9c\ud558\ub294 \ud14d\uc2a4\ud2b8 \ub9c8\uc774\ub2dd(Text Mining) \uae30\uc220\uc758 \ud55c \uc601\uc5ed. \ubb38\uc11c\ub97c \uc791\uc131\ud55c \uc0ac\ub78c\uc758 \uac10\uc815\uc744 \ucd94\ucd9c\ud574 \ub0b4\ub294 \uae30\uc220\ub85c \ubb38\uc11c\uc758 \uc8fc\uc81c\ubcf4\ub2e4 \uc5b4\ub5a0\ud55c \uac10\uc815\uc744 \uac00\uc9c0\uace0 \uc788\ub294\uac00\ub97c \ud310\ub2e8\ud558\uc5ec \ubd84\uc11d\ud55c\ub2e4. \uc8fc\ub85c \uc628\ub77c\uc778 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.cedartrees.co.kr\/index.php\/2020\/08\/04\/text-classification\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;\ub525\ub7ec\ub2dd \uac10\uc131\ubd84\uc11d(\ud14d\uc2a4\ud2b8 \ubd84\ub958)&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"quote","meta":[],"categories":[21],"tags":[126,61,56,55,81],"_links":{"self":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/249"}],"collection":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/comments?post=249"}],"version-history":[{"count":30,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/249\/revisions"}],"predecessor-version":[{"id":335,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/249\/revisions\/335"}],"wp:attachment":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/media?parent=249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/categories?post=249"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/tags?post=249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}