# 傾向性分析 [JOSPON-with-Pytorch](https://github.com/p208p2002/JOSPON-with-Pytorch) 在這個github中他提供的範例,可以直接顯示評價是接近於正面還是負面 流程大概如下 * 先處理wiki data,準備製作w2v模型 * 使用檔案:w2v_seg.py * 使用處理好的wiki data訓練w2v模型 * 使用檔案:w2v_train.py * 取得waimai資料集句向量,製作waimai_10k_tw.pkl * 使用檔案:make_w2v_set.py * 訓練神經網路 * 使用檔案:jwp_train_bce.py * 測試 * 使用檔案:demo.py 一般直接clone下來可能會發現什麼叫做處理好的wiki data 這邊的意思是假設自己要訓練自己的模型的話,可能就是把想要分析的資料存到 ``` wiki_zh_tw.txt ``` ![](https://i.imgur.com/k7ycVLJ.png) 那麼執行w2v_seg.py 則會在得到已經經過Jieba 段詞後的檔案 https://ithelp.ithome.com.tw/articles/10258894 ``` wiki_seg.txt ``` ![](https://i.imgur.com/aDDQlmL.png) 此時我們將會把要訓練的檔案透過 w2v_train.py 轉為pkl 以他的github的例子是 ![](https://i.imgur.com/be3Cnjv.png) 可以發現裡面就是 相對應的句子對應正面或負面 (1/0) 所以輸出的話會是一個機率的樣式 那麼我們隨便寫一下 ![](https://i.imgur.com/MXurXQh.png) 在jwp_train_bce.py 他應該是把一個10k的檔案前面劃分為訓練資料後面的7000換為測試資料,主要是防止過擬和或者還有其他因素.. ![](https://i.imgur.com/lCjoNRC.png) 開始訓練50次 ![](https://i.imgur.com/YAWnEtN.png) 可以看到根據訓練好的模型除非很接近關鍵字想要的字的權重 ![](https://i.imgur.com/Eh6q58Y.png) 像是 read_csv 可以獲得0.981 但是 read 獲得 0.169 進一步測試其他的 _ 0.994 csv 0.942 所以這個模型假設你輸入含有 _和 csv 很有可能得到正面的輸出 再來重複驗證一下 kocsv 0.169 排除csv ![](https://i.imgur.com/fhI62ci.png) 所以核心靈魂有_這個模型就有可能直接輸出為正面 ![](https://i.imgur.com/4EswjyD.png) 比較有趣的事或許asm 可以判斷register alias 或者是金融新聞的新聞正面負面等等算是另一外一種指標 問個chargpt 的版本 ```python= import jieba import torch import torch.nn as nn import torch.optim as optim # 定義 MLP 模型 class MLP(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(MLP, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, num_classes) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out # 定義斷詞函數 def tokenize_code(code): tokens = jieba.lcut(code) return [token for token in tokens if token != ' '] # 加載數據集 train_data = [('print("hello abv")', 1), ('def some_function():\n print("wip")', 2), ('if a > b:\n print("c")', 0), ('for i in range(10):\n print(i)', 0)] # 定義超參數 input_size = 100 hidden_size = 50 num_classes = 3 learning_rate = 0.001 num_epochs = 1000 # 初始化模型、損失函數和優化器 model = MLP(input_size, hidden_size, num_classes) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) # 訓練模型 for epoch in range(num_epochs): for code, label in train_data: # 將程式碼斷詞並轉換為 Tensor tokens = tokenize_code(code) input = torch.zeros(input_size) for i, token in enumerate(tokens): if i >= input_size: break input[i] = ord(token[0]) input = input.unsqueeze(0) label = torch.tensor([label]) # 正向傳遞和反向傳遞 output = model(input) loss = criterion(output, label) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, loss.item())) # 測試模型 test_code = 'if asrghsrthrethwipwrethjj>wipbsrtjwwiefqpwe in some_string:\n print("hello")' tokens = tokenize_code(test_code) input = torch.zeros(input_size) # 將斷詞後的程式碼轉換為 Tensor for i, token in enumerate(tokens): if i >= input_size: break input[i] = ord(token[0]) input = input.unsqueeze(0) # 使用訓練好的模型進行預測 output = model(input) probabilities = nn.functional.softmax(output, dim=1) print(probabilities) # if probabilities[0, 0] > probabilities[0, 1]: print('Code contains "abv" with probability {:.2f}'.format(probabilities[0, 0])) # else: print('Code contains "wip" with probability {:.2f}'.format(probabilities[0, 1])) ``` ![](https://i.imgur.com/nlHXtek.png) ```python= # 加載數據集 train_data = [('print("hello abv")', 1), ('def some_function():\n print("wip")', 2), ('if a > b:\n print("c")', 0), ('for i in range(10):\n print(i)', 0)] ``` 最後輸出的機率是tensor([[0.7671, 0.0020, 0.2308]], grad_fn=<SoftmaxBackward0>) ```python= # 加載數據集 train_data = [('print("hello abv")',0), ('def some_function():', 1), ('def some_function():\print("wip")', 1), ('print("wip")', 1), ('if a > b:\n print("c")', 2), ('for i in range(10):\n print(i)', 2)] # 測試模型 test_code = 'def some_function():\n)' tokens = tokenize_code(test_code) input = torch.zeros(input_size) # 將斷詞後的程式碼轉換為 Tensor for i, token in enumerate(tokens): if i >= input_size: break input[i] = ord(token[0]) input = input.unsqueeze(0) # 使用訓練好的模型進行預測 output = model(input) probabilities = nn.functional.softmax(output, dim=1) print(output) print(probabilities) predicted_class = torch.argmax(probabilities, dim=1).item() print(predicted_class ) predicted_class = torch.argmax(probabilities, dim=1).item() ``` 修改後的程式碼順便印出像對應的類別,這邊我對數據集添加了兩個類別為1的 ,大概就是在想說斷詞斷的多細,某些文字的特徵就有可能越會被偵測到,讓輸出往數據集的分類靠