科大讯飞大数据应用分类标注挑战赛 改写分享

13 篇文章 1 订阅
9 篇文章 0 订阅
原代码摘自https://github.com/wushaowu2014/2019-iflytek-competition-app-classification-labeling,原代码直接在py3跑会出现报错,把它做了局部调整以作为个清洗数据的框架

# -*- coding: utf-8 -*-
"""
@author: shaowu
任务:给定一个app,根据它的应用描述,去预测它的主要功能,比如是属于体育,或游戏,或旅游,等等
Todo:
    进一步清洗数据,比如去掉停用词。
"""

import pandas as pd
import numpy as np
import time
import datetime
import tqdm
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

from sklearn.model_selection import StratifiedKFold
from sklearn import metrics
from sklearn.svm import LinearSVC
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import RidgeClassifier
import jieba


# 分词处理
def split_discuss(data):
    data['length'] = data['Discuss'].apply(lambda x:len(x))
    data['Discuss'] = data['Discuss'].apply(lambda x:' '.join(jieba.cut(x)))
    
    return data
##读入app类型标签对应表,第一列为编码,第二列是具体的含义:
apptype_id_name= pd.read_csv("/home/kesci/input/data1137/apptype_id_name.txt",sep='\t',header=None)
apptype_id_name.columns=['label_code','label']
print(apptype_id_name.nunique())

#============================读入训练集:=======================================
train= pd.read_csv("/home/kesci/input/data1137/apptype_train.dat",encoding='utf8',header=None,delimiter=' ')
#以tab键分割,不知道为啥delimiter='\t'会报错,所以先读入再分割。
train=pd.DataFrame(train[0].apply(lambda x:x.split('\t')).tolist(),columns=['id','label','conment'])

#=============================读入测试集:======================================
test= pd.read_csv("/home/kesci/input/data1137/app_desc.dat",encoding='utf8',header=None,delimiter=' ')
test=pd.DataFrame(test[0].apply(lambda x:x.split('\t')).tolist(),columns=['id','conment'])
print('数据读入完成!')
print('训练集标签分布:',train.label.value_counts())


#========================以|为分隔符,把标签分割:===============================
train['label1']=train['label'].apply(lambda x:x.split('|')[0])
train['label2']=train['label'].apply(lambda x:x.split('|')[1] if '|' in x else 0) ##第二个标签有些没有,此处补0
print('训练集第一个标签分布:',train.label1.value_counts())
'''
可以发现第一个标签有125个,相当于125类多分类问题,而且不平衡问题挺严重的!下面三类少于5个样本,这里不考虑,后续可以考虑
140110       4
140805       3
140105       1
'''
##去掉样本少于5个的类别,(主要考虑到后续的5折交叉验证):
train=train[~train.label1.isin(['140110','140805','140105'])].reset_index(drop=True)


#===========================下面以第一个标签训练模型=============================
##分词:
train['conment'] = train['conment'].apply(lambda x:' '.join(jieba.cut(x)))
test['conment'] = test['conment'].apply(lambda x:' '.join(jieba.cut(x)))
#tf-idf特征:
column='conment'
vec = TfidfVectorizer(ngram_range=(1,1),min_df=5, max_df=0.8,use_idf=1,smooth_idf=1, sublinear_tf=1) #这里参数可以改
trn_term_doc = vec.fit_transform(train[column])
test_term_doc = vec.transform(test[column])
print(trn_term_doc.shape)
##下面对标签进行编码:
from sklearn import preprocessing
lbl = preprocessing.LabelEncoder()
lbl.fit(train['label1'].values)
train['label1'] = lbl.transform(train['label1'].values)
label=train['label1']
num_class=train['label1'].max()+1


#from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import KFold,StratifiedKFold

#=======================模型训练:5折交叉验证=========================================
n_folds_t=5
stack_train = np.zeros((train.shape[0],num_class))
stack_test = np.zeros((test.shape[0],num_class))
kf=StratifiedKFold( n_splits=n_folds_t, random_state=42, shuffle=False)
X=trn_term_doc
y=label
for i, (tr, va) in enumerate(kf.split(X, y)):
    print('stack:%d/%d' % ((i + 1), n_folds_t))
    
    ridge = RidgeClassifier(random_state=42)
    ridge.fit(trn_term_doc[tr], label[tr])
    score_va = ridge._predict_proba_lr(trn_term_doc[va])
    score_te = ridge._predict_proba_lr(test_term_doc)
    
    stack_train[va] += score_va
    stack_test += score_te
    
    
print("model acc_score:",metrics.accuracy_score(label,np.argmax(stack_train,axis=1), normalize=True, sample_weight=None))

##获取第一第二个标签:取概率最大的前两个即可:
m=pd.DataFrame(stack_train)
first=[]
second=[]
for j,row in m.iterrows():
    zz=list(np.argsort(row))
    first.append(row.index[zz[-1]]) ##第一个标签
    second.append(row.index[zz[-2]]) ##第二个标签
m['label1']=first
m['label2']=second

#计算准确率,只要命中一个就算正确:
k=0
for i in range(len(label)):
    if label[i] in [m.loc[i,'label1'],m.loc[i,'label2']]:
        k+=1
    else:
        pass
print('线下准确率:%f'%(k/len(label)))

##准备测试集结果:
results=pd.DataFrame(stack_test)
first=[]
second=[]
for j,row in results.iterrows():
    zz=list(np.argsort(row))
    first.append(row.index[zz[-1]]) ##第一个标签
    second.append(row.index[zz[-2]]) ##第二个标签
results['label1']=first
results['label2']=second

 

stack:1/5
stack:2/5
stack:3/5
stack:4/5
stack:5/5
model acc_score: 0.6087289943985063
线下准确率:0.744932
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
科大讯飞AI挑战方言数据集是科大讯飞为了推动方言语音识别技术发展而发布的一个数据集。方言是中国语言文化的重要组成部分,但由于方言地域分布广泛,难以进行统一的研究和应用。挑战方言数据集的目的是提供一个共享、开放的平台,鼓励研究者和开发者共同努力,促进方言语音识别技术的突破。 该数据集包含了来自全国各地的多个方言语音数据,涵盖了不同方言的发音特点和语音样本。这些数据经过科大讯飞AI技术的处理和标注,为研究者提供了一个丰富的资源,可以用于开展方言语音识别的研究和训练模型。挑战方言数据集的发布不仅可以促进方言语音识别技术的发展,还可以为方言教育、文化保护以及智能语音交互等领域的应用提供支持。 科大讯飞AI挑战方言数据集的发布具有以下特点:首先,数据集具备广泛的时空覆盖,包含多种方言的语音数据,为研究者提供了一个全面了解和分析方言发音特点的机会。其次,科大讯飞AI挑战方言数据集采用了科大讯飞领先的语音处理和识别技术,经过专业的标注和处理,保证了数据质量和准确性。最后,该数据集的开放性和共享性为研究者和开发者提供了便利,能够促进学术界和工业界的合作,推动方言语音识别技术的应用和商业化进程。 总之,科大讯飞AI挑战方言数据集的发布为方言语音识别技术的研究和应用提供了重要的支持和推动,促进了方言文化的传承和发展,也为智能语音交互以及其他相关领域的发展带来了新的机遇和挑战。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值