智能阅读模型的构建(第六届泰迪杯C题)

本文介绍了构建智能阅读模型的两种方法:TFC-ICF改进的TF-IDF模型和基于命名实体识别及角色标注的分类方法。TFC-ICF考虑了问题和答案的整体匹配,而命名实体识别方法则根据问题类型(地点、人名、时间)对答案进行分类并打标签。通过这两种方法的结合,最终得出答案的得分并进行阈值判断。
摘要由CSDN通过智能技术生成

项目描述:

构建智能阅读模型主要通过两个方法来实现,第一个是TF-IDF的变种——TFC-ICF,TFC-ICF较于TF-IDF是将一个问题的所有答案看成一个整体,类比于TF-IDF文本分类的文件夹,问题的每一个回答类比于TF-IDF的文件夹里的每个文档。TFC是每个词所在句子的频率,叫类词频,ICF类比于逆文本率,叫倒类频率。作为衡量每个词在所有句子中的一个重要程度。利用sklearn里面的tfidfvectorizer先提取一个问题所对应的所有回答的特征词向量,用这个特征词向量,去和所有备选答案进行匹配和计算,最后得到一个TF-IDF值的矩阵,这个矩阵的行数是问题对应的备选答案的个数,列数就是特征词向量里特征词的个数。当对答案进行0、1判别时,先把问题分词,将这些词与每一句备选答案进行匹配,并把匹配到的词的TFC-ICF的权值提取出来。一个回答里匹配到几个词就提取几个权值,再把这些权值相加。这个相加的值作为该回答的得分。在下一步,设置阈值为0.31,哪句答案的得分大于等于0.31,这句答案的label判别为1,反之就判别为0。

第二个方法,首先构建了一个问题分类的特征词表,把问题分为地点类,人名类,时间类、未知类。利用pyltp库,对每个问题对应的所有答案,进行分词、词性标注、命名实体识别、句法依存分析、语义角色标注。流程就是:先将问题分词之后,用前三种问题的特征词向量判断问题属于这三种的哪一种,没有匹配到就属于第四种未知类,未知类的结果用第一种方法得到的结果来补充判断。问题分类之后,如果判断为地点类,就把答案的命名实体标注向量用re.match(‘S-Ns$’,word)判断是否有地点的命名实体,有判断label为1,无判断label为0;如果问题为人名类,把答案的命名实体向量用re.match(‘S-Nh$’,word)判断是否有人名的命名实体,有判断label为1,无判断label为0;如果判断问题为时间类,就把答案的语义标注向量用re.match(‘TMP$’,word)判断是否含有时间语义的词语,有判断label为1,无就判断label为0。

最后将上述两种方法分别得到的每个passage_id对应的label的值相加(这里选取第一种方法得到的label结果是通过设置阈值0.31进行判别后的, 其label值是0,1标记的),对每两个相加得到的值判断,大于等于1的值end_label标位1,小于1的值end_label标为0。


这个比赛因为组队的两个小伙伴临时有事(准备托福雅思啥的)前期没有参与进来,所以我 可以很自信得说:这比赛除了最后的文档编写从构思到代码实现全是我这个组长完成的。最后获得了一个三等奖,虽然有很多不甘心,因为它是按照参赛人数的比例来排序评奖,c题参赛的人数相对来说最少。

 


排序模型的代码:

import json
import jieba
import pandas as pd
import numpy as np
import os
import codecs
import sys
import re
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix#导入计算混淆矩阵的库
from imp import reload 
reload(sys)
from tqdm import tqdm
from sklearn.feature_extraction.text import TfidfVectorizer


s = codecs.open('longwang.txt','r',encoding = 'utf-16')


def clean(text):
    #text = re.sub('[0-9]{2,}','',text)#消除两位以上的数字
    #text= re.sub('(?:(?:\d+,?)+(?:\.?\d+)?)','',text)#消除数字
    text = text.replace(' ','')#消除空格
    #text = re.sub('http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+','',text)#消除网页链接
    text = re.sub('[a-zA-Z]','',text)#消除英文字母
    words  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值