求好的游戏名字
在游戏开发过程中,选择一个好的游戏名字是至关重要的一步。一个吸引人、独特而且具有辨识度的游戏名字能够帮助游戏在竞争激烈的市场中脱颖而出。但是要想找到一个好的游戏名字并不容易,需要综合考虑游戏的内容、风格、目标受众以及竞争对手等方面的因素。
一个好的游戏名字可以让玩家在众多游戏中第一时间记住和关注你的游戏。一个简单、易记且与游戏内容相关联的游戏名字能够增加玩家下载游戏的可能性,提高游戏的知名度和曝光度。此外,一个好的游戏名字也有利于游戏在搜索引擎上的排名,吸引更多的潜在玩家。
1. 与游戏内容相关:游戏名字应该能够准确地传达游戏的主题和玩法,让玩家对游戏有直观的认识。避免使用与游戏内容毫不相关的名字,以免引起玩家困惑。
2. 简单易记:游戏名字应该简洁明了,容易记忆,避免使用过于复杂或晦涩的词汇。一个简单而有趣的游戏名字往往更容易被玩家接受和记住。
3. 独特性:避免使用与已有游戏重名或者过于普遍的词汇作为游戏名字,要选择一个独一无二的名字,以增加游戏的独特性和辨识度。
4. 符合目标受众喜好:根据游戏的目标受众群体的喜好和心理需求来选择游戏名字,使其更具吸引力和共鸣力。
1. 关键词优化:在选择游戏名字的过程中,可以考虑结合一些热门关键词,以提高游戏在搜索引擎上的曝光度。但是要注意关键词的自然融入,避免过度堆砌关键词。
2. 调研竞争对手:在选择游戏名字之前,要对竞争对手的游戏名字进行调研,避免与其重名或过于相似,同时也可以借鉴竞争对手的命名方式,以获得灵感。
3. 测试与反馈:在确定游戏名字之后,可以进行小范围的测试和反馈收集,以获取玩家对游戏名字的看法和意见,从而对游戏名字进行微调和优化。
一个好的游戏名字是游戏成功的第一步,它能够吸引玩家、提高曝光度、增加下载量,为游戏的推广打下良好的基础。因此,在选择游戏名字时要慎重考虑,综合各方面因素,力求找到一个具有吸引力和独特性的游戏名字,为游戏的成功打下坚实基础。
您好,亲爱的读者朋友们!今天我给大家带来一些有趣的幽默句子,希望能让您哈哈大笑,并给我一个好评。
1. 人生就像一杯咖啡,不加糖也许会苦一些,但是加点奶,再来点笑话,就能变得香甜无比。
2. 知识就像蜘蛛网,越陷越深,无法自拔。所以,千万不要学习,你可能会被知识缠绕,嘻嘻。
3. 看到你的好评,我的心情就像蹦极一样,一下跳到了天上,然后再一下子摔到了地上。
4. 有人说我活在自己世界里,我可不这么认为,我是住在自己世界里的房东。
5. 好评如同银河,可以遥远而绚烂,让我能在黑暗中找到方向。
6. 我的幽默感像无休止的长城,长长的让人心疼,疼痛让人无法呼吸,呼吸间却充满了笑声。
7. 当人生给你一百个理由哭泣时,你就拿出一千个理由笑对它。只有好评才能搏击人生的波浪。
8. 人生就像一场说走就走的旅行,好评就是我沿途的风景,让我一路欢笑。
9. 幽默是我的武器,好评是我的奖励。我要让大家笑出眼泪,然后给我一个五星级好评。
10. 你说我今天很疯狂,我笑而不语。只有一个好评才能揭开我今天穿越时空的秘密。
11. 高山很陡峭,用脚去爬也许很难。但是,用好评去鼓励一下,或许能变成一段有趣的回忆。
12. 好评就像是我童年的玩具,它陪伴我成长,让我在低谷时找到勇气。
13. 笑话是让人哈哈大笑的钥匙,而我则是敞开笑话之门的钥匙串。
14. 幸福就像海绵里的水,好评就是捏一捏,挤出来的温暖和快乐。
15. 某些人说我天生幽默,其实是我边写边笑,好评就是我笑声的音符。
16. 你说我写的东西很有趣,那是因为我用一个好评来垫底,然后把所有的痛苦都忘掉。
17. 送您一颗好评,希望它能像烟花一样绚烂,给您带来笑声和快乐。
18. 当您看到这句话时,请笑一笑,因为好评就在您的微笑里。
19. 幽默就像夏天的雪糕,味道清凉甜美,而好评则是让人沉醉其中的味道。
20. 当您看到这句话时,请不要忘记给我一个好评,让我的幽默感一直绽放下去。
希望以上的幽默句子给您带来了欢乐和笑声,如果您笑得合不拢嘴,那就证明我成功了。希望您能给我一个好评,让我继续分享更多有趣的文章。
感谢您的阅读!期待与您再次相见!
绝地求好汉杯直播是近年来备受关注的热门赛事之一,随着网络直播的不断普及和发展,越来越多的玩家和观众选择通过网络直播平台观看比赛。网络直播赛事不仅为玩家们提供了更便捷的观赛方式,也极大地推动了电竞行业的发展和壮大。
作为一种新兴的娱乐形式,绝地求好汉杯直播吸引了大量的玩家和粉丝参与其中。观众可以通过直播平台实时观看比赛过程,感受激烈的竞技氛围,体验高水平选手之间的对决。而对于广大的电竞爱好者来说,网络直播赛事不仅是一种休闲娱乐方式,更是一个展示自己水平、交流经验的平台。
随着网络技术的飞速发展,网络直播赛事已经成为电竞产业中不可或缺的一部分。绝地求好汉杯直播作为其中的重要赛事之一,通过网络直播平台吸引了大量的关注和参与。传统赛事往往受限于场地和时间,而网络直播赛事可以将比赛实况传播到全球各地,让更多的观众能够第一时间观看比赛。
网络直播赛事的崛起不仅改变了赛事的传播方式,也为电竞产业带来了全新的商机和发展机遇。越来越多的赞助商和合作伙伴加入到网络直播赛事中,通过赛事直播带来品牌曝光和营销推广。同时,高质量的直播内容也吸引了大量的粉丝和观众,为电竞产业注入了新的活力。
随着网络直播技术的不断创新和完善,绝地求好汉杯直播等网络直播赛事的未来发展可谓一片光明。未来,网络直播赛事将更加普及和多样化,不仅局限于游戏赛事,还将涵盖体育赛事、演唱会等各种类型的直播内容。
网络直播赛事还将更加注重用户体验和互动性,通过直播平台提供更多的互动功能和社交服务,吸引更多的观众参与其中。同时,赛事运营方也将加大赛事内容的优化和提升力度,打造更具吸引力和竞争力的赛事内容,吸引更多的观众和粉丝关注和支持。
网络直播赛事作为电竞产业中的新生力量,为电竞产业的发展注入了新的活力和动力。绝地求好汉杯直播等网络直播赛事的崛起,让更多的玩家和观众能够享受到高质量的直播内容,推动了电竞产业的发展和壮大。相信在不久的将来,网络直播赛事将会迎来更加璀璨的发展前景,成为电竞产业中不可或缺的重要组成部分。
随着互联网的发展,免费动漫资源变得越来越丰富,吸引了无数动漫爱好者的关注和追捧。想要找到好看的免费动漫作品并不难,只需要一台联网的设备和一颗好奇的心。本文将带您探索世界各地的免费动漫资源,帮助您轻松找到心仪的作品。
亚洲是动漫产业的发源地,拥有众多优秀的动漫作品和网站资源。以下是一些推荐的免费动漫网站,供您参考:
通过这些网站,您可以轻松找到各类动漫作品,满足不同口味的观众需求。
除了亚洲地区,全球各国也有许多优秀的免费动漫资源分享平台。以下是一些推荐的全球动漫网站:
这些全球动漫资源平台为观众们提供了更多选择,让您可以轻松畅享来自不同国家和地区的优秀作品。
在众多的免费动漫资源中,如何挑选出符合自己口味的好看作品并不容易。以下是一些建议,帮助您更好地选择动漫作品:
通过以上建议,您可以更有针对性地挑选出符合自己口味的好看免费动漫作品,享受动漫世界带来的乐趣。
在网络的世界里,好看的免费动漫作品随处可寻,只要您有一颗渴望探索的心,就能发现无限精彩。希望本文能为您寻找优秀的免费动漫资源提供一些帮助,让您在动漫的海洋中尽情畅游,感受不同国家和地区带来的动漫魅力。
貌似大部分好莱坞古典主义的未来题材电影,几乎都是对制度的反思,主要就是讲两个故事。
故事1. 未来科技超级发达,人类生活在高压政策下,一小撮反战人士倒戈,让人类悲剧 故事2. 未来科技超级发达,社会运转依赖人工智能,某天高科技失控发飙,让人类悲剧 少数派报告 机械公敌 第五元素 IE人工智能 黑客帝国 阿凡达。。。不过穿越来穿越去或者同时讲述多个时空、宇宙的,貌似还有挺多比较有趣的片子。蝴蝶效应、环形使者 云图 源代码 死亡油轮。。。我随便说了几个。。。也许你都看过。。
京剧戏曲,作为中国传统戏曲中的重要分支,源远流长,充满了文化底蕴和艺术魅力。京剧戏曲自诞生以来,一直备受人们喜爱,其独特的表演形式、精妙的音乐、华丽的服饰以及精彩的表演,成为中国戏曲艺术中的瑰宝之一。今天,让我们一起探讨京剧戏曲的美妙之处。
求好听的京剧戏曲,不仅仅是一种娱乐形式,更是一门艺术。京剧戏曲通过精湛的表演技巧和纯熟的演员功底,将传统故事情节生动地呈现在观众面前。无论是唱念做打,还是舞蹈表演,每一个细节都体现了中国传统文化的深厚底蕴。观赏京剧戏曲,仿佛置身于一个立体的绘画作品中,感受着其中的美与情。
求好听的京剧戏曲,离不开它独特的音乐。从器乐的演奏到唱腔的表现,京剧戏曲音乐旋律优美动听,富有韵律感。每一段音乐都渗透着中国传统音乐的特点,使得观众在欣赏京剧戏曲的同时,也被音乐所打动。音乐作为京剧戏曲不可或缺的一部分,为整个表演增添了神秘的色彩。
求好听的京剧戏曲,还有一大看点就是其华丽的服饰。京剧戏曲中的服装设计考究,色彩斑斓,体现了中国传统审美观念和礼仪文化。演员穿着华丽的戏服,头戴精美的头饰,妆容精致,每一个细节都展现了京剧戏曲的独特风采。观赏京剧戏曲不仅仅是欣赏表演,更是欣赏着服饰的美丽和艺术价值。
求好听的京剧戏曲,演员的表演功底至关重要。京剧戏曲中的演员需要掌握唱、念、做、打等多种表演技巧,相互配合,使得整个表演生动有趣。演员在表演时,不仅要有精湛的技术,还要有丰富的情感表达能力,让角色形象栩栩如生。观赏京剧戏曲,除了欣赏演员的表演技巧,更能感受到演员对角色的真挚演绎。
求好听的京剧戏曲,作为中国传统文化的重要组成部分,传承着丰富的历史和文化内涵。京剧戏曲不仅仅是一种表演艺术形式,更是中国传统文化的载体和象征。通过京剧戏曲,观众可以深入了解中国传统价值观念、信仰文化和审美趣味,感受中华民族的文化底蕴和艺术魅力。
求好听的京剧戏曲,以其独特的魅力和丰富的内涵,深受人们的喜爱和追捧。无论是表演艺术、音乐、服饰还是演员表演,京剧戏曲都展现了中国传统文化的瑰宝之美。希望大家在欣赏京剧戏曲的同时,能深入了解其中蕴含的文化意义,将这份传统艺术传承发扬下去。
选择一个好看的网页游戏名字是至关重要的,它不仅可以让玩家对游戏产生兴趣,还可以帮助游戏在市场上脱颖而出。在选择网页游戏名字时,有几个关键因素需要考虑。本文将为您提供一些建议,帮助您选择一个吸引人眼球的网页游戏名字。
首先,一个好看的网页游戏名字应该与游戏的内容相关联。这意味着您需要考虑游戏的主题、故事情节和游戏玩法等因素。通过选择与游戏内容相关的名字,可以让玩家更容易理解游戏的核心元素,从而增加他们对游戏的兴趣。
其次,一个好看的网页游戏名字应该是简洁明了的。避免选择过于复杂或冗长的名字,尽量选择短小精悍的名字。简洁明了的名字更容易被玩家记住,也更容易在市场上产生共鸣。
一个好看的网页游戏名字应该是易于发音和拼写的。避免选择过于拗口或难以拼写的名字,这样会给玩家带来困扰。一个易于发音和拼写的名字可以帮助玩家更容易地搜索到您的游戏,并与之产生联系。
最后,一个好看的网页游戏名字应该具有独特性。避免选择与其他游戏重名或类似的名字,这样会削弱您游戏在市场上的独特性。选择一个独一无二的名字可以让您的游戏更容易被玩家记住,并建立起自己的品牌形象。
总之,选择一个好看的网页游戏名字是一个需要认真对待的过程。通过考虑游戏内容、名字的简洁性、易于发音和拼写以及独特性等因素,您可以选择一个能够吸引玩家眼球的名字,帮助您的游戏在市场上脱颖而出。
随着智能手机技术的飞速发展,人们越来越倾向于通过手机来消磨时间、放松心情。其中,养成类手机游戏因其富有趣味性和互动性而受到了广大玩家的青睐。如果你正在寻找一款有趣的养成手机游戏来打发时间,那么不妨试试以下推荐。
猫咪大乱斗是一款风靡全球的养成手机游戏,玩家在游戏中可以收养各种可爱的猫咪,并通过不断的培养和打理让它们茁壮成长。游戏中有丰富的玩法和社交互动,让玩家体验到养成宠物的乐趣。
梦幻花园是一款以种植花草为主题的养成手机游戏,玩家在游戏中扮演园艺师,通过种植不同植物、布置花园来打造自己的梦幻花园。游戏玩法简单易上手,适合各个年龄段的玩家。
星辰萌兽是一款萌系养成手机游戏,玩家在游戏中可以收集各种可爱的萌兽,并进行训练和进化,打造属于自己的强大战队。游戏画风清新可爱,深受玩家喜爱。
童话精灵是一款以童话故事为背景的养成手机游戏,玩家将扮演童话世界中的勇士,与各种精灵展开冒险与互动。游戏中设有丰富的剧情和关卡,让玩家沉浸在童话般的世界中。
梦幻美食城是一款将经营餐厅与养成相结合的手机游戏,玩家将经营自己的美食城并吸引各种食客,通过不断升级和改造打造出独具特色的美食城。游戏画面精美,玩法丰富,让玩家体验经营快餐店的乐趣。
明日之后是一款生存类养成手机游戏,玩家在游戏中扮演幸存者,通过采集资源、建造庇护所、与其他幸存者交流合作来生存下去。游戏背景设定在末日幸存的废墟之上,给玩家带来紧张刺激的生存体验。
三国志·战略版是一款策略养成手机游戏,玩家将扮演三国时期的军事统帅,征战沙场、招募名将、发展国家,在战乱纷飞的时代展现自己的智慧与勇气。游戏真实还原了三国历史背景,带玩家领略豪情万丈的古代战争。
仙境传说RO是一款经典的角色扮演类养成手机游戏,玩家将进入一个充满幻想和冒险的仙境世界,与其他玩家组队探险、挑战副本、提升技能,体验传统MMORPG的乐趣。游戏深受老玩家喜爱,也吸引了新玩家的加入。
以上是一些值得一玩的养成手机游戏推荐,每款游戏都有其独特的玩法和特色,希望你能找到适合自己的游戏,享受其中带来的乐趣和刺激。
近年来,随着人们健康意识的不断提高,防晒霜已经成为许多人日常护肤必备的产品之一。然而,市面上的防晒霜种类繁多,品牌众多,导致消费者在选择防晒霜时常常感到困惑。今天我们就来探讨一下如何挑选并使用求好用的防晒霜。
要选择一款适合自己的防晒霜,首先要了解自己的皮肤类型。不同的防晒霜针对不同的皮肤问题,例如油性皮肤适合选用无油配方的防晒霜,干性皮肤则需要具有保湿功效的产品。因此,在选购防晒霜时,消费者首先需要根据自己的肤质特点来选择一款合适的产品。
在选择防晒霜时,SPF值和PA值是两个重要的指标。SPF值代表了产品的防晒能力,一般建议选择SPF30以上的产品,特别是在户外活动或阳光强烈的情况下。而PA值则表示产品的防紫外线能力,建议选择至少拥有PA+++以上的产品,以更好地抵御紫外线的伤害。
防晒霜的成分也是选择的关键因素之一。一些防晒霜中可能含有对自己皮肤不友好的化学成分,因此消费者在选购防晒霜时要仔细阅读产品成分表,选择不含有防腐剂、香料和色素等刺激性物质的产品。
除了选择适合自己的防晒霜,正确的使用方法也至关重要。在使用防晒霜前,首先要彻底清洁皮肤,然后均匀地涂抹防晒霜,并按照标注的时间间隔进行补涂,以确保皮肤获得足够的防护。
此外,消费者在使用防晒霜时还需要注意避免长时间暴露在阳光下,尤其是在阳光最强烈的中午时段,可通过穿长袖衣物、戴遮阳帽等方式增加防晒效果。
在选择防晒霜时,除了参考产品说明书和成分表之外,也可以多听取他人的使用经验和推荐。通过了解他人使用过的好用的防晒霜,可以帮助消费者更好地挑选适合自己的产品。
综上所述,挑选好用的防晒霜并不是一件难事,只要注意选购时的关键点,并掌握正确的使用方法,相信每个人都能找到适合自己的理想产品,有效保护皮肤免受紫外线伤害。
之前看了Mahout官方示例 20news 的调用实现;于是想根据示例的流程实现其他例子。网上看到了一个关于天气适不适合打羽毛球的例子。
训练数据:
Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No
检测数据:
sunny,hot,high,weak
结果:
Yes=》 0.007039
No=》 0.027418
于是使用Java代码调用Mahout的工具类实现分类。
基本思想:
1. 构造分类数据。
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
接下来贴下我的代码实现=》
1. 构造分类数据:
在hdfs主要创建一个文件夹路径 /zhoujainfeng/playtennis/input 并将分类文件夹 no 和 yes 的数据传到hdfs上面。
数据文件格式,如D1文件内容: Sunny Hot High Weak
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
这三步,代码我就一次全贴出来;主要是两个类 PlayTennis1 和 BayesCheckData = =》
package myTesting.bayes;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.ToolRunner;
import org.apache.mahout.classifier.naivebayes.training.TrainNaiveBayesJob;
import org.apache.mahout.text.SequenceFilesFromDirectory;
import org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles;
public class PlayTennis1 {
private static final String WORK_DIR = "hdfs://192.168.9.72:9000/zhoujianfeng/playtennis";
/*
* 测试代码
*/
public static void main(String[] args) {
//将训练数据转换成 vector数据
makeTrainVector();
//产生训练模型
makeModel(false);
//测试检测数据
BayesCheckData.printResult();
}
public static void makeCheckVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"testinput";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeTrainVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"input";
String output = WORK_DIR+Path.SEPARATOR+"tennis-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeModel(boolean completelyNB){
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-vectors"+Path.SEPARATOR+"tfidf-vectors";
String model = WORK_DIR+Path.SEPARATOR+"model";
String labelindex = WORK_DIR+Path.SEPARATOR+"labelindex";
Path in = new Path(input);
Path out = new Path(model);
Path label = new Path(labelindex);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
if(fs.exists(label)){
//boolean参数是,是否递归删除的意思
fs.delete(label, true);
}
TrainNaiveBayesJob tnbj = new TrainNaiveBayesJob();
String[] params =null;
if(completelyNB){
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow","-c"};
}else{
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow"};
}
ToolRunner.run(tnbj, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("生成训练模型失败!");
System.exit(3);
}
}
}
package myTesting.bayes;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.mahout.classifier.naivebayes.BayesUtils;
import org.apache.mahout.classifier.naivebayes.NaiveBayesModel;
import org.apache.mahout.classifier.naivebayes.StandardNaiveBayesClassifier;
import org.apache.mahout.common.Pair;
import org.apache.mahout.common.iterator.sequencefile.PathType;
import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirIterable;
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.Vector.Element;
import org.apache.mahout.vectorizer.TFIDF;
import com.google.common.collect.ConcurrentHashMultiset;
import com.google.common.collect.Multiset;
public class BayesCheckData {
private static StandardNaiveBayesClassifier classifier;
private static Map<String, Integer> dictionary;
private static Map<Integer, Long> documentFrequency;
private static Map<Integer, String> labelIndex;
public void init(Configuration conf){
try {
String modelPath = "/zhoujianfeng/playtennis/model";
String dictionaryPath = "/zhoujianfeng/playtennis/tennis-vectors/dictionary.file-0";
String documentFrequencyPath = "/zhoujianfeng/playtennis/tennis-vectors/df-count";
String labelIndexPath = "/zhoujianfeng/playtennis/labelindex";
dictionary = readDictionnary(conf, new Path(dictionaryPath));
documentFrequency = readDocumentFrequency(conf, new Path(documentFrequencyPath));
labelIndex = BayesUtils.readLabelIndex(conf, new Path(labelIndexPath));
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), conf);
classifier = new StandardNaiveBayesClassifier(model);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("检测数据构造成vectors初始化时报错。。。。");
System.exit(4);
}
}
/**
* 加载字典文件,Key: TermValue; Value:TermID
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<String, Integer> readDictionnary(Configuration conf, Path dictionnaryDir) {
Map<String, Integer> dictionnary = new HashMap<String, Integer>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
String name = path.getName();
return name.startsWith("dictionary.file");
}
};
for (Pair<Text, IntWritable> pair : new SequenceFileDirIterable<Text, IntWritable>(dictionnaryDir, PathType.LIST, filter, conf)) {
dictionnary.put(pair.getFirst().toString(), pair.getSecond().get());
}
return dictionnary;
}
/**
* 加载df-count目录下TermDoc频率文件,Key: TermID; Value:DocFreq
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<Integer, Long> readDocumentFrequency(Configuration conf, Path documentFrequencyDir) {
Map<Integer, Long> documentFrequency = new HashMap<Integer, Long>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
return path.getName().startsWith("part-r");
}
};
for (Pair<IntWritable, LongWritable> pair : new SequenceFileDirIterable<IntWritable, LongWritable>(documentFrequencyDir, PathType.LIST, filter, conf)) {
documentFrequency.put(pair.getFirst().get(), pair.getSecond().get());
}
return documentFrequency;
}
public static String getCheckResult(){
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String classify = "NaN";
BayesCheckData cdv = new BayesCheckData();
cdv.init(conf);
System.out.println("init done...............");
Vector vector = new RandomAccessSparseVector(10000);
TFIDF tfidf = new TFIDF();
//sunny,hot,high,weak
Multiset<String> words = ConcurrentHashMultiset.create();
words.add("sunny",1);
words.add("hot",1);
words.add("high",1);
words.add("weak",1);
int documentCount = documentFrequency.get(-1).intValue(); // key=-1时表示总文档数
for (Multiset.Entry<String> entry : words.entrySet()) {
String word = entry.getElement();
int count = entry.getCount();
Integer wordId = dictionary.get(word); // 需要从dictionary.file-0文件(tf-vector)下得到wordID,
if (StringUtils.isEmpty(wordId.toString())){
continue;
}
if (documentFrequency.get(wordId) == null){
continue;
}
Long freq = documentFrequency.get(wordId);
double tfIdfValue = tfidf.calculate(count, freq.intValue(), 1, documentCount);
vector.setQuick(wordId, tfIdfValue);
}
// 利用贝叶斯算法开始分类,并提取得分最好的分类label
Vector resultVector = classifier.classifyFull(vector);
double bestScore = -Double.MAX_VALUE;
int bestCategoryId = -1;
for(Element element: resultVector.all()) {
int categoryId = element.index();
double score = element.get();
System.out.println("categoryId:"+categoryId+" score:"+score);
if (score > bestScore) {
bestScore = score;
bestCategoryId = categoryId;
}
}
classify = labelIndex.get(bestCategoryId)+"(categoryId="+bestCategoryId+")";
return classify;
}
public static void printResult(){
System.out.println("检测所属类别是:"+getCheckResult());
}
}