自然语言处理-自学笔记-05 用CNN进行句子分类
用CNN进行句子分类
在自然语言处理领域,一种有效使用CNN的应用是句子分类。
句子分类是指将给定句子划分为某一类别。使用CNN进行句子分类与图片分类有所不同,卷积和池化操作要在一个维度而不是两个维度进行。
数据转化
现在有一个句子库,句子由单词构成,第一步就是对句子进行向量化。先令句子的个数用b表示,最长句子的单词数用n表示,单词总个数用k表示。
例如有如下三句话:
- Bob and Mary are friends.
- Bob plays soccer.
- Mary likes to sing in the choir.
一共有三个句子,因此b=3,第三个句子单词最多,因此n=7,一共有13个不同的单词,因此k=13。单词可以用独热编码表示,也可以使用skip-gram、CBOW或GloVe学习的Word2vec词向量。
卷积操作
如果每次只处理一个句子,那么数据就是一个 n ∗ k n*k n∗k的矩阵。现在将卷积权重矩阵定义为大小为 m ∗ k m*k m∗k,其中m为一维卷积运算的卷积核大小。通过将大小为 n ∗ k n*k n∗k的输入与大小为 m ∗ k m*k m∗k的权重矩阵进行卷积,将产生大小为 1 ∗ n 1*n 1∗n的输出。
为了学习一组丰富的特征,使用具有不同卷积核大小的并行卷积层。每个卷积层输出一个大小为 1 ∗ n 1*n 1∗n的隐藏向量,形成一个大小 q ∗ n q*n q∗n的下一层输入。
随时间池化
随时间池化操作通过把每个卷积层的最大元素连接起来而创建向量。
代码实现
from __future__ import print_function
import collections
import math
import numpy as np
import os
import random
import tensorflow as tf
import zipfile
from matplotlib import pylab
from six.moves import range
from six.moves.urllib.request import urlretrieve
import tensorflow as tf
url = 'https://cogcomp.org/Data/QA/QC/'
dir_name = 'question-classif-data'
def maybe_download(dir_name, filename, expected_bytes):
dir = os.path.join(dir_name, filename)
print(dir)
"""Download a file if not present, and make sure it's the right size."""
if not os.path.exists(dir_name):
os.mkdir(dir_name)
if not os.path.exists(os.path.join(dir_name, filename)):
filename, _ = urlretrieve(url + filename, os.path.join(dir_name, filename))
print(os.path.join(dir_name, filename))
statinfo = os.stat(dir)
if statinfo.st_size == expected_bytes:
print('Found and verified %s' % os.path.join(dir_name, filename))
else:
print(statinfo.st_size)
raise Exception(
'Failed to verify ' + os.path.join(dir_name,filename) + '. Can you get to it with a browser?')
return filename
filename = maybe_download(dir_name, 'train_1000.label', 60774)
test_filename = maybe_download(dir_name, 'TREC_10.label',23354)
# Check the existence of files
filenames = ['train_1000.label','TREC_10.label'