哈士奇,作为一种活泼好动的犬种,自然引起了很多人的喜爱。它们的外表帅气,性格活泼可爱,拥有浓密的毛发和蓝色的眼睛,给人一种非常独特的感觉。然而,作为爱狗人士,我们需要关心和注意到一些事情,比如它们的饮食健康。所以,问题来了——哈士奇是否可以吃口香糖呢?
首先,我们需要明确一点:口香糖对狗来说是有害的。虽然我们人类经常吃口香糖来保持口气清新,但是对狗来说,它可能会导致生命危险。口香糖通常含有一种叫做Xylitol(木糖醇)的人造甜味剂,这种甜味剂对狗的血糖水平产生不可预测的影响。
当狗咀嚼口香糖时,其中的Xylitol会迅速被吸收到它们的血液中。这会导致血糖水平迅速下降,可能会引发低血糖。低血糖在狗身体内的影响非常严重,可能引发以下症状:
所以,当涉及到哈士奇是否可以吃口香糖时,我们的回答是不可以。尽管哈士奇可能会对口香糖的味道感到好奇,但我们务必要牢记,它们的健康比一块口香糖重要得多。
当我们注意到哈士奇吞咽了口香糖或其他含有Xylitol的物品时,我们应立即采取行动。不要等待症状出现,因为低血糖可能会迅速发展。带着你的哈士奇前往兽医那里,因为他们能够提供适当的治疗和护理。
为了确保哈士奇健康成长,我们需要为它们提供营养均衡的食物。哈士奇是一种大型活泼的犬种,需要摄入足够的蛋白质、脂肪和碳水化合物。
对于哈士奇来说,饮食要尽量避免含有添加剂和人工成分的食物。我们可以选择高质量的干狗粮,确保主要成分是肉类和天然食材。此外,哈士奇的食物中还应包含适量的维生素和矿物质,以满足它们的营养需求。
此外,哈士奇也需要充足的水。确保它们随时都能够获得清洁、新鲜的水源,以保持身体的水分平衡。
在与家人共度美好时光的同时,我们需要确保哈士奇及其他宠物的健康和安全。尽管哈士奇有时可能会有些好奇,但请永远不要让它们尝试口香糖,以免发生灾难性的后果。
相反,我们应该始终为哈士奇提供健康、营养均衡的食物,与兽医保持定期联系,以确保它们的身体健康。这样,我们才能为哈士奇打造一个美好而健康的未来。
在减肥过程中,很多人会尝试各种方法来控制食欲,其中一种方法就是吃口香糖。但是,减肥吃口香糖真的有效吗?
口香糖主要由糖、胶质和香味剂等成分组成。虽然口香糖的味道可以暂时抑制食欲,但是它的热量不容忽视。长期食用口香糖,不仅会导致体重增加,还会对身体健康造成潜在的危害。
对于减肥者来说,控制饮食是至关重要的。应该尽量避免高热量、高糖的食物,如糖果、巧克力、蛋糕等。相反,应该选择一些低热量、高纤维的食物,如蔬菜、水果、瘦肉等,以满足身体的营养需求,同时控制体重。
虽然口香糖可以在一定程度上抑制食欲,但是应该注意正确的使用方法。不要过度食用口香糖,以免影响身体健康。此外,还应该选择一些无糖、低热量的口香糖,以减少对身体的负担。
减肥期间,应该注意饮食健康,尽量避免高热量、高糖的食物。口香糖虽然可以暂时抑制食欲,但是应该正确使用,避免过度食用。选择一些低糖、无糖的口香糖,以减少对身体的负担。同时,应该注意身体健康,保持良好的生活习惯和心态,以达到健康减肥的目的。
在当今快节奏的社会中,创新已经成为了成败的关键。无论是在个人生活中还是商业领域中,都需要不断寻求突破与创新的方法。而逆向思维,作为一种非传统的思考方式,可能会给我们带来新的视角和想法。
逆向思维口香糖是一种特殊的工具,它可以帮助我们以不同的角度观察问题,从而找到新的解决方案。在本文中,我们将探讨如何有效地利用逆向思维口香糖进行创新。
传统的思维方式往往是在一个固定的框架中思考问题,这种思维模式很容易限制我们的创造力和想象力。而逆向思维则是打破常规,从不同的角度思考问题。当我们遇到一个难题时,可以尝试用逆向思维口香糖咀嚼片来打破常规思维。
逆向思维可以帮助我们跳出框架,重新审视问题。例如,如果我们想设计一个更舒适的椅子,传统思维可能会考虑添加更多的软垫。但通过逆向思维,我们可能会考虑去掉椅子的某些部件,或者尝试不同的座椅材质。这种思考方式可以帮助我们发现一些非传统的解决方案。
逆向思维能够让我们看到表面上不可能的可能性。当我们遭遇挑战时,往往会有一种固定的思维定势,认为问题没有解决办法。然而,逆向思维可以帮助我们找到一些看似不可能的可能性。
逆向思维口香糖是一种咀嚼片,不仅能够刺激我们的口腔感受,还能够刺激我们的思考。当我们在遇到困难时,可以咀嚼一颗逆向思维口香糖,放松思维定势,并开始尝试不同的解决方案。
逆向思维口香糖能够帮助我们以新的视角看待问题。通过逆向思维,我们可以从不同的角度思考问题,找到一些之前被忽视的细节。
逆向思维能够帮助我们发现问题的根本原因,并寻找解决问题的方法。有时候,问题的解决方案可能已经在我们身边,只是我们没有注意到。逆向思维可以帮助我们发现这些潜在的解决方案。
逆向思维口香糖可以激发我们的创造力。通过逆向思维,我们可以解放我们的想象力,尝试不同的想法和方法。
逆向思维可以帮助我们寻找新的创新点,发现新的商机。当我们咀嚼逆向思维口香糖时,我们的大脑会开始在不同的领域进行联想,创造新的联系,激发新的创意。
逆向思维口香糖是一个理论工具,但它的真正价值在于实践。当我们遇到问题时,无论是个人的困惑还是商业的挑战,逆向思维都可以作为一个有力的工具。
通过咀嚼逆向思维口香糖,我们可以变得更加勇敢和开放,在解决问题时更加灵活。我们可以尝试不同的方法和思考方式,以寻找新的解决方案。
逆向思维口香糖是一种引领创新的工具。它能够打破常规思维,看似不可能的可能性,提供新的视角,激发创造力,并能够在实践中发挥作用。
在现代社会中,创新是成功的关键。利用逆向思维口香糖,我们可以在思考问题时走出常规,找到新的解决方案。无论是个人生活中还是商业领域中,逆向思维都能够为我们带来新的机会和突破。
让我们一起咀嚼逆向思维口香糖,开启创新之旅吧!
幼儿舞蹈是让宝宝们通过舞蹈动作的表演,来增强身体的协调性、灵活性和艺术表达能力的一种活动。它在幼儿园和家庭教育中扮演着重要的角色。而口香糖歌曲作为一种特别受欢迎的舞蹈曲目,更是为幼儿舞蹈增添了活力和趣味。
幼儿期是孩子身体和心理发展的关键时期,而幼儿舞蹈正是针对这个时期的发展需求而设计的活动。以下是选择幼儿舞蹈的几个原因:
口香糖歌曲作为幼儿舞蹈中的常见曲目,因激情四溢的旋律和动感的节奏而备受欢迎。它不仅能够唤起宝宝们的舞蹈热情,还能带给他们愉悦的舞蹈体验。
口香糖歌曲有以下几个特点,使其成为幼儿舞蹈中的理想曲目:
以下是一些常见的口香糖歌曲,它们在幼儿舞蹈中非常流行:
口香糖歌曲给幼儿舞蹈增添了活力和趣味,让宝宝们在舞蹈中充分展现自己的才艺。通过幼儿舞蹈和口香糖歌曲的结合,不仅可以锻炼孩子的身体素质,还可以培养他们的艺术表达和团队合作能力。让我们陪伴孩子们一起跳舞,享受舞蹈带来的快乐吧!
在我们生活中,有时候会发生一些出乎意料的、令人捧腹的小插曲。我们常常被生活中的微小事件所打动,特别是那些让人忍俊不禁的搞笑瞬间。口香糖的恶作剧就是其中之一。
这个故事发生在我小的时候,当时我正上小学二年级。我们的班级里有一个调皮捣蛋的男生,他总是喜欢恶作剧,给我们带来了许多欢乐。这一次,他带来了一大盒的口香糖,准备进行一次令人难忘的恶作剧。
这天,正值我们班的语文课,老师正在认真地讲解课文。突然间,这个调皮的男生悄悄地将一颗口香糖放在了同桌的椅子上。大家都知道,这个男生的恶作剧总是令人哭笑不得,所以我们都悄悄地朝那位同学投去了疑惑又期待的眼神。
课程进行到一半的时候,同桌突然感觉到了底下那颗口香糖。由于坐的姿势,他没有发现什么异常,但他隐约感觉到了一些不对劲。他动了动身子,想要摆脱这个不适的感觉,但无奈是没有成功。
我们全班的目光都集中在同桌身上,悄悄地暗自祈祷着,希望他能发现这个小恶作剧。就在大家的期待中,同桌开始频繁地摇晃身子,想要摆脱这个让他感到不适的东西。同时,他的表情变得越来越痛苦,仿佛在承受着极大的煎熬。
这一幕让我们禁不住笑了出来,尽管我们也担心同桌会不会因为这个恶作剧而受伤。但是我们也不得不承认,这个调皮的男生的恶作剧真的太有趣了。他总是能够将微小的事情演绎得如此精彩,让每一个人都忍俊不禁。
经过了几分钟的折磨和煎熬,同桌终于发现了他身下的那颗口香糖。他低头一看,立刻明白了发生了什么。全班同学都哈哈大笑起来,掌声和笑声此起彼伏。
同桌也没有生气,他笑着站起来,抱着胳膊跟着大家一起笑。他用力地拍了拍调皮的男生的肩膀,表示自己并不在意这个小小的恶作剧。我们班级的气氛一下子变得轻松愉快起来,仿佛在那一刻,我们都忘记了上课的紧张和学习的压力。
这个小小的恶作剧,不仅给我们带来了欢乐,也教会了我们宽容和忍耐。同桌能够用笑容来面对这个恶作剧,让我们明白了在生活中遇到一些小事情时,应该放宽心态,不要太过于认真。生活中的小插曲和幽默瞬间,正是给我们带来放松和愉悦的机会。
这个小恶作剧也引发了我们对幽默的思考。幽默是人们生活中重要的一部分,可以帮助人们消除压力,舒缓紧张的情绪。同时,幽默可以促进人与人之间的交流和沟通,增强彼此的感情。当我们欣赏幽默的时候,我们会感到轻松愉悦,与他人之间的距离也会拉近。
我们每个人都需要一些微小的搞笑瞬间来缓解生活中的压力和疲劳。当我们笑得开心时,我们的身心都会得到放松,我们会感到更加快乐和满足。因此,在我们生活中,不妨多一些幽默和笑声,让自己的生活更加丰富多彩。
这个口香糖的恶作剧虽然只是一个小小的插曲,但它给我们每个人留下了深刻的印象。我们班级的同学,因为这个小恶作剧,变得更加团结和融洽。调皮的男生也学会了如何用幽默来打破班级的沉闷氛围,为大家带来欢乐。
在我们的回忆中,这个小恶作剧将永远成为我们班级的独特记忆,而这个调皮的男生也将永远留在我们心中。
希望你也能在生活中遇到一些类似的幽默瞬间,让你的生活更加快乐和愉悦。
口香糖作为一种小众但广受喜爱的休闲食品,近年来在市场上逐渐崭露头角。为了进一步提升品牌形象,许多口香糖生产商开始注重公关活动的策划和执行。本文将探讨口香糖公关活动的成功案例,并揭示其中的秘诀。
口香糖公关活动不仅可以增加品牌的曝光度,提升消费者对产品的认知度,还可以帮助建立积极的品牌形象,促进产品销售。通过巧妙的公关策略,口香糖企业可以与消费者建立紧密的联系,促进品牌忠诚度的提升。
以下是几个口香糖企业成功开展公关活动的案例:
要想成功开展口香糖公关活动,企业需要注意以下几点:
通过合理的口香糖公关活动策划和执行,口香糖企业可以有效提升品牌形象,吸引更多消费者的关注和支持,实现品牌的可持续发展。
戴牙套是为了矫正牙齿,让牙齿排列更加整齐美观。但是在戴牙套的过程中,食物选择变得更加谨慎,其中包括口香糖。许多人喜欢在戴牙套的情况下嚼口香糖,但口香糖是否适合戴牙套者存在一定的争议。
口香糖对于口腔的健康有一定的影响,尤其是对于戴牙套者而言。正规的牙医通常建议患者在戴牙套期间避免嚼口香糖,因为口香糖在嚼的过程中会产生拉力,这可能会影响牙套的矫正效果,甚至导致牙套脱落,延长矫正的时间。
另外,口香糖中含有的糖分和色素也可能对牙齿造成损害,增加蛀牙的风险。戴牙套期间,口腔卫生至关重要,任何可能影响牙齿健康的行为都应该避免。
嚼口香糖会导致口腔中细菌增加,增加蛀牙的风险。口香糖中所含的糖分会被细菌利用产生酸性物质,腐蚀牙釉质,造成蛀牙。如果戴牙套者长期嚼口香糖,口腔健康可能会受到影响。
此外,口香糖的黏性会导致牙齿上残留较多的糖分,增加了细菌感染的机会。对于戴牙套者而言,牙齿周围的卫生更加重要,避免食用黏性食物是维护口腔健康的关键。
通过以上方法,我们可以保持口腔清洁,减少口腔感染的风险,保证牙套的矫正效果。戴牙套期间,我们应该特别注意口腔卫生,避免食用对牙齿有害的食物,包括口香糖。
口香糖是一种令人愉悦的零食,但当它粘在我们的衣物、地板或家具上时,就变得非常烦人了。传统的清洁方法往往是费时费力的,而且容易损坏物品表面。然而,现在有了口香糖清洗机,它可以轻松高效地清洁这些顽固的小东西。
口香糖清洗机是一种专门设计用于清洁口香糖的小型电动设备。它采用了先进的震动和加热技术,可以迅速将口香糖从各种物体表面彻底清除。
口香糖清洗机的工作过程非常简单。首先,将设备插入电源,然后打开开关使其开始工作。接下来,将口香糖清洗机的清洁头对准口香糖所粘附的表面,然后用适当的压力开始移动设备。清洁头的振动和加热作用会使口香糖分解,使其与物体表面分离。
口香糖清洗机还配备了吸尘功能,它可以迅速将已清洁的口香糖颗粒吸入设备内部的尘箱中。这样不仅可以保持清洁的效果,还可以避免口香糖残留在其他地方。
虽然口香糖清洗机非常方便易用,但在使用之前仍然需要注意一些事项。
相比传统的口香糖清洁方法,口香糖清洗机具有许多优势。
首先,口香糖清洗机可以节省时间和精力。使用传统方法清除口香糖往往要花费很长时间,而且效果有限。口香糖清洗机通过振动和加热的作用,可以在极短的时间内将口香糖完全清除。
其次,口香糖清洗机能够保护物体表面。传统方法往往需要使用刀子或刷子来刮去口香糖,容易造成物体表面的划痕或损伤。口香糖清洗机通过震动和加热作用,将口香糖分解,不会对物体表面造成任何伤害。
此外,口香糖清洗机还具有吸尘功能,可以将已清洁的口香糖颗粒吸入设备内部的尘箱中。这样不仅可以保持清洁的效果,还可以避免口香糖残留在其他地方。
口香糖清洗机是一种方便高效的小道具,可以轻松清洁各种表面上的口香糖。它的工作原理简单,操作易上手,同时具有高效、安全、不损伤物体表面等优点。如果您经常面对口香糖粘在衣物、地板或家具上的问题,不妨尝试一下口香糖清洗机,它将为您解决困扰,让您的清洁工作更加轻松愉快。
之前看了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());
}
}