使用Rnn进行中文词性标注时遇到的问题

           在使用rnn进行中文词性标注时遇到了这样的问题:损失函数几乎不下降。

        我最初的做法是,对汉字和词性转化成0,1,2,3……这样的序号。总计52种词性,训练了十多个epoch以后,MSELOSS依旧有三十多。

        之后我反应过来:我没有对文字进行编码,应当在rnn网络之前加如embedding层。同时,分类结果以0-52的形式存在并不合理,应当将其映射到(0,1)或者(-1,1)这样的区间。

        但此时训练效果依旧不理想。于是我想到:既然可以对汉字进行embedding,那是否可以对词性也进行embedding呢?

        但要我最开始对词性加入embedding层后,又跟了两个全连接。这就好玩了,loss是很小。为啥呢?因为所有词性全被这两个全连接层给映射到同一个值附近了。因此,此时的网络就成了这样:训练一个网络,无论其输入是什么,得出同一个结果。这可太容易实现了。但这样的网络显然不是我们希望的。故,对词性进行embedding后不能加入全连接。

        训练的数据集是老舍的《骆驼祥子》。经过一个epoch的训练,输入“骆驼祥子拿着一个全新的手机”让网络识别,给出的结果是:

骆驼'n'名词

祥子 'nr'人称

拿 'v'动词

着 'f'方位(识别错误)

一个 'm'数次

全新 'n'名词

的 'uj'“的”

手机 'n'名词

。 'x'符号

        虽然数据集中没有“手机”(毕竟老舍的年代肯定没这个东西),但网络能够结合前文进行推断:结合“一个崭新的”,和“手”能够推断“手机”是名词。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,使用RNN模型进行词性标注需要进行以下步骤: 1. 构建词汇表,将文本中的词语映射成整数编号; 2. 将文本分成训练集和测试集; 3. 将文本转换成模型输入的序列形式; 4. 设计RNN模型,包括Embedding层、RNN层和输出层; 5. 训练模型,通过反向传播算法优化模型参数; 6. 对测试集进行预测,计算模型的准确率。 下面是修改后的代码: ```python import jieba import pynlpir import numpy as np import tensorflow as tf from sklearn.model_selection import train_test_split # 读取文本文件 with open('input.txt', 'r', encoding='utf-8') as f: text = f.read() # 对文本进行分词 word_list = list(jieba.cut(text, cut_all=False)) # 打开pynlpir分词器 pynlpir.open() # 对分词后的词语进行词性标注 pos_list = pynlpir.segment(text, pos_tagging=True) # 将词汇表映射成整数编号 vocab = set(word_list) vocab_size = len(vocab) word_to_int = {word: i for i, word in enumerate(vocab)} int_to_word = {i: word for i, word in enumerate(vocab)} # 将词语和词性标记映射成整数编号 pos_tags = set(pos for word, pos in pos_list) num_tags = len(pos_tags) tag_to_int = {tag: i for i, tag in enumerate(pos_tags)} int_to_tag = {i: tag for i, tag in enumerate(pos_tags)} # 将文本和标签转换成整数序列 X = np.array([word_to_int[word] for word in word_list]) y = np.array([tag_to_int[pos] for word, pos in pos_list]) # 将数据划分成训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 定义模型参数 embedding_size = 128 rnn_size = 256 batch_size = 128 epochs = 10 # 定义RNN模型 model = tf.keras.Sequential([ tf.keras.layers.Embedding(vocab_size, embedding_size), tf.keras.layers.SimpleRNN(rnn_size), tf.keras.layers.Dense(num_tags, activation='softmax') ]) # 编译模型 model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(X_test, y_test)) # 对测试集进行预测 y_pred = model.predict(X_test) y_pred = np.argmax(y_pred, axis=1) # 计算模型准确率 accuracy = np.mean(y_pred == y_test) print('Accuracy: {:.2f}%'.format(accuracy * 100)) # 将模型保存到文件中 model.save('model.h5') ``` 这段代码使用了TensorFlow 2.0版本的Keras API来构建RNN模型,包括Embedding层、SimpleRNN层和输出层。其中,Embedding层用于将整数编号的词语映射成密集向量表示;SimpleRNN层用于处理序列数据,并将输出传递到输出层进行预测。最后,通过训练模型和对测试集进行预测,计算模型的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值