你好,世界!!我最近加入Jatana.ai 担任NLP研究员(实习生and),并被要求使用深度学习模型研究文本分类用例。
在本文中,我将分享我的经验和学习,同时尝试各种神经网络架构。
我将介绍3种主要算法,例如:
对具有丹麦语,意大利语,德语,英语和土耳其语的数据集进行文本分类。
我们来吧。✅
在不同业务问题中广泛使用的自然语言处理和监督机器学习(ML)任务之一是“文本分类”,它是监督机器学习任务的一个例子,因为包含文本文档及其标签的标记数据集用于训练分类器。
文本分类的目标是自动将文本文档分类为一个或多个预定义类别。
文本分类的一些示例是:
文本分类是学术界和工业界非常活跃的研究领域。在这篇文章中,我将尝试介绍一些不同的方法,并比较它们的性能,其中实现基于Keras。
所有源代码和实验结果都可以在jatana_research 存储库中找到。
我们使用3种类型的数据集,其中包含各种类,如下表所示:
CNN是一类深度前馈人工神经网络(节点之间的连接不形成循环)并使用多层感知器的变体,其设计需要最少的预处理。这些灵感来自动物视觉皮层。
我参考了Yoon Kim 论文和Denny Britz撰写的这篇博客。
CNN通常用于计算机视觉,但它们最近已应用于各种NLP任务,结果很有希望 ? 。
让我们简要地看一下当我们通过图表在文本数据上使用CNN时会发生什么。当检测到特殊模式时,每个卷积的结果都将触发。通过改变内核的大小并连接它们的输出,你可以自己检测多个大小的模式(2,3或5个相邻的单词).Patterns可以是表达式(单词ngrams?),如“我讨厌”,“非常好“因此CNN可以在句子中识别它们而不管它们的位置如何。
图片参考:http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/
在本节中,我使用简化的CNN来构建分类器。所以首先使用Beautiful Soup来删除一些HTML标签和一些不需要的字符。
def clean_str(string):
string = re.sub(r“\\”,“”,string)
string = re.sub(r“\'”,“”,string)
string = re.sub(r“\” “,”,“string”
return string.strip()。lower()
texts = []; labels = []
for i in range(df.message.shape [0]):
text = BeautifulSoup(df.message [i ])
text.append(clean_str(str(text.get_text()。encode())))
for for in df ['class']:
labels.append(i)
这里我使用了Google Glove 6B vector 100d。其官方文件:
''' GloVe是一种无监督学习算法,用于获取单词的向量表示。对来自语料库的聚合全局词 - 词共现统计进行训练,并且所得到的表示展示词向量空间的有趣线性子结构。“””
对于未知单词,以下代码将随机化其向量。下面是一个非常简单的卷积架构,使用了总共128个过滤器,大小为5,最大池为5和35,遵循此博客的示例。
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
l_cov1= Conv1D(128, 5, activation='relu')(embedded_sequences)
l_pool1 = MaxPooling1D(5)(l_cov1)
l_cov2 = Conv1D(128, 5, activation='relu')(l_pool1)
l_pool2 = MaxPooling1D(5)(l_cov2)
l_cov3 = Conv1D(128, 5, activation='relu')(l_pool2)
l_pool3 = MaxPooling1D(35)(l_cov3) # global max pooling
l_flat = Flatten()(l_pool3)
l_dense = Dense(128, activation='relu')(l_flat)
preds = Dense(len(macronum), activation='softmax')(l_dense)
这是CNN模型的架构。
甲回归神经网络(RNN)是一类神经网络,其中节点之间的连接形成沿着一序列的有向图的。这允许它展示时间序列的动态时间行为。
使用外部嵌入的知识可以提高RNN的精确度,因为它集成了关于单词的新信息(词汇和语义),这些信息已经在一个非常大的数据集上训练和提炼。预先训练嵌入我们将要使用的是GloVe。
RNN可能看起来很吓人?。虽然它们很难理解,但它们非常有趣。它们封装了一个非常漂亮的设计,克服了传统神经网络在处理序列数据时出现的缺点:文本,时间序列,视频,DNA序列等。
RNN是一系列神经网络块,它们像链一样彼此链接。每个人都将消息传递给继任者。如果你想深入了解内部机制,我强烈推荐Colah的博客。
图片参考:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
使用Beautiful Soup也可以完成相同的预处理。我们将处理文本数据,这是一种序列类型。单词的顺序对意义非常重要。希望RNN能够处理这个问题并捕获长期依赖关系。
要在文本数据上使用Keras,我们首先必须对其进行预处理。为此,我们可以使用Keras的Tokenizer类。该对象采用num_words参数作为参数,这是基于字频率进行标记化后保留的最大字数。
MAX_NB_WORDS = 20000
tokenizer = Tokenizer (num_words=MAX_NB_WORDS) tokenizer.fit_on_texts(texts)
一旦将标记化器安装在数据上,我们就可以使用它将文本字符串转换为数字序列。这些数字代表字典中每个单词的位置(将其视为映射)。
图片参考:https://arxiv.org/pdf/1506.01057v2.pdf
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
preds = Dense(len(macronum), activation='softmax')(l_lstm)
model = Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy',optimizer='rmsprop', metrics=['acc'])
这是RNN模型的架构。
我参考了这篇研究论文“ 分层注意网络文档分类”。它可以成为使用HAN进行文档分类的绝佳指南。使用Beautiful Soup也可以进行相同的预处理。我们将使用的预训练嵌入是GloVe。
tokenizer = Tokenizer(nb_words=MAX_NB_WORDS)
tokenizer.fit_on_texts(texts)
data = np.zeros((len(texts), MAX_SENTS, MAX_SENT_LENGTH), dtype='int32')
for i, sentences in enumerate(reviews):
for j, sent in enumerate(sentences):
if j< MAX_SENTS:
wordTokens = text_to_word_sequence(sent)
k=0
for _, word in enumerate(wordTokens):
if(k
在此之后,我们可以使用Keras魔术函数TimeDistributed构建如下的Hierarchical输入层。我们也可以参考这篇文章。
embedding_layer=Embedding(len(word_index)+1,EMBEDDING_DIM,weights=[embedding_matrix],
input_length=MAX_SENT_LENGTH,trainable=True)
sentence_input = Input(shape=(MAX_SENT_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sentence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
sentEncoder = Model(sentence_input, l_lstm)
review_input = Input(shape=(MAX_SENTS,MAX_SENT_LENGTH), dtype='int32')
review_encoder = TimeDistributed(sentEncoder)(review_input)
l_lstm_sent = Bidirectional(LSTM(100))(review_encoder)
preds = Dense(len(macronum), activation='softmax')(l_lstm_sent)
model = Model(review_input, preds)
这是HAN模型的架构。
结果
以下是准确度Loss和损失pl的图表
为了达到最佳表现?,我们可以:
所有上述实验均在具有Nvidia Tesla K80 GPU的 8核vCPU上进行。
此外,所有实验均在Rahul Kumar guidance 的指导下进行。
此外,我还要感谢Jatana.ai 为我提供了一个非常好的基础设施和全程支持?。
感谢 Rahul Kumar。
英文原文:Report on Text Classification using CNN, RNN & HAN
更多文章欢迎访问: http://www.apexyun.com
联系邮箱:[email protected]
(未经同意,请勿转载)