消费者洞察人工智能编码平台----项目管理与开放题编码设计与实现开题报告
2020-04-10 14:38:56
1. 研究目的与意义(文献综述)
背景资料:
数据显示,在市场调研领域中,专项研究个案的数量每年在不断扩张,由此开放题的处理量也水涨船高;而随着人工成本的逐年攀升,通货膨胀等因素,开放题数据处理的成本也在不断上涨。因此,寻找智能化方式处理海量开放题数据变得迫在眉睫。
目的及意义:
2. 研究的基本内容与方案
基本内容与目标:
-
通过阅读相关文献,研究分析多种问卷编码方法,测试对比选取合适的算法来分析调查结果。
-
整合现有的信息资源,提供开放而标准的信息交换协议和通道,以先进的技术方法提供市场调研数据处理的支撑。
-
以实现海量数据的自动化、智能化、规范化为目标,设计出一套功能齐全,可扩展性较强,易用和稳定的市场调研开放题自动处理系统平台,并测试效果。
拟采用的技术方案及措施:
(1) 功能结构分析
1) 功能结构图
本系统包含2个一级、13个二级、18个三级和8个四级功能模块,如图1所示:
图1 功能结构图
2) 功能模块分析
可将本系统功能分为项目管理和编码管理两部分:
l 项目管理
项目管理主要实现系统中项目的创建、数据文件的上传、导入和导出等操作,可将其分为新建、对接、上传、修改、删除、还原、备份、搜索、导出、移出、完成十个子模块。
a) 项目新建:新建一个项目,需要存入项目标识ID,项目名称,客户,行业,项目类型,参考码表等信息。
b) 项目对接:对接一个项目,用户根据项目标识ID选择其中一个可对接项目。
c) 项目上传:上传与项目相关的数据文件。
d) 项目修改:修改项目的品类。非项目的建立者只能修改项目的品类信息,项目的建立者可以修改项目的名称,客户,行业和品类信息等。
e) 项目删除:删除所选项目。
f) 项目备份:备份所选项目,以便下次进行还原。
g) 项目还原:还原已经备份的项目。
h) 项目搜索:项目搜索的依据有项目ID、项目名称、创建者、创建时间、参考项目、项目类型、以及完成状态。
i) 项目导出:将所选项目的信息导出为选择的文件类型。导出的序列化文件是对整个项目数据的封装。
j) 项目移出:将选中的项目移出系统,除了项目管理界面中的项目信息之外所有编码信息都将被移出系统,同时将该条项目信息设置为不可选中(如将项目信息颜色变成灰色)。对于移出的项目,如果用户需要移入重新处理,则需要先搜索该项目即定位到该项目(因为已经变灰,无法直接选择该项目),然后再利用项目还原功能移入此项目。
k) 项目完成:将该项目的状态设置为“完成”。状态为“完成”的项目,就不再能进行任何操作(除了能做移除操作外),除非重新设置为“未完成”状态。
l 编码管理
编码管理是整个系统的核心模块,主要实现开放题的自动处理。对于开放题的处理,分为项目-码表、编码两个子模块。
项目-码表模块主要实现项目对应码表的相关操作,分为新建码表、码表归入、编辑码表、码表搜索、码表移出、删除码表、显示编码、导出码表和帮助九个子模块。
a) 新建码表:从基础码表中选择1张或多张基础码表构成一个项目码表,也可以不选择基础码表,完成码表的建立,即创建项目所需要的码表。
b) 码表归入:将一个未建立码表的问题归入到一个选择好的码表中。
c) 编辑码表:主要是完成码表的增、删、查、改、合并、拆分、移动、隐藏等操作。
d) 码表搜索:在打开一个码表的前提下,输入要搜索的关键字,可查询码表条目。显示方式分为高亮显示和过滤显示两种,高亮显示只会将关键字加上背景色,过滤显示会在关键字加上背景色的同时隐藏与关键字无关的节点。
e) 码表移出:在选中一个问题并且打开对应码表的前提下,此功能可将该问题移出码表。
f) 删除码表:删除选中的码表。
g) 显示编码:将隐藏的条目显示出来。
h) 导出码表:按规定格式导出码表。
i) 帮助:用于显示帮助信息。
编码模块主要实现在码表中编码的相关操作,主要包括语义编码、非语义编码、编码回退、删除编码、清空ALL、样本定位、建立关联、样本搜索和样本导出九个子模块。
a) 语义编码:进行样本和编码的自然语义编码处理。可以选择编码范围是全部样本或者是已标记的样本。语义编码的阈值表示匹配精确程度,分为高、中、低三个等级,阈值越高匹配程度越精确,匹配结果越少,反之匹配结果越多,但是耗时也较多。
b) 非语义编码:进行样本和编码的关键字匹配或完全匹配。可以选择是否关联题目和匹配类型:模糊匹配是进行关键字的模糊匹配;精确匹配是进行完全匹配。
c) 编码回退:进行语义编码或者非语义编码之后,此功能可以将编码结果回退至进行前一次语义编码或非语义编码的状态。未进行过语义编码或者非语义编码的情况下无法回退。
d) 删除编码:可以删除某一个选定的样本的任意一个编码,而且会删除所有同类的编码,不管这些编码是否属于同一个或不同的样本。
e) 清空ALL:删除本题目所有的编码结果。清空之后,即会删除语义编码、非语义编码和操作人员的手动编码结果。
f) 样本定位:标记某一个样本回答,定位成功后会在定位的样本后面添加一个红色锚点。当再次进入到处理该题目的样本时,将直接显示到上次定位样本的地方,相当于书签的功能。
g) 建立关联:将某个开放题与其他题目关联处理。建立关联有两个作用,一是用作过滤条件,在显示该题的题目和选项的关联栏中,选择相应选项,此功能可以在样本栏显示那些选择该选项的样本,二是用作建立码表,此时会将被关联题目的选项,用作当前题目的码表。
h) 样本搜索:用于搜索满足条件的样本。
i) 样本导出:将打开问题的样本导出至excel表格,方便存档。
(2) 功能结构设计与实现
l 项目管理
项目管理主要实现系统中项目的创建、数据文件的上传、导入和导出等操作,其中核心功能模块为文件上传与文件导出模块。
1) 文件上传模块
在进行网页系统开发时,经常需要处理大量的数据,在网页上处理数据往往受到网速的限制。对于需要打印的数据,如果固定格式可以通过程序设定,但是对于需要经常变换格式的情况就很难实现,因此可以使用ASP.NET技术实现网站数据与Excel表格的导入与导出的基本方法,即先实现上传文件,然后上传文件成功后再将数据读入内存数据库[13]。
ASP.NET访问数据库,主要是利用B/S模式三层架构,通过数据访问组件ADO.NET达到数据库访问的目的,主要分为有连接和无连接两种。实际应用中当客户端浏览器发出HTTP请求后,web服务器会接受该请求,并完成.aspx页面的查询,当找到浏览器请求的页面后,执行其隐藏代码,其中基于VB.NET隐藏代码扩展名为.aspx.vb,基于C#的隐藏代码扩展名为.aspx.cs,最后将生成的静态页面发送并显示到客户端浏览器[15]。
文件上传模块的实现主要涉及到页面和数据库设计、后台程序的编写两方面技术。考虑到系统开发的高效性与稳定性,目前拟采用第三方开源免费组件RadUpload来解决大文件上传问题,由文献[3]可知其具有如下特点:
#216; 适合ASP.NET开发环境要求;
#216; 该组件和 ASP.NET 内置的 File Upload 控件进行了很好的融合,其属性和方法可互通,方便学习使用;
#216; 对上传文件的大小没有限制,可以上传超大文件;
#216; 带有可视化的上传进度条功能用户体验度高;
#216; 开源免费使用,便于二次开发。
此外为了达到更好的用户体验,可以考虑使用将文件拆分成N块进行批量上传的异步上传方法。即将待传输文件在发送端(也称为客户端)划分为多个块,使用多线程同时将块发送给目标服务器;服务器端的服务程序监视数据传输请求,每当接收到新的请求时,创建新的线程,发送与客户端对应的线程,接收数据,记录数据传输过程[4]。
最后针对固定导入数据中存在的弊端,以方便用户操作和增强导入模块的可重用性、可移植性为目标,在分析设计导入模块时要解决的主要问题及可利用的相关技术基础上,可以设计可让用户自行选择Excel文件中的任意表、任意字段并导入进数据库表的通用导入数据模块的设计方法[14]。2) 文件导出模块
数据导出是信息管理系统常用的功能之一。不同的单位对数据报表的格式、内容的要求也各不同。Excel因为功能强大、简单易用,能够进行多种统计和分析,成为企业制作数据报表和数据交换最常用的工具[12]。本系统拟在ASP.NET环境下导出Excel文件。
ASP.NET提供了几种文件下载的解决方案,包括WriteFile方法、BinaryWrite方法流式传送文件和TransferFile方法。其中WriteFile方法和BinaryWrite方法都是需要在内存中缓冲文件,然后写入HTTP响应输出流,这样对于下载大文件时,会占用大量服务器内存资源,容易使服务器受到拒绝服务攻击。而TransferFile方法则不在内存中缓冲文件,直接写入HTTP响应输出流,但是TransferFile方法适用于400M以上的文件下载。因此可以采用分块下载来适用各种文件大小的下载,也就是每次从服务器端读取固定大小的数据,在缓冲区处理后发送给客户端,这样就保证了服务器内存资源不被大量占用。l 编码管理
编码管理是整个系统的核心模块,主要实现开放题的自动处理,分为项目-码表、编码两个子模块,项目-码表、编码两个子模块中又包含若干子模块。针对开放题的处理思路:
a) 首先分别对码表和样本进行切词处理;
b) 利用基于余弦相似度的匹配方法和基于语义的相似度计算方法分别计算码表中各条编码与样本的词语相似度和句子相似度,并综合两者获得总体相似度。
在语义相似度的研究中,最常采用的方法是基于词汇的语义分析,因为很难让计算机从整句话的角度理解表达的含义。在词汇的语义分析过程中,词典知识库大多采用词语解释的方式,例如“程序”和“程序员”两个词汇,两者之间具有较高相关性,我们可以根据设定的词汇解释原则,对这两个词汇进一步划分为更小的粒度,在此基础上进行相似度的计算[7]。
c) 对码表中各条编码与样本的总体相似度按从大到小排序,根据阈值,取前n项匹配结果输出。
整个处理流程如图2所示:
图2 开放题处理流程示意图
(3) 数据表设计
l 项目管理
1) 项目管理主要负责项目信息的增添与修改,因此首先需要存储有关的项目信息的数据表。
表1 项目信息表
表名 | ProjectInfo_T | 项目信息表 | ||||
说明 | 此表记录系统中所有项目的基本信息 | |||||
主键 | ProjectID | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
ProjectID | INT | 否 | 项目ID |
| PK-自动生成,从1开始 | |
CategoryID | VARCHAR(4) |
| 品类编码 |
| FK(CategoryInfo_T) | |
LocalID | VARCHAR(50) |
| 项目的LocalID |
| LocalID和ONLNum联合标识一个项目,对应workbench中的chrLocalNumber
| |
ProjectName | VARCHAR(100) |
| 项目名称 |
| 对应workbench中的chrName
| |
ONLNum | VARCHAR(50) |
| 项目的OnlineNum |
| LocalID和ONLNum联合标识一个项目,对应workbench中的chrOnlineNumber | |
Client | VARCHAR(100) |
| 客户 |
| 对应workbench中的chrClient
| |
Vertical | VARCHAR(100) |
| 行业 |
| 对应workbench中的chrVertical | |
Tracking | CHAR(1) |
| 是否tracking | 0 | 0-否(adhoc),1-TRACKING1第一期,2-TRACKIING项目,非第一期,0,1的项目,处理方式一致,可以继承参考项目,但是继承的码表可以修改 | |
ProjectRef | INT |
| 参考项目的项目ID | 0 | 如果Tracking=1,则此不能为0 | |
Creator | VARCHAR(100) |
| 创建人的用户名 |
| FK(UserInfo_T) | |
CreateDate | Smalldatetime |
| 项目创建时间 |
| 年月日 | |
Status | BIT(1) |
| 项目是否编码完成可以导出 | 0 | 0-未完成,1-完成 | |
IsExport | BIT(1) | 否 | 项目是否已经导出 | 0 | 0-未移出,1-已移出 | |
IsUpload | BIT(1) | 否 | 项目是否已经上传 | 0 | 0-未上传,1-已上传 | |
NumID |
INT | 否 | Workbench中的项目ID | -1 | 可以唯一标识一个项目,对应Workbanch中的NumID,-1表示该项目为新建项目 | |
PIC | Varchar(100) | 否 | Workbench中的PIC,为项目创建者的邮箱 |
| 对应Workbanch中的PIC | |
RlateInfo | varchar(2000) |
| 记录项目“非语义编码”中的关联的题目信息以及当前题目样本的排序方式 |
| eg:Q1#Q2@1; 表示Q1进行非语义编码时关联了Q2,1-Q1为字典排序;0-Q1为ID排序 | |
TotalVerbatim | int |
| 所有半开题和开放题的用户回答条数的总和 |
|
| |
TotalWordCount |
Int |
| 所有半开题和开放题的用户回答字数的总和 |
|
| |
ProjectRefDetail | varchar(100) |
| 参考项目的Local# ONL# |
|
| |
2) 由于不同的项目可能对应不同的品类信息,所以还需要设计品类信息表。
表2 品类信息表
表名 | CategoryInfo_T | 品类信息表 | ||||
说明 | 此表记录系统中品类信息 | |||||
主键 | CategoryID | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
CategoryID | VARCHAR(4) | 否 | 品类编码 |
| 自动生成,ZY01,ZY02,首先自动生成一个记录描述通用品类,该字段为TY01,其Description为“通用” | |
Description | VARCHAR(100) |
| 品类名称 |
|
| |
Industry | VARCHAR(100) |
| 行业名称 |
|
| |
3) 用户信息表
表3 用户信息表
表名 | UserInfo_T | 用户信息表 | ||||
说明 | 此表记录角色与用户的关系 | |||||
主键 | EmployeeNum | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
UserNum | VARCHAR (30) | 否 | 用户名 |
| 需要在添加时自动识别不可重名 | |
UserName | VARCHAR(100) |
| 真实姓名 |
|
| |
UserState | VARCHAR (1) |
| 用户状态 |
| 0 暂停帐号 1帐号正常 | |
Password | VARCHAR (32) |
| 加密的用户密码 |
| MD5加密 | |
| VARCHAR(100) |
| EMAIL地址 |
|
| |
RoleNum | VARCHAR(2) |
| 角色编号 |
| FK(RoleInfo_T) 01:系统管理员 02:编码人员 | |
4) 角色信息表
表4 角色信息表
表名 | RoleInfo_T | 角色信息表 | ||||
说明 | 此表记录机构信息 | |||||
主键 | RoleNum ModeleID | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
RoleNum | VARCHAR(2) | 否 | 角色编号 |
| PK 01:系统管理员 02:编码人员
| |
RoleName | VARCHAR(100) |
| 角色名称 |
| 01:系统管理员 02:编码人员 | |
ModuleID | INT |
| 模块ID | 否 | ModuleID INT(4) UNSIGNED 否 模块ID 否 PK-自动生成 | |
5) 模块信息表
表5 模块信息表
表名 | ModuleInfo_T | 模块操作信息表 | ||||
说明 | 表示系统中模块与其可操作角色之间的对应关系 | |||||
主键 | ModuleID | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
ModuleID | INT | 否 | 模块ID | 否 | PK-自动生成 | |
FatherModuleID | INT(4) |
| 父模块ID |
| 如果本身是一级模块,则其父模块ID为-1 | |
ModuleName | VARCHAR(50) |
| 模块名称 |
|
| |
RoleNum | VARCHAR(2) |
| 可操作角色编号 |
| FK(RoleInfo_T)
表示负责操作此模块角色,多个角色之间用;分开 | |
ModulePath | VARCHAR(100) |
| 模块路径 |
|
| |
l 编码管理
1) 开放题编码管理部分涉及到码表信息以及编码结果的存储,因此首先需要设计项目码表。
表6 项目码表
表名 | Cf_T | 它是一个项目码表的模板表,每次上传一个项目数据表后,就按其项目ID,自动构建与此表结构一致的表,用来记录该项目的码表内容, 例如:对于项目ID为1的项目,建立其项目的码表为1_Cf_T | ||||
说明 | 此表记录对应项目的码表内容, | |||||
主键 | CodeID | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
CodeID | INT | 否 | 编码ID |
| PK,从1开始 | |
CodeNum | VARCHAR(10) |
| 编码号 |
| FK: Cf_Base_T-CodeID或 Cf_Category_T-CodeID | |
CfName | VARCHAR(1000) | 否 | 码表名称 |
| 由CF 题号组成, FK(Project_Cf_T中Cf_Name) | |
FatherID | INT | 否 | 该条目的父节点编号 | 0 | -1—表示为细部码表的根节点,细部码表的根节点的父节点为-1 | |
Leaf | BIT(1) |
| 是否为叶子 | 0 | 1-是叶子节点 | |
ReadOnly | BIT(1) |
| 是否只读 | 0 | 1-只读 | |
Description | NVARCHAR(50) |
| 编码描述 |
|
| |
RefAns | NVARCHAR(1000) |
| REFERENCEANSWER,参考描述 |
|
| |
SerialNum | smallINT |
| 全局顺序号 |
| 所有节点都有,从1开始,连续 | |
SerialNo | smallINT |
| 顺序号 |
| 只有叶子节点才有 | |
Hidden | BIT(1) |
| 是否隐藏 | 0 | 1-隐藏,表示不参与编码 | |
Compiled | BIT(1) |
| 是否编译过 | 0 | 只对叶子节点有效,0—没有编译,1-已经编译过了,即进行了关键词提取,任何编辑操作,都需要将相应的编码项该位置为0,而SUBNET的编辑操作,则将需要对其相应叶子结点的该位置为0,除非其2代后都不是叶子结点 | |
IsEdit | BIT |
| 是否修改过 | 0 | 0—未修改;1--修改过 | |
KeyWords | VARCHAR(1500) |
| 关键词汇总 |
| 从Description 和RefAns,以及其上2级父辈中提取的关键字 | |
IgnoreCodeNumSet | Varchar(1000) |
| 针对链接半开题做codeframe的码表,新增扣时需要跳过的code集合 | NULL | NULL—不是链接的扣 非空—是链接的扣(建立关联封闭题Q1,Q1有1-5固定扣,其中4、5有对应的other,则改字段值为“1,2,3,@4,@5”) | |
Color | Int | 否 | 码表条目的颜色 |
| 1-黑色 2-红 3-绿 4-黄 等等 | |
Reserved | Varchar(300) |
| 预留 |
|
| |
Statistic | Varchar(1000) |
| 记录将来统计每条码的计数 |
|
| |
2) 项目—码表关系表
表7 项目—码表关系表
表名 | Project_Cf_T | 项目-码表关系表 | ||||
说明 | 此表记录系统中每个项目对应的码表信息 | |||||
主键 | ProjectID Cf _Name | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
ProjectID | INT | 否 | 项目ID |
| FK(ProjectInfo_T) | |
Cf _Name | VARCHAR(1000) | 否 | 码表表名称 |
| 由CF 题号组成,如CFQ1Q2,之所以定义这么长是因为可能需要用VARIABLE ID作题号 | |
Tracking | CHAR(1) | 否 | 是否tracking | 0 | 0-否,2-TRACKIING表示继承的码表 | |
3) 编码结果表
表8 编码结果表
表名 | ProjectID_CodingResult_T | 它是一个项目编码结果表的模板表,每次上传一个项目的三个数据表后,就按其项目ID,自动构建与此表结构一致的表,用来记录该项目的编码结果内容, 例如:对于项目ID为1的项目,建立其项目的编码结果表为1_CodingResult_T | ||||
说明 | 此表记录开放题的编码结果 | |||||
主键 | QuestionID Variable ID Responseid | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
Variable ID | VARCHAR(500) |
| 题号子域 |
|
| |
responseid | INT |
| 样本编号 |
| 与开放题-样本表对应 | |
CodingResult | VARCHAR(200) |
| 编码结果 |
| 编码之间用;分开,编码用项目码表中的CodeID | |
Complete | BIT(1) |
| 是否提交 | 0 | 1-该编码结果已经提交,不可随意改动了 | |
Marked | BIT(1) |
| 是否标注 | 0 | 0- 没有标注 1- 标注了 注意:本表中Question ID Variable ID决定的某题中,最多只有一个样本是做了标注的,以便用户查找,在做下一个标注时,需要取消上一个标注 | |
BackTracking | VARCHAR(200) |
| 上一语义编码的结果 |
|
| |
Locate | BIT(1) |
| 是否定位 | 0 | 0未定位,1-定位了 | |
4) 细部码表名
表9 细部码表名
表名 | Cf_Category_T | 细部码表名 | ||||
说明 | 此表记录系统中细部码表名称(主要保存表名和所属品类信息,树中根节点) | |||||
主键 | CodeID | |||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 | |
CodeID | VARCHAR(10) | 否 | 细部码表ID |
| PK—自动生成,例如,C000000001,C000000002 | |
CategoryID | VARCHAR(4) | 否 | 品类编码 |
| FK (CategoryInfo_T) | |
FatherID | VARCHAR(10) | 否 | 该条目的父节点编号 |
| -1(保留字段) | |
Leaf | BIT(1) |
|
| 0 | 0(保留字段) | |
Description | VARCHAR(50) |
| 编码描述,即表名 |
| 细部码表名,例如:性能 | |
TreeID | int |
| 树的标识 |
|
| |
SerialNum | int |
| 编号 |
| 0(保留字段) | |
5) 细部码表内容
表10 细部码表内容
表名 | Cf_Base_T | 细部码表(非根节点) | |||
说明 | 此表记录系统中的细部码表非根节点的所有节点 | ||||
主键 | CodeID | ||||
字段名称 | 数据类型 | 是否可空 | 字段说明 | 缺省值 | 备注 |
CodeID | VARCHAR(10) | 否 | 条目ID |
| PK—自动生成,按B000000001,B000000002,自动增长 |
FatherID | VARCHAR(10) | 否 | 该条目的父节点编号 |
| 父节点编号 |
Leaf | BIT(1) |
|
| 0 | 1-是叶子节点 |
Description | NVARCHAR(50) |
| 编码描述 |
|
|
RefAns | NVARCHAR(1000) |
| REFERENCE ANSWER |
|
|
Modified |
BIT(1) |
|
|
0 | 只对叶子节点有效,0—没有编译,1-已经编译过了,即进行了关键词提取,任何编辑操作,都需要将相应的编码项该位置为0,而SUBNET的编辑操作,则将需要对其相应叶子结点的该位置为0,除非其2代后都不是叶子结点 |
KeyWords |
VARCHAR(1500) |
|
|
| 从Description 和RefAns,以及其上2级父辈中提取的关键字 |
TreeID | int |
| 树的标识 |
| 从1开始,以后在最大值的基础上加1 |
SerialNum | int |
| 全局顺序号 |
| 所有节点都有,从1开始,连续 |
3. 研究计划与安排
(1) 2018/1/22—2018/2/15:明确选题,查阅相关文献;
(2) 2018/2/16—2018/2/28:进一步阅读文献,外文翻译,分析和总结,撰写开题报告;
(3) 2018/2/28—2018/4/30:系统架构,系统设计与开发(或算法研究与设计)、系统测试、分析、比较与完善;
4. 参考文献(12篇以上)
4.阅读的参考文献不少于15篇(其中近五年外文文献不少于3篇)
[1] 曹洁冰.读者问卷调查中选择题的简易编码设计和数据分析[j].上海高校图书情报工作研究,2007 (2) :55-57
[2] 夏雪刚.基于多线程文件传输关键技术研究与实现[j].电脑知识与技术,2016,12(21):48-50