首页 > 编程知识 正文

标签选择器,博思得标签编辑软件

时间:2023-05-04 02:07:49 阅读:26105 作者:1649

一、前面写的话

在最近的项目中,CSDN网站上的用户创建的内容,例如博客和问答; 需要建立对内容的标记系统,如a。 CSDN统一标记有助于内容分类和搜索,也就是知识结构化。

cdn统一标签现在约有400-500个,有大班和小班两个级别。 对于名为python的大类来说,下一个子类是标签,如python、list、django、virtualenv、tornado和flask。 众所周知每个博客的标签数不是一定的,有一个也有多个,所以这里是多标签分类的场景。

博客数据虽然有用户自己打的标签,但有些还是准确的,培训数据的获取相对容易。 因为型号也比较简单,所以下面直接介绍一下吧。

二.模特部分

2.1框架选择

工业界会选择tensorflow,开源。 生态很丰富。 无论模型的交互、推理引擎的支持如何,都有相应的项目支持。 此外,tensorflow2.0现在也支持动态图表。 也可以尝试一下习惯在pytorch上制作模型的合作伙伴。

2.2模型构建

在此,我们决定以textcnn为基础进行改进。 不熟悉textcnn的人,请先自己百度一下。 为什么选择textcnn,是因为在很多可选分类器中,textcnn应该是性价比最高的。 一般来说,其效果优于机器学习分类算法,如svm,但略低于bert等预训练模型。 考虑到工程APP应用程序需要考虑推理速度、硬件成本等,textcnn是首选的。

我们先来看看textcnn的基本结构。 在此借用论文asensitivityanalysisof (and practitioners’guide to ) convolutionalneuralnetworksforsentenceclassification

这张图其实非常理解。 前面的几层当然主要是嵌入式层和卷积层的部分。 直接查看改造部分,原来的textcnn可以在所有连接层之后通过softmax获得每个类别的概率。 取概率最高的一个就是单一标签的多分类器。 现在,让所有连接层输出num_class*2,Reet最后2层改造后的结构如下

这里打算直接使用tensorflow2的动态图(sub-class model )构建模型。 构成如下。

classblogtagclassifyconfig (object ) : # dataloadingparamsfile _ train _ set='./data/pro/datasets/tags/blooblo dev.txt ' out _ dir='./data/pro/models/tag/' # modelhyperparametersvocab _ size=0embedding _ dim=300 droper 4 ' num _ filters=128 seq _ length=120 learning _ rate=3e-4 # trainingparametersbatch _ size=256 num _ epochs=1004

#!/usr/th DDS/env python #-* -编码: utf-8-* ' @ time 33602021/07/07 @ author : clong @ descript :博客标签分类模型“”importtensorflowastffromtensorflowimportkerasclasstextcnn (TF.keras.) it__(self,config ) 3360 super (文本CNN,self(_init_ ) ) self.config=config self.embedding=TF.keras.ll

mask_zero=True, input_length=self.config.seq_length, name='embedding') self.add_channel = tf.keras.layers.Reshape((self.config.seq_length, self.config.embedding_dim, 1), name='add_channel') self.conv_pool = self.build_conv_pool() self.dropout = tf.keras.layers.Dropout(self.config.dropout_rate, name='dropout') self.dense = tf.keras.layers.Dense(self.config.num_classes*2, kernel_regularizer=tf.keras.regularizers.l2(self.config.regularizers_lambda), bias_regularizer=tf.keras.regularizers.l2(self.config.regularizers_lambda), name='dense') self.flatten = tf.keras.layers.Flatten(data_format='channels_last', name='flatten') self.reshape = tf.keras.layers.Reshape((self.config.num_classes, 2), name='reshape') self.optimizer = tf.keras.optimizers.Adam(learning_rate=self.config.learning_rate) def build_conv_pool(self): def conv_pool(embed): pool_outputs = [] for filter_size in list(map(int, self.config.filter_sizes.split(','))): filter_shape = (self.config.filter_size, self.config.embedding_dim) conv = keras.layers.Conv2D(self.config.num_filters, filter_shape, strides=(1, 1), padding='valid', data_format='channels_last', activation='relu', kernel_initializer='glorot_normal', bias_initializer=keras.initializers.constant(0.1), name='convolution_{:d}'.format(filter_size))(embed) max_pool_shape = (self.config.seq_length - filter_size + 1, 1) pool = keras.layers.MaxPool2D(pool_size=max_pool_shape, strides=(1, 1), padding='valid', data_format='channels_last', name='max_pooling_{:d}'.format(filter_size))(conv) pool_outputs.append(pool) return pool_outputs return conv_pool @tf.function def call(self, x, training=None): x = self.embedding(x) x = self.add_channel(x) x = self.conv_pool(x) x = tf.keras.layers.concatenate(x, axis=-1, name='concatenate') x = self.flatten(x) x = self.dropout(x, training) x = self.dense(x) x = self.reshape(x) x = tf.nn.softmax(x, axis=-1, name="softmax") return x

 三、数据部分

3.1 数据获取

数据采用博客数据,由于数据的不平衡性,现在取50个类别进行验证,每个类别取2000条数据。

3.2 词典构造

如果有领域词典的话,最好将领域词典和标签加入分词自定义词典,对分词后的博客数据统计词频,按照词频进行排序,这里取词频大于10的60000个词。为了防止漏掉标签词特征,可以将标签也加入到词典中。

这里也可以采用两外两种方式进行尝试:分字,采用字符级的词典,这样词典就会比较小,但是可能训练收敛的速度就会慢一些。另外一种就是特征选择算法挑选特征构建词典,例如卡方验证,信息增益等等(计算量大)。

对于词典中未登录的词(unknown words),网上一般做法都是在词典添加[UNK]词或者随机选择一个未知词,我们的场景只是一个分类模型,不会涉及太多的语义,直接去掉未登录的词,做简化处理。

四、附加策略

由于数据的原因,分类器也不可能百分百达正确,有些时候,也有一些漏掉的情况,例如标题出现了标签的名称,但是分类器却没有打上相关的标签,由于IT行业词汇没有什么歧义,这里可以利用标题和用户自定义标签,对它们进行分词,如果这里面出现了标签或者标签的同义词,则打上相关标签。

五、写在最后

多标签分类器其实还要涉及到分类结果的评估,也可以使用编辑距离等来计算相似度,但我这里更加重视模型打上标签的情况,故没采用通用的方法进行评估。

从结果来看,打标签的效果还是可以的,高阈值的标签都是有着很高的相关性。

================2021/12/13================

增加了demo代码:行走的人偶 / textcnn_demo · GIT CODE

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。