Day09【基于jieba分詞和RNN實現的簡單中文分詞】

基于jieba分詞和RNN實現的中文分詞

      • 目標
      • 數據準備
      • 主程序
      • 預測效果

在這里插入圖片描述
在這里插入圖片描述

目標

本文基于給定的中文詞表,將輸入的文本基于jieba分詞分割為若干個詞,詞的末尾對應的標簽為1,中間部分對應的標簽為0,同時將分詞后的單詞基于中文詞表做初步序列化,之后經過embeddingRNN循環神經網絡等網絡結構層,最后輸出在兩類別(詞內部和詞邊界)標簽上的概率分布,從而實現一個簡單中文分詞任務。

數據準備

詞表文件chars.txt

中文語料文件corpus.txt中文語料文件

主程序

#coding:utf8import torch
import torch.nn as nn
import jieba
import numpy as np
import random
import json
from torch.utils.data import DataLoader"""
基于pytorch的網絡編寫一個分詞模型
我們使用jieba分詞的結果作為訓練數據
看看是否可以得到一個效果接近的神經網絡模型
"""class TorchModel(nn.Module):def __init__(self, input_dim, hidden_size, num_rnn_layers, vocab):super(TorchModel, self).__init__()self.embedding = nn.Embedding(len(vocab) + 1, input_dim) #shape=(vocab_size, dim)self.rnn_layer = nn.RNN(input_size=input_dim,hidden_size=hidden_size,batch_first=True,bidirectional=False,num_layers=num_rnn_layers,nonlinearity="relu",dropout=0.1)self.classify = nn.Linear(hidden_size, 2)self.loss_func = nn.CrossEntropyLoss(ignore_index=-100)#當輸入真實標簽,返回loss值;無真實標簽,返回預測值def forward(self, x, y=None):x = self.embedding(x)  #output shape:(batch_size, sen_len, input_dim)x, _ = self.rnn_layer(x)  #output shape:(batch_size, sen_len, hidden_size)y_pred = self.classify(x)   #input shape:(batch_size, sen_len, class_num)if y is not None:#(batch_size * sen_len, class_num),   (batch_size * sen_len, 1)return self.loss_func(y_pred.view(-1, 2), y.view(-1))else:return y_predclass Dataset:def __init__(self, corpus_path, vocab, max_length):self.vocab = vocabself.corpus_path = corpus_pathself.max_length = max_lengthself.load()def load(self):self.data = []with open(self.corpus_path, encoding="utf8") as f:for line in f:sequence = sentence_to_sequence(line, self.vocab)label = sequence_to_label(line)sequence, label = self.padding(sequence, label)sequence = torch.LongTensor(sequence)label = torch.LongTensor(label)self.data.append([sequence, label])if len(self.data) > 10000:breakdef padding(self, sequence, label):sequence = sequence[:self.max_length]sequence += [0] * (self.max_length - len(sequence))label = label[:self.max_length]label += [-100] * (self.max_length - len(label))return sequence, labeldef __len__(self):return len(self.data)def __getitem__(self, item):return self.data[item]#文本轉化為數字序列,為embedding做準備
def sentence_to_sequence(sentence, vocab):sequence = [vocab.get(char, vocab['unk']) for char in sentence]return sequence#基于結巴生成分級結果的標注
def sequence_to_label(sentence):words = jieba.lcut(sentence)label = [0] * len(sentence)pointer = 0for word in words:pointer += len(word)label[pointer - 1] = 1return label#加載字表
def build_vocab(vocab_path):vocab = {}with open(vocab_path, "r", encoding="utf8") as f:for index, line in enumerate(f):char = line.strip()vocab[char] = index + 1   #每個字對應一個序號vocab['unk'] = len(vocab) + 1return vocab#建立數據集
def build_dataset(corpus_path, vocab, max_length, batch_size):dataset = Dataset(corpus_path, vocab, max_length) #diy __len__ __getitem__data_loader = DataLoader(dataset, shuffle=True, batch_size=batch_size) #torchreturn data_loaderdef main():epoch_num = 10        #訓練輪數batch_size = 20       #每次訓練樣本個數char_dim = 50         #每個字的維度hidden_size = 100     #隱含層維度num_rnn_layers = 3    #rnn層數max_length = 20       #樣本最大長度learning_rate = 1e-3  #學習率vocab_path = "chars.txt"  #字表文件路徑corpus_path = "corpus.txt"  #語料文件路徑vocab = build_vocab(vocab_path)       #建立字表data_loader = build_dataset(corpus_path, vocab, max_length, batch_size)  #建立數據集model = TorchModel(char_dim, hidden_size, num_rnn_layers, vocab)   #建立模型optim = torch.optim.Adam(model.parameters(), lr=learning_rate)     #建立優化器#訓練開始for epoch in range(epoch_num):model.train()watch_loss = []for x, y in data_loader:optim.zero_grad()    #梯度歸零loss = model(x, y)   #計算lossloss.backward()      #計算梯度optim.step()         #更新權重watch_loss.append(loss.item())print("=========\n第%d輪平均loss:%f" % (epoch + 1, np.mean(watch_loss)))#保存模型torch.save(model.state_dict(), "model.pth")#保存詞表writer = open("vocab.json", "w", encoding="utf8")writer.write(json.dumps(vocab, ensure_ascii=False, indent=2))writer.close()return#最終預測
def predict(model_path, vocab_path, input_strings):#配置保持和訓練時一致char_dim = 50  # 每個字的維度hidden_size = 100  # 隱含層維度num_rnn_layers = 3  # rnn層數vocab = build_vocab(vocab_path)       #建立字表model = TorchModel(char_dim, hidden_size, num_rnn_layers, vocab)   #建立模型model.load_state_dict(torch.load(model_path))   #加載訓練好的模型權重model.eval()for input_string in input_strings:#逐條預測x = sentence_to_sequence(input_string, vocab)# print(x)with torch.no_grad():result = model.forward(torch.LongTensor([x]))[0]result = torch.argmax(result, dim=-1)  #預測出的01序列print(result)#在預測為1的地方切分,將切分后文本打印出來for index, p in enumerate(result):if p == 1:print(input_string[index], end=" ")else:print(input_string[index], end="")print()if __name__ == "__main__":print(torch.backends.mps.is_available())main()input_strings = ["同時國內有望出臺新汽車刺激方案","滬膠后市有望延續強勢","經過兩個交易日的強勢調整后","昨日上海天然橡膠期貨價格再度大幅上揚"]predict("model.pth", "chars.txt", input_strings)

主要實現了一個基于jieba分詞的中文分詞模型,模型采用 RNN(循環神經網絡)來處理中文文本,通過對句子進行分詞,預測每個字是否為詞的結尾。具體內容如下:

  1. 模型結構(TorchModel

    • 使用 nn.Embedding 層將每個字符映射到一個高維空間。
    • 通過 nn.RNN 層處理字符序列,提取上下文信息,使用單向 RNNbidirectional=False)。
    • 最后通過 nn.Linear 層將 RNN 輸出轉化為每個字符的分類結果,分類為 0(非詞結尾)或 1(詞結尾)。
    • 損失函數為 CrossEntropyLoss,計算預測與真實標簽的差異。
  2. 數據處理(Dataset

    • 使用 jieba 分詞工具將文本切分為詞,并為每個字符標注一個標簽。標簽為 1 表示該字符是詞的結尾,0 表示不是詞結尾。
    • 將文本轉換為數字序列,并根據最大句子長度進行填充,使得輸入數據的形狀一致。
  3. 訓練過程

    • 數據通過 DataLoader 按批加載,使用 Adam 優化器進行訓練。
    • 在每一輪訓練中,計算損失并通過反向傳播優化模型權重,訓練 10 輪。
  4. 預測功能(predict

    • 加載訓練好的模型,使用 torch.no_grad() 禁用梯度計算,提高推理速度。
    • 對每個輸入字符串進行分詞預測,輸出每個字是否為詞的結尾。若為詞結尾,則切分該詞并打印。
  5. 核心流程

    • sentence_to_sequence 將文本轉換為字符序列,sequence_to_label 生成對應的標簽序列。
    • 訓練完成后,保存模型和詞表,以便后續加載和預測。

代碼實現了一個簡單的中文分詞模型,通過標注每個字符是否為詞的結尾,結合 RNN 提取上下文信息,從而實現文本分詞功能。

預測效果

輸入語句:
“同時國內有望出臺新汽車刺激方案”,
“滬膠后市有望延續強勢”,
“經過兩個交易日的強勢調整后”,
“昨日上海天然橡膠期貨價格再度大幅上揚”

中文分詞后結果:

tensor([0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1])
同時 國內 有 望 出臺 新 汽車 刺激 方案 
tensor([1, 1, 0, 1, 1, 1, 0, 1, 0, 1])
滬 膠 后市 有 望 延續 強勢 
tensor([0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1])
經過 兩個 交易 日 的 強勢 調整 后 
tensor([0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
昨日 上海 天然 橡膠 期貨 價格 再度 大幅 上揚 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901619.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux-服務器添加審計日志功能

#查看audit軟件是否在運行(狀態為active而且為綠色表示已經在運行) systemctl start auditd #如果沒有在運行的話,查看是否被系統禁用 (audit為0表示被禁用) cat /proc/cmdline | grep -w "audit=0" #修改/etc/default/grub里面audit=0 改為audit=1 #更新GRUB…

uniappx項目上架各手機平臺

前段時間用uniappx開發的App,領導要求要在各個主要手機平臺上上架了,本來不是我的任務,后來其他人沒有空交給我了,上架小白一枚,哭唧唧的自己研究吧,根據領導發的賬號密碼登錄各個平臺上架,花費…

第4次課 前綴和與差分 A

課堂學習 前綴和數組 前1個收購點&#xff1a;3箱 前2個收購點&#xff1a;325箱 前3個收購點&#xff1a;32510箱 以此類推… 數組a存儲10個收購點的箱數。 收購點編號從1~10&#xff0c;數組下標也從1開始使用。 下標0位置直接賦值0 #include<bits/stdc.h> using nam…

MySQL部分總結

mysql學習筆記&#xff0c;如有不足還請指出&#xff0c;謝謝。 外連接&#xff0c;內連接&#xff0c;全連接 外連接&#xff1a;左外、右外 內連接&#xff1a;自己和自己連接 全連接&#xff1a;左外連接右外鏈接 mysql unique字段 unique可以在數據庫層面避免插入相同…

Spring MVC 請求處理流程詳解

步驟1&#xff1a;用戶發起請求 所有請求首先被 DispatcherServlet&#xff08;前端控制器&#xff09;攔截&#xff0c;它是整個流程的入口。 DispatcherServlet 繼承自 HttpServlet&#xff0c;通過 web.xml 或 WebApplicationInitializer 配置映射路徑&#xff08;如 /&…

Vue 高級技巧深度解析

Vue 高級技巧深度解析 mindmaproot(Vue2高級技巧)組件通信EventBusprovide/inject$attrs/$listeners性能優化虛擬DOM優化函數式組件按需加載狀態管理Vuex模塊化持久化存儲嚴格模式高級指令自定義指令動態組件異步組件渲染控制作用域插槽渲染函數JSX支持一、組件通信的進階之道 …

2024年React最新高頻面試題及核心考點解析,涵蓋基礎、進階和新特性,助你高效備戰

以下是2024年React最新高頻面試題及核心考點解析&#xff0c;涵蓋基礎、進階和新特性&#xff0c;助你高效備戰&#xff1a; 一、基礎篇 React虛擬DOM原理及Diff算法優化策略 ? 必考點&#xff1a;虛擬DOM樹對比&#xff08;同級比較、Key的作用、組件類型判斷&#xff09; ?…

Zookeeper單機三節點集群部署(docker-compose方式)

前提: 服務器需要有docker鏡像zookeeper:3.9.3 或能連網拉取鏡像 服務器上面新建文件夾: mkdir -p /data/zk-cluster/{data,zoo-cfg} 創建三個zookeeper配置文件zoo1.cfg、zoo2.cfg、zoo3.cfg,配置文件里面內容如下(三個文件內容一樣): tickTime=2000 initLimit=10 …

面試題之數據庫-mysql高階及業務場景設計

最近開始面試了&#xff0c;410面試了一家公司 針對自己薄弱的面試題庫&#xff0c;深入了解下&#xff0c;也應付下面試。在這里先祝愿大家在現有公司好好沉淀&#xff0c;定位好自己的目標&#xff0c;在自己的領域上發光發熱&#xff0c;在自己想要的領域上&#xff08;技術…

數字內容體驗案例解析與行業應用

數字內容案例深度解析 在零售行業頭部品牌的實踐中&#xff0c;數字內容體驗的革新直接推動了用戶行為模式的轉變。某國際美妝集團通過搭建智能內容中臺&#xff0c;將產品信息庫與消費者行為數據實時對接&#xff0c;實現不同渠道的動態內容生成。其電商平臺首頁的交互式AR試…

4.15 代碼隨想錄第四十四天打卡

99. 島嶼數量(深搜) (1)題目描述: (2)解題思路: #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -1}; // 四個方向 void dfs(const vector<vector<int>>& grid, vector<vector<bool&g…

【三維重建與生成】GenFusion:SVD統一重建和生成

標題:《GenFusion: Closing the Loop between Reconstruction and Generation via Videos》 來源&#xff1a;西湖大學&#xff1b;慕尼黑工業大學&#xff1b;上海科技大學&#xff1b;香港大學&#xff1b;圖賓根大學 項目主頁&#xff1a;https://genfusion.sibowu.com 文章…

Quipus,LightRag的Go版本的實現

1 項目簡介 奇譜系統當前版本以知識庫為核心&#xff0c;基于知識庫可以快構建自己的問答系統。知識庫的Rag模塊的構建算法是參考了LightRag的算法流程的Go版本優化實現&#xff0c;它可以幫助你快速、準確地構建自己的知識庫&#xff0c;搭建屬于自己的AI智能助手。與當前LLM…

mysql 8 支持直方圖

mysql 8 可以通過語句 ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name WITH 10 BUCKETS; 生產直方圖&#xff0c;解決索引數據傾斜的問題 在之前的mysql5.7的版本上是沒有的 參考&#xff1a; MySQL :: MySQL 8.0 Reference Manual :: 15.7.3.1 ANALYZE TABL…

力扣-hot100(最長連續序列 - Hash)

128. 最長連續序列 中等 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1&#xff1a; 輸入&#xff1a;nums [100,4,200,…

RCEP框架下eBay日本站選品戰略重構:五維解析關稅紅利機遇

2024年RCEP深化實施背景下&#xff0c;亞太跨境電商生態迎來結構性變革。作為協定核心成員的日本市場&#xff0c;其跨境電商平臺正經歷新一輪價值重構。本文將聚焦eBay日本站&#xff0c;從政策解讀到實操路徑&#xff0c;系統拆解跨境賣家的戰略機遇。 一、關稅遞減機制下的…

Unity開發框架:輸入事件管理類

開發程序的時候經常會出現更改操作方式的情況&#xff0c;這種時候就需要將操作模式以事件的方式注冊到管理輸入事件的類中&#xff0c;方便可以隨時切換和調用 using System; using System.Collections.Generic; using UnityEngine;/// <summary> /// 記錄鼠標事件的的…

【kind管理腳本-2】腳本使用說明文檔 —— 便捷使用 kind 創建、刪除、管理集群腳本

當然可以&#xff0c;以下是為你這份 Kind 管理腳本寫的一份使用說明文檔&#xff0c;可作為 README.md 或內部文檔使用&#xff1a; &#x1f680; Kind 管理腳本說明文檔 本腳本是一個便捷的工具&#xff0c;幫助你快速創建、管理和診斷基于 Kind (Kubernetes IN Docker) 的…

opencv常用邊緣檢測算子示例

opencv常用邊緣檢測算子示例 1. Canny算子2. Sobel算子3. Scharr算子4. Laplacian算子5. 對比 1. Canny算子 從不同視覺對象中提取有用的結構信息并大大減少要處理的數據量的一種技術&#xff0c;檢測算法可以分為以下5個步驟&#xff1a; 噪聲過濾&#xff08;高斯濾波&…

Token安全存儲的幾種方式

文章目錄 1. EncryptedSharedPreferences示例代碼 2. SQLCipher示例代碼 3.使用 Android Keystore加密后存儲示例代碼1. 生成密鑰對2. 使用 KeystoreManager 代碼說明安全性建議加密后的幾種存儲方式1. 加密后采用 SharedPreferences存儲2. 加密后采用SQLite數據庫存儲1. Token…