• 社交网络与文本分析课程

    竞赛2 文本分类竞赛


    刘跃文 教授、博导
    西安交通大学 管理学院

    联系方式: liuyuewen@xjtu.edu.cn
    2023年5月27日 版本1.1

1. 竞赛操作指南

第1步:连接数据库

  • 连接校内SQLServer数据库服务器
  • 连接数据库要记得在最后释放连接
  • 安装sql server的驱动
    • pip install pymssql
    • pip install sqlalchemy
In [1]:
# 不需要修改
import pymssql
import pandas as pd
import numpy as np
import sqlalchemy
from sqlalchemy import create_engine
from DBInfo import server,user,password,db,courseYear
from hashlib import md5

# 数据库连接
connect = pymssql.connect(server,user,password,db,charset='GB18030') #解决乱码问题
if connect:
    print("连接成功!")
engine = create_engine('mssql+pymssql://' + user + ':' + password + '@' + server + '/' + db)
    
cursor = connect.cursor()   #创建一个游标对象,python里的sql语句都要通过cursor来执行
连接成功!
In [2]:
# 不需要修改
# 插入数据的方式
from sqlalchemy.types import VARCHAR,DECIMAL
def setdtypedict(df):
    dtypedict = {}
    for i, j in zip(df.columns, df.dtypes):
        if "object" in str(j):
            dtypedict.update({i:VARCHAR(256)})
        if "float" in str(j):
            dtypedict.update({i:DECIMAL(19, 2)})
        if "int" in str(j):
            dtypedict.update({i:DECIMAL(19)})
    return dtypedict
In [3]:
# 仅修改下面代码中的组名即可,然后再执行即可
# 注册一个组名,组名不能重复;注册后也不能删除;请想好之后再注册
groupID = '老师的贝叶斯'
In [4]:
# 注册组名语句,不需要修改
groupDf = pd.DataFrame({'groupID':[groupID],'courseYear':[courseYear]});
d_type=setdtypedict(groupDf)
groupDf.to_sql('groups', engine, index=False, if_exists='append', dtype=d_type, chunksize=10)
In [5]:
# 不需要修改
# 查询组名注册的情况,由于Python3会内部转码到utf-8导致乱码,所以转成md5码到服务器上去比较
obj = md5()
obj.update(groupID.encode("GB2312"))
bs = obj.hexdigest()
sql = "select * from groups where courseYear=" + str(courseYear) + " and sys.fn_varBinToHexStr(HASHBYTES('MD5',groupID))='0x" + bs + "'"
print(pd.read_sql(sql, connect).sort_values(by=['courseYear'],ascending=False))
  groupID  courseYear
0  老师的贝叶斯        2022
In [6]:
# 给注册的小组添加成员;
# 注意groupID的个数要和学号个数一致;
# 小组必须已经注册好;学号必须是班里同学的学号,否则无法添加;
groupMemDf = pd.DataFrame({'groupID':[groupID,groupID,groupID],
                           'stuID':['0000000000','0000000001','0000000002']
                          });
d_type=setdtypedict(groupMemDf)
groupMemDf.to_sql('groupMembers', engine, index=False, if_exists='append', dtype=d_type, chunksize=10)
In [7]:
# 不需要修改
# 查询添加小组成员信息的情况
sql = "select m.*,s.stuName,s.className from groupMembers m left outer join students s on m.stuID=s.stuID where sys.fn_varBinToHexStr(HASHBYTES('MD5',groupID))='0x" + bs + "';"
print(pd.read_sql(sql, connect).sort_values(by=['stuID'],ascending=True))
  groupID       stuID   stuName className
0  老师的贝叶斯  0000000000   teacher      管理学院
1  老师的贝叶斯  0000000001  teacherA   数学与统计学院
2  老师的贝叶斯  0000000002  teacherB      电信学院

第2步:读取数据

2.1 从数据库中读取数据
  • hotelReview 酒店评论表:涉及到6214条评论;3列,分别是ID,Label(1是好评,0是差评),Review。
  • hotelReviewTest 用于预测分类的酒店评论表:涉及到1552条数据;2列,分别是ID,Review
  • hotelReviewResults 答案表:用于提交最终的答案;4列,teamID, batch, ID, label
  • hotelReviewScoreSheetA 分数榜A 视图:用于大家查看在A榜提交数据的分数。
  • hotelReviewScoreSheetASummary 排行榜A 视图:用于查看A榜排名。
In [8]:
# 不修要修改
# 统计数据行数
sql = "select count(1) from hotelReview;"
cursor.execute(sql)   #执行sql语句
row = cursor.fetchone()  #读取查询结果,
print("hotelReview表的数据共%s行" % (row[0]))   #输出结果

sql = "select count(1) from hotelReviewTest;"
cursor.execute(sql)   #执行sql语句
row = cursor.fetchone()  #读取查询结果,
print("hotelReviewTest表的数据共%s行" % (row[0]))   #输出结果
hotelReview表的数据共6214行
hotelReviewTest表的数据共1552行
In [9]:
# 不需要修改
# 读取数据到hotelReview数据到dataframe
sql = "select * from hotelReview;"
dfReview = pd.read_sql(sql, connect)
print("\nhotelReview表的基本信息:")
print(dfReview.info())

print("\nhotelReview表的样例数据:")
print(dfReview.head(10))
hotelReview表的基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6214 entries, 0 to 6213
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   ID      6214 non-null   int64 
 1   label   6214 non-null   int64 
 2   review  6214 non-null   object
dtypes: int64(2), object(1)
memory usage: 145.8+ KB
None

hotelReview表的样例数据:
      ID  label                                             review
0  10001      0  携程订单上写明:“房型特点:一张1.3*2,另一张1.1*2米,无法加床全部房间有免费宽带”...
1  10002      1                交通方便,周边也热闹,房间小在香港那是自然的了,总的说来是物有所值了。
2  10003      0  酒店员工态度超级恶劣。特别是前台。餐厅没有接待客人就坐。最气愤的是话还没说完就把电话挂了。劝...
3  10004      1  入住的第一天晚上正巧停电停水,比较难过,但服务还算不错,房间隔音效果不太好,住在17层上居然...
4  10005      1  房间比较宽敞,很干净;后面是小区,比较安静,但是前面是垃圾场我昨天住的时候,特价房没有了,还...
5  10006      1                   不错,在普宁寺旁边,有特色。服务员态度特别好,很亲切,都穿藏服。
6  10007      0  房间装修比较旧,周边也没有休闲购物的地方,性价比不高。虽然说免费提供上网,但实际上网上不了,...
7  10008      0  酒店太老旧了。走在地板上都有震动的感觉。厕所内的手纸就一点点。220的价格还不包早餐。最可气...
8  10009      0  我一年中国上上下下跑好多次,这个酒店是我住过性价比最差的酒店。1.服务态度恶差,也许我去的时...
9  10010      1  "非常舒心的酒店,不大,很安静,很温馨,每间房的阳台上都有盛开的鲜花,房间里有很多可供浏览的...
In [10]:
# 不需要修改
# 读取数据到hotelReviewTest数据到dataframe
sql = "select * from hotelReviewTest;"
dfReviewTest = pd.read_sql(sql, connect)
print("\nhotelReviewTest表的基本信息:")
print(dfReviewTest.info())

print("\nhotelReviewTest表的样例数据:")
print(dfReviewTest.head(10))
hotelReviewTest表的基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1552 entries, 0 to 1551
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   ID      1552 non-null   int64 
 1   review  1552 non-null   object
dtypes: int64(1), object(1)
memory usage: 24.4+ KB
None

hotelReviewTest表的样例数据:
      ID                                             review
0  30008  普通游客旅馆还三星让我伤心店名好大奇差无比补充点评2006年12月8日:还说有地下车库谁敢下...
1  30009  总的来说很不错,环境很好,特别是早餐,很好,很有竞争力。我过年这几天综合比较几个四星级酒店的...
2  30018            天宇也就占了个位置还可以到光,内部设施和消耗品配备,实在是不怎么样,而且,很贵
3  30019                  位置不错,如果到火车东站和美国领事馆签证处都是走路的距离,很方便。
4  30028  没有住过这么差的2星级酒店:白色的床灯灯罩霉到发黑。浴缸锈到有5块斑点,就像是这次在涠洲岛上...
5  30029  "房间不错,地理位置也很好.性价比也相当了.如果是来欣赏天目湖的话确实很好的选择,但是离我的...
6  30038  房间很干净,打开窗口就能看见三塔,嘿嘿,连门票都省了。出门开车五分钟就能到沧海高尔夫,实在方...
7  30039  房间很干净,设施还行,家具稍微有些旧。商务间的楼层前台不错,不过清洁工很一般,住的时间比较长...
8  30048   名头特别响亮,不过设施可不怎么样,尤其是单人大床房,居然没有安静的房间。入住后只好更换为双人间。
9  30049                             "房间陈旧,服务差,设备也陈旧.垃圾酒店!"
In [11]:
# 不需要修改
# 查看用于提交答案的hotelReviewResults表
sql = "select * from hotelReviewResults;"
dfReviewResult = pd.read_sql(sql, connect)
print("\nhotelReviewResults表的基本信息:")
print(dfReviewResult.info())

print("\nhotelReviewResults表的样例数据:")
print(dfReviewResult.head(5))
hotelReviewResults表的基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1552 entries, 0 to 1551
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   teamID  1552 non-null   object
 1   batch   1552 non-null   int64 
 2   ID      1552 non-null   int64 
 3   label   1552 non-null   int64 
dtypes: int64(3), object(1)
memory usage: 48.6+ KB
None

hotelReviewResults表的样例数据:
   teamID  batch     ID  label
0  老师的及格线    100  30008      0
1  老师的及格线    100  30009      1
2  老师的及格线    100  30018      1
3  老师的及格线    100  30019      1
4  老师的及格线    100  30028      0
In [12]:
import csv
# dataframe中的数据存储到本地
# 实验数据不得外传,不得用于除了课程实验外的其它目的
dfReview.to_csv("data\\hotelReview.csv", sep='\t', encoding='utf-8', quoting=csv.QUOTE_NONE, index=False)
dfReviewTest.to_csv("data\\hotelReviewTest.csv", sep='\t', encoding='utf-8', quoting=csv.QUOTE_NONE, index=False)
2.2 从文件中读取数据
In [13]:
import pandas as pd
import numpy

# 读取本地csv文件到dataframe
dfReview = pd.read_csv("data\\hotelReview.csv", sep='\t', encoding='utf-8')
dfReviewTest = pd.read_csv("data\\hotelReviewTest.csv", sep='\t', encoding='utf-8')
display(dfReview.head(),dfReviewTest.head())
ID label review
0 10001 0 携程订单上写明:“房型特点:一张1.3*2,另一张1.1*2米,无法加床全部房间有免费宽带”...
1 10002 1 交通方便,周边也热闹,房间小在香港那是自然的了,总的说来是物有所值了。
2 10003 0 酒店员工态度超级恶劣。特别是前台。餐厅没有接待客人就坐。最气愤的是话还没说完就把电话挂了。劝...
3 10004 1 入住的第一天晚上正巧停电停水,比较难过,但服务还算不错,房间隔音效果不太好,住在17层上居然...
4 10005 1 房间比较宽敞,很干净;后面是小区,比较安静,但是前面是垃圾场我昨天住的时候,特价房没有了,还...
ID review
0 30008 普通游客旅馆还三星让我伤心店名好大奇差无比补充点评2006年12月8日:还说有地下车库谁敢下...
1 30009 总的来说很不错,环境很好,特别是早餐,很好,很有竞争力。我过年这几天综合比较几个四星级酒店的...
2 30018 天宇也就占了个位置还可以到光,内部设施和消耗品配备,实在是不怎么样,而且,很贵
3 30019 位置不错,如果到火车东站和美国领事馆签证处都是走路的距离,很方便。
4 30028 没有住过这么差的2星级酒店:白色的床灯灯罩霉到发黑。浴缸锈到有5块斑点,就像是这次在涠洲岛上...

第3步:计算指数并组织答案

In [14]:
# 分词和预处理
import jieba

# 停用词表
# 停用词可能会过滤掉情感词,比如 好 之类的
stoplist = list(pd.read_csv('data/停用词.txt', names = ['w'], sep = 'aaa', 
                        encoding = 'utf-8', engine='python').w)

# 去掉停用词的分词方法
def m_cut(intxt):
    return [ w for w in jieba.cut(intxt) 
            if w not in stoplist and len(w) > 1 ] 

# 分词
cuttxt = lambda x: " ".join(m_cut(x))
dfReview["cleantxt"] = dfReview.review.apply(cuttxt) 
dfReview.head()
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\yuewe\AppData\Local\Temp\jieba.cache
Loading model cost 1.308 seconds.
Prefix dict has been built successfully.
Out[14]:
ID label review cleantxt
0 10001 0 携程订单上写明:“房型特点:一张1.3*2,另一张1.1*2米,无法加床全部房间有免费宽带”... 携程 订单 写明 房型 一张 1.3 一张 1.1 加床 房间 免费 宽带 入住 见到 房间...
1 10002 1 交通方便,周边也热闹,房间小在香港那是自然的了,总的说来是物有所值了。 交通 周边 热闹 房间 香港 自然 物有所值
2 10003 0 酒店员工态度超级恶劣。特别是前台。餐厅没有接待客人就坐。最气愤的是话还没说完就把电话挂了。劝... 酒店 员工 态度 超级 恶劣 特别 前台 餐厅 接待客人 气愤 说完 电话 气死 交通 周围环境
3 10004 1 入住的第一天晚上正巧停电停水,比较难过,但服务还算不错,房间隔音效果不太好,住在17层上居然... 入住 第一天 晚上 停电 停水 难过 服务 不错 房间 隔音 效果 不太好 17 层上 窗户...
4 10005 1 房间比较宽敞,很干净;后面是小区,比较安静,但是前面是垃圾场我昨天住的时候,特价房没有了,还... 房间 宽敞 干净 小区 安静 垃圾场 昨天 特价 免费 升级 商务 188 价钱 太值 再住...
In [15]:
# 构建文档-词频矩阵
from sklearn.feature_extraction.text import CountVectorizer
countvec = CountVectorizer() 
wordmtx = countvec.fit_transform(dfReview.cleantxt)
# print(wordmtx)
wordmtx
Out[15]:
<6213x23303 sparse matrix of type '<class 'numpy.int64'>'
	with 163235 stored elements in Compressed Sparse Row format>
In [25]:
# 将数据集划分为 训练集和测试集
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(wordmtx, dfReview.label, 
    test_size = 0.3, random_state = 123)
In [26]:
# 朴素贝叶斯模型
from sklearn import naive_bayes
NBmodel = naive_bayes.MultinomialNB()
NBmodel.fit(x_train, y_train)
NBmodel.predict(x_test) #模型应用
Out[26]:
array([1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1,
       0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0,
       1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1,
       0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1,
       0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0,
       0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0,
       0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
       0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1,
       1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1,
       0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0,
       0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1,
       1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0,
       0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0,
       1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1,
       1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1,
       0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
       1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,
       0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
       0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
       0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,
       1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
       0, 0, 1, 1, 1, 0], dtype=int64)
In [27]:
# 预测准确率(给模型打分)

print('训练集:', NBmodel.score(x_train, y_train), 
      ',验证集:', NBmodel.score(x_test, y_test))
训练集: 0.9288141656233232 ,验证集: 0.8665594855305466
In [28]:
# 测试模型的有效性
# 将需要预测的文本转换为和建模时格式完全对应的d2m矩阵格式,随后即可进行预测。

string = "真是个垃圾酒店,又贵又不好"
words = " ".join(m_cut(string))
words_vecs = countvec.transform([words]) # countVec存储了数据转换模式;
words_vecs
print(NBmodel.predict(words_vecs))
[0]
In [29]:
# 应用模型开展测试数据的计算
# 分词
dfReviewTest["cleanTxt"] = dfReviewTest.review.astype(str).apply(cuttxt)
# 转文档词频矩阵
test_vecs = countvec.transform(dfReviewTest.cleanTxt)
# 预测结果
dfReviewTest["predict_label"] = NBmodel.predict(test_vecs)
# 查看预测结果
print(dfReviewTest)
         ID                                             review  \
0     30008  普通游客旅馆还三星让我伤心店名好大奇差无比补充点评2006年12月8日:还说有地下车库谁敢下...   
1     30009  总的来说很不错,环境很好,特别是早餐,很好,很有竞争力。我过年这几天综合比较几个四星级酒店的...   
2     30018            天宇也就占了个位置还可以到光,内部设施和消耗品配备,实在是不怎么样,而且,很贵   
3     30019                  位置不错,如果到火车东站和美国领事馆签证处都是走路的距离,很方便。   
4     30028  没有住过这么差的2星级酒店:白色的床灯灯罩霉到发黑。浴缸锈到有5块斑点,就像是这次在涠洲岛上...   
...     ...                                                ...   
1547  37739                            不错的饭店,饭菜做得也不错,来潍坊这里值得住住   
1548  37748      环境不错,服务也很热心,我定的是一个豪华大床间,房间有点偏小,装修还说得过去,总之还是对得   
1549  37749  休假时一个人去的,房间很干净整洁,家居装饰也很有古意,住那的时候正好老板的哥哥(客栈的设计者...   
1550  37758  这里的房间是比较舒适,只是地理位置不如解放杯和江北了,也就算了吧,这也不算hotel的错,只...   
1551  37759                  房间很大,环境不错。云台山风景也好的。就是当心遇上非正规导游的:(   

                                               cleanTxt  predict_label  
0     游客 旅馆 三星 伤心 店名 好大 奇差 无比 补充 点评 2006 12 地下 车库 狭小...              0  
1              不错 环境 特别 早餐 竞争力 过年 几天 综合 几个 四星级 酒店 早餐 他家              1  
2                            天宇 位置 内部 设施 消耗品 配备 实在 不怎么样              1  
3                          位置 不错 火车 东站 美国 领事馆 签证处 走路 距离              1  
4     星级 酒店 白色 床灯 灯罩 霉到 发黑 浴缸 锈到 斑点 像是 岛上 巨型 蜘蛛 趴在 可...              0  
...                                                 ...            ...  
1547                                  不错 饭店 饭菜 不错 潍坊 值得              1  
1548              环境 不错 服务 热心 我定 一个 豪华 大床 房间 偏小 装修 说得过去              1  
1549  休假 一个 人去 房间 干净 整洁 家居装饰 古意 正好 老板 哥哥 客栈 设计者 一个 c...              1  
1550  房间 舒适 地理位置 解放 江北 不算 hotel 服务 大堂 永远 冷漠 服务生 缺少 微...              1  
1551                    房间 很大 环境 不错 云台山 风景 当心 遇上 非正规 导游              1  

[1552 rows x 4 columns]
In [31]:
# 构造输出结果
# 输出结果的格式:teamID, batchID, ID, label
batch = 101
dfResult = dfReviewTest[['ID','predict_label']]
dfResult.insert(0,'teamID',groupID)
dfResult.insert(1,'batch',batch)
dfResult.rename(columns={'predict_label':'label'},inplace=True)
print(dfResult)
      teamID  batch     ID  label
0     老师的贝叶斯    101  30008      0
1     老师的贝叶斯    101  30009      1
2     老师的贝叶斯    101  30018      1
3     老师的贝叶斯    101  30019      1
4     老师的贝叶斯    101  30028      0
...      ...    ...    ...    ...
1547  老师的贝叶斯    101  37739      1
1548  老师的贝叶斯    101  37748      1
1549  老师的贝叶斯    101  37749      1
1550  老师的贝叶斯    101  37758      1
1551  老师的贝叶斯    101  37759      1

[1552 rows x 4 columns]

第4步:上传答案并查看排名

  • 上传答案到hotelReviewResults表
    • 提交的答案必须是4列:组名teamID,批次号batch,ID,label
  • 通过hotelReviewScoreSheetA查看A榜排名
In [32]:
# 不需要修改
# 向数据库上传答案,即上述dfResult
d_type=setdtypedict(dfResult)
dfResult.to_sql('hotelReviewResults', engine, index=False, if_exists='append', dtype=d_type, chunksize=1000)
In [33]:
# 不需要修改
# 查看A排行榜 hotelReviewScoreSheetA是视图
# 最终排行榜是B榜,是全部对象的结果
sql = "select * from hotelReviewScoreSheetA where sys.fn_varBinToHexStr(HASHBYTES('MD5',teamID))='0x" + bs + "';"
print(pd.read_sql(sql, connect).sort_values(by=['F1Score'],ascending=False))
   teamID  batch  precision  recall  accuracy  F1Score
1  老师的贝叶斯    101      0.865   0.936     0.856    0.899
0  老师的贝叶斯    100      0.856   0.938     0.849    0.895
In [34]:
# 不需要修改
# 进一步汇总的结果视图 hotelReviewScoreSheetASummary,供大家快速查看排名情况
sql = "select A.* from hotelReviewScoreSheetASummary A left outer join groups G on A.teamID=G.groupID where courseYear=" + str(courseYear)
print(pd.read_sql(sql, connect).sort_values(by=['F1Score'],ascending=False))
   teamID  batch  precision  recall  accuracy  F1Score
0  老师的贝叶斯    101      0.865   0.936     0.856    0.899
1  老师的及格线    100      0.856   0.938     0.849    0.895

第5步:关闭数据库连接

  • 一定要记得关闭数据库连接
In [35]:
# 不需要修改
# 关闭数据库连接
engine.dispose
cursor.close()   
connect.close()

2. 竞赛的组织、考核与评价

  • 竞赛的组织

    • 2-3人一组,起一个组名(前后保持一致),按组参加竞赛、提交成绩
    • 在截止时间前提交结果
    • 准备简单的PPT,给大家分享设计思路及计算结果
    • 本次竞赛占期末成绩5%(5分)
  • 打分方式

    • 以B榜为依据,凡是按时提交结果,超过Teacher的Benchmark,且PPT认真分享,均有3分(不满足1条扣1分)
    • 竞赛成绩前1-3名得+2分
    • 竞赛成绩前4-6名得+1分
    • 根据大家汇报的情况,老师选5组汇报较好/思路清奇,各奖励1分



谢谢大家!