1、概述

1.1关键词广告与竞争性营销

关键词广告(keyword)是一种文字链接型网络广告,通过对文字进行超级链接,让感兴趣的网民点击进入公司网站、网页或公司其它相关网页,实现广告目的。链接的关键词既可以是关键词,也可以是语句。
        竞争性营销:在营销管理过程中,管理者不仅要考虑顾客的需要,还要考虑企业在本行业中的竞争地位。企业的营销战略和战术必须从自己的竞争实力地位出发,并根据自己同竞争者实力对比的变化,随时加以调整,使之与自己的竞争地位相匹配。由于现代市场营销中竞争的重要性,市场营销不仅包括“产品、价格、促销、渠道”四方面因素,还应让“竞争”成为现代市场营销的第五大因素。竞争意识要在企业的营销决策、营销规划、营销组织中充分体现出来,在营销实践中也要采取有效的策略开展竞争,不断提高企业竞争能力。

1.2关键词推荐方法

所有关键词全集:U
广告主的种子关键词:s(s∈U)
推荐高相关性的关键词:aM(aM∈U)
(1)相关分析法:计算词与词之间的相关程度。
关联相关性、同义词相关性、竞争相关性等
分两类:互补性和竞争性
例如:虎牙—直播
虎牙—斗鱼
(2)方法:基于用户反馈方法、基于文本分析法、基于语义知识库,统计分析法等
(3)目的:通过了解用户搜索意图来获得KM

1.3竞争性关键词与度量方法

通过aM来寻找相应的竞争关键词kM,构建相应的概率模型来计算关键词之间的竞争度。
        种子关键词s与任意(竞争)关键词k,存在一个中介关键词a,其与s与k都存在联合查询,即sa与ka。
        度量了在所有查询ka的搜索量占a搜索量中除去sa搜索量的比例,反映了在关键词a的维度上,用户不搜索s则搜索k的概率。

1.4设计与实现的技术线路

(1)操作系统:Windows 10 家庭中文版。
(2)软件环境:NetBeans IDE 8.2 + JDK 1.8 + word 1.3
        NetBeans是Sun公司(2009年被甲骨文收购)在2000年创立的开放源代码供开发人员和客户社区的家园,旨在构建世界级的Java IDE。
        Java分布式中文分词组件 - word分词,它是一个Java实现的分布式的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。(word1.3需要JDK1.8)
(3)设计与实现:
        清洗数据,获取所有关键词;compkey算法开始,输入种子关键词,如:“湖南”;接着从总搜索量中提取出与种子关键词相关的所有搜索信息;对与种子关键词相关的搜索信息进行分词与词频统计;通过对词频统计信息分析确定一定数目的中介关键词;对每个中介关键词查找相应的竞争性关键词,并计算竞争度;最后统计输出,结果保存到文件中。
        中介关键词的选取:对于一个确定的种子关键词,对清洗后的数据进行提取,得到与种子关键词有关的所有的搜索量保存到文件中,使用word分词插件对该文件进行分词与词频统计,出现的次数越多说明相关性越大,权重越大,则可以选取出现频率高的词作为中介关键词。
        竞争关键词的选取:每一个中介关键词都会对应一个竞争性关键词。对于每一个确定的中介关键词,从清洗后的数据中进行提取出于中介关键词有关的所有的搜索量保存到文件中,使用word分词插件对该文件进行分词与词频统计,出现的次数越多说明其与中介关键词相关性越大,则可以选取出现频率最高的词(该词不是种子关键词和中介关键词)作为竞争关键词。

2、关键词竞争算法数据预处理

2.1数据来源与数据特征

(1)数据来源:…\电子商务与电子政务实验数据\搜狗比赛数据\user_tag_query.10W.TRAIN
(2)数据特征(字段说明):
ID加密后的ID
age 0:未知年龄; 1:0-18岁; 2:19-23岁; 3:24-30岁; 4:31-40岁; 5:41-50岁; 6:51-999岁
Gender 0:未知 1:男性 2:女性
Education 0:未知学历; 1:博士; 2:硕士; 3:大学生; 4:高中; 5:初中; 6:小学
QueryList搜索词列表
(3)数据示例(如下图):
00627779E16E7C09B975B2CE13C088CB 4 2 0钢琴曲欣赏100首 一个月的宝宝眼睫毛那么是黄色 宝宝右眼有眼屎 小儿抽搐怎么办 剖腹产后刀口上有线头 属羊和属鸡的配吗

2.2种子关键词的选取

“湖南”, “作文”, “小说”, “大学”, “高考”, “诗句”, “电视剧”,“虎牙”, “广场舞”, "手机"等等。

2.3数据获取与关键代码实现

用Java读取原数据(源码):

InputStreamReader inStream = new InputStreamReader(new FileInputStream(new File(wordIn)), "GBK");
OutputStreamWriter outStream = new OutputStreamWriter(new FileOutputStream(new File(wordOut)), "UTF-8");
BufferedReader br = new BufferedReader(inStream);
BufferedWriter bw = new BufferedWriter(outStream);
String valueString = null;
char c[];
while ((valueString = br.readLine()) != null){c = valueString.toCharArray(); for(int i = 39; i < valueString.length(); i++) {bw.append(c[i]);if(c[i] == '\t') {bw.newLine();}
}
}
bw.close();

2.4预处理后的数据格式

数据处理之后,每个搜索记录单独占一行(如下图)

3、CompKey竞争性关键词推荐算法设计与实现

3.1算法原理

两个关键词不频繁同时出现在同一查询中,它们分别和同一关键词(中介关键词)同时出现在同一查询中的次数越多,竞争性越高;
        两个关键词分别和多个相同中介关键词同时出现在同一查询中,这样的中介关键词越多,竞争性越高。

3.2算法核心流程

3.3算法实现

(1)通过对查询日志的搜索,提取出所有与种子关键词s同时出现的中介关键词aM。
(2)计算出所有包含s与sa的查询搜索量。
(3)对查询日志进行搜索以确定不同时与s出现,但与某一个中间关键词同时出现的竞争性关键词kM,然后计算每个竞争关键词的竞争度
代码演示:

public static void compkey(String wordKey, int n) throws UnsupportedEncodingException, IOException, Exception {PathClass pa = new PathClass();System.out.println("开始从总搜索量中提取出与种子关键词相关的搜索信息...");new MainDataClass().data(wordKey);  //从原数据中提取出与种子关键词相关的搜索信息System.out.println("开始查找中介关键词...");/*用关键词的频率来代替权重,找出前n个中介关键词,并将保存到文件wordMidKey中*/InputStreamReader inStream = new InputStreamReader(new FileInputStream(pa.wordStatistics), "utf-8");BufferedReader bf = new BufferedReader(inStream);PrintStream ps = new PrintStream(pa.wordMidKey);/*保存屏幕信息*/PrintStream out = System.out;System.setOut(ps);String valueString = null;int sum = 0;valueString = bf.readLine();while ((valueString = bf.readLine()) != null) {int temp = valueString.indexOf(" ");valueString = valueString.substring(0, temp);if (valueString.length() <= 1 || valueString.contains(wordKey)) { //过滤掉一个字的中介关键词continue;} else {System.out.println(valueString);sum++;}if (sum == n) {break;}}System.setOut(out);System.out.println("开始查找竞争性关键词,并计算竞争度...");/*寻找竞争性关键词*/String valueStringTemp = null;InputStreamReader inStreamR = new InputStreamReader(new FileInputStream(new File(pa.wordMidKey)), "GBK");//读取文件BufferedReader bfr = new BufferedReader(inStreamR);WordKey[] wordK = new WordKey[n];for (int i = 0; i < n; i++) {wordK[i] = new WordKey();}for (int i = 0; i < n; i++) {String wordA = pa.wordTemp + String.valueOf(i) + pa.txt;String wordB = pa.wordTemp + String.valueOf(i) + String.valueOf(i) + pa.txt;String wordC = pa.wordTemp + String.valueOf(i) + String.valueOf(i) + String.valueOf(i) + pa.txt;valueStringTemp = bfr.readLine();   //中介关键词InputStreamReader inStream1 = new InputStreamReader(new FileInputStream(new File(pa.wordOut)), "utf-8");//读取文件OutputStreamWriter outStream = new OutputStreamWriter(new FileOutputStream(new File(wordA)), "utf-8");BufferedReader bf1 = new BufferedReader(inStream1);BufferedWriter bw1 = new BufferedWriter(outStream);String valueString1 = null;int a = 0; //所有含中介关键词的搜索量int ka = 0; //同时包含关键词和中介关键词的搜索量int sa = 0; //同时包含竞争关键词和中介关键词的搜索量while ((valueString1 = bf1.readLine()) != null) {  //与种子关键词相关的搜索信息if (valueString1.contains(valueStringTemp)) {bw1.write(valueString1);bw1.newLine();a++;}}bw1.close();new StatisticsDataClass().statistic(wordA, wordB, wordC);//对相关信息进行分词和词频统计,用于寻找竞争关键词/*寻找竞争关键词*/InputStreamReader inStream2 = new InputStreamReader(new FileInputStream(new File(wordC)), "utf-8");//读取文件BufferedReader bf2 = new BufferedReader(inStream2);String tempStr = null;while ((tempStr = bf2.readLine()) != null) {int temp = tempStr.indexOf(" ");tempStr = tempStr.substring(0, temp);if (tempStr.length() <= 1) {continue;/*去掉一个字的关键词*/}if (!tempStr.contains(valueStringTemp) && !tempStr.contains(wordKey)) {break;}}/*统计同时包含竞争关键词和中介关键词的搜索量*/InputStreamReader inStream3 = new InputStreamReader(new FileInputStream(new File(wordB)), "utf-8");//读取文件BufferedReader bf3 = new BufferedReader(inStream3);String valueString3 = null;while ((valueString3 = bf3.readLine()) != null) {if (valueString3.contains(valueStringTemp) && valueString3.contains(wordKey) && !valueString3.contains(tempStr)) {ka++;}if (valueString3.contains(valueStringTemp) && valueString3.contains(tempStr) && !valueString3.contains(wordKey)) {sa++;}}double ans;if (a - sa == 0) {ans = -1;} else {ans = (double) ka / (double) (a - sa);}wordK[i].wordKeyInit(wordKey, valueStringTemp, tempStr, ans);System.out.println("已完成第" + (i + 1) + "条数据统计:" + "(种子)" + wordKey + ":" + ka + "\t\t" + "(中介)" + valueStringTemp + ":" + a + "\t\t" + "(竞争)" + tempStr + ":" + sa + "\t\t竞争度:" + ans);}/*竞争性关键词排序打印*/WordKey tempWord;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (wordK[j].compPower < wordK[j + 1].compPower) {tempWord = wordK[j];wordK[j] = wordK[j + 1];wordK[j + 1] = tempWord;}}}String Result = pa.wordResult + wordKey + pa.txt;PrintStream ps1 = new PrintStream(Result);/*保存屏幕信息*/System.setOut(ps1);System.out.println("“" + wordKey + "”的竞争性关键词关于竞争度排序如下:");for (int i = 0; i < n; i++) {wordK[i].wordKeyPrint();}System.setOut(out);System.out.println("结束");System.out.println();}

3.4运行结果

3.5存在问题与优化

(1)竞争关键词的选取的不是很准确,主要体现在词性对等上。如种子关键词“虎牙”,其中介关键词“视频”对应的相关度最高的竞争关键词“在线”。
(2)当数据量增大的时候,程序运行效率低,时间主要花费在word分词上,可以考虑使用Java多线程提高效率。

4、算法实验结果的统计分析

4.1实验目的

关键词广告是一类重要的互联网广告形式,关键词推荐成为了一种重要的支持广告主决策的方法,竞争性关键词推荐能达到抢占竞争对手市场的更好广告效果。通过本项目实践,使学生了解关键词推荐方法,掌握竞争性关键词测度、CompKey算法流程、以及关键词的感知竞争性的有效性评估方法,并对算法进行软件设计,能以所学的理论和方法为基础拓展相关知识,以适应参与兴型电子商务的应用与开发实践的需要。

4.2不同数据规模下算法的运行时间

4.3图表分析与结论

对同一种子关键词,选取相同数目的中介关键词和竞争关键词,随着搜索量的增加,算法运行的时间成线性增长。

5.总结

通过将搜狗比赛数据进行预处理,使处理后的实验数据可以直接作为算法的输入数据,掌握了基本的数据清洗技术,和从复杂数据中提取出对算法有用的数据,并完成了竞争性关键字测度的计算和CompKey算法的实现。
下一步可以考虑的工作:
(1)选取竞争关键词的策略优化可以重新,如多个中介关键词存在程度的竞争关键词的竞争性。
(2)通过并行编程提高算法运行效率。
(3)代码重构,提高可阅读性和重用性。

  • 附上NetBeans项目工程文件
    链接:https://pan.baidu.com/s/1ZG7aTGt83Nsl17qE5Y3pWw
    提取码:ugd8

竞争性关键词推荐算法设计(中南大学电子商务课程实践)相关推荐

  1. 算法设计与分析课程的时间空间复杂度

    算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...

  2. 算法设计与分析课程复习笔记11——单源最短路径

    算法设计与分析课程复习笔记11--单源最短路径 单源最短路径 最短路径问题 输入:有权有向图G=(V,E) 路径p={ v 0 , v 1 , . . . , v k v_0, v_1, . . . ...

  3. 计算机算法课程论文设计与实现,算法设计与分析课程论文

    算法设计与分析课程论文 "卓越工程师教育培养计划"(简称卓越计划)旨在培养一批创新能力强.适应经济社会发展需要的高质量工程技术人才.在南通大学计算机科学与技术学院制定的软件工程专业 ...

  4. 算法设计与分析 课程设计之N皇后问题

    题目 N皇后回溯法求解空间 目的要求 目的: 1.用学到的书本知识解决实际问题的能力: 2.锻炼实际工作所需要的动手能力: 3.加强对数据结构和算法的应用: 4.锻炼自己以科学理论和工程上能力的技术, ...

  5. 算法设计和分析课程设计报告

    文章目录 1. 题目 2. 目的 3. 内容 4. 需求分析 5. 逻辑结构设计 6.算法详细设计 7.编码与调试 8. 算法改进,优化方法 10.总结,心得体会 课程设计报告要求 1. 题目 01背 ...

  6. 【分治法】中位数问题和Gray码问题——武汉理工大学算法设计与分析课程实验

    1. 中位数问题 « 问题描述 设X[ 0 : n - 1]和Y[ 0 : n – 1 ]为两个数组,每个数组中含有n个已排好序的数.找出X和Y的2n个数的中位数. « 编程任务 利用分治策略试设计一 ...

  7. 【动态规划】最大K乘积问题和游艇租用问题——武汉理工大学算法设计与分析课程实验

    1.  最大K乘积问题 « 问题描述 设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 例如十 ...

  8. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB 提交: 475  解决: 34 提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如 ...

  9. python猜字游戏算法设计_python入门到实践-猜字游戏

    学完while循环后我们通过实践来做一个小游戏程序[猜数字],风格一样先上代码: #!/usr/bin/env python3 #coding:utf-8 import random answer = ...

最新文章

  1. 入职第一天,老板竟然让我优化5亿数据量,要凉凉?
  2. pip install 报错:Versioning for this project requires either an sdist tarball, ...
  3. linux ../的含义
  4. html css制作计算器,使用html+css+js实现计算器
  5. 简述单机,集群,分布式架构区别及联系
  6. Java中的观察者设计模式
  7. 管道popen和pclose的实例使用
  8. Intel 5400平台 芯片组
  9. 云服务器测速脚本_美国云主机哪家好?BlueHost美国云主机性能测评
  10. linux git编译安装目录,Linux(centos) 环境下如何源码编译安装git
  11. 基于Qiskit——《量子计算编程实战》读书笔记(一)
  12. GoogleStyle编程代码规范
  13. exchange 2016升级版本及最新安全补丁
  14. es where_阿水出现在eStar二队,ES.JackeyLove正在连接?
  15. 百度地图3d效果和卫星图效果
  16. 由设计稿一键智能生成代码的快捷软件
  17. matlab中(:)的部分使用
  18. Frida Hook与Fiddler完美抓包手淘
  19. 训练大规模对比学习的一些小笔记
  20. 记一次我的Google电话面试经历

热门文章

  1. 【蓝桥真题4】练练填空就想进国赛?拿下大题才能让你真正有底气(蓝桥31日冲刺打卡)
  2. 开学生产力必备APP——学霸一秒上线
  3. 关于minizip-ng无法解压unix下压缩的带有文件夹的zip文件
  4. 【基础知识】rubymine常用快捷键
  5. 黑龙江java_( )是黑龙江省独有的民族。
  6. 销售分析怎么做?掌握3个思路,让你“躺平”秒变“躺赢”
  7. python mt4_迈达克软件公司承认Python运算对量化交易的重要性将Python与Metatrader 5集成一体...
  8. ViewFlipper和ViewPager,fluttertextfield高度
  9. python语言运用答案_智慧树Python语言应用答案,知到网课章节期末考试Python语言应用答案...
  10. 微型计算机的主要性能和指标,微型计算机的主要性能指标