哈士奇,作為一種活潑好動(dòng)的犬種,自然引起了很多人的喜愛(ài)。它們的外表帥氣,性格活潑可愛(ài),擁有濃密的毛發(fā)和藍(lán)色的眼睛,給人一種非常獨(dú)特的感覺(jué)。然而,作為愛(ài)狗人士,我們需要關(guān)心和注意到一些事情,比如它們的飲食健康。所以,問(wèn)題來(lái)了——哈士奇是否可以吃口香糖呢?
首先,我們需要明確一點(diǎn):口香糖對(duì)狗來(lái)說(shuō)是有害的。雖然我們?nèi)祟惤?jīng)常吃口香糖來(lái)保持口氣清新,但是對(duì)狗來(lái)說(shuō),它可能會(huì)導(dǎo)致生命危險(xiǎn)。口香糖通常含有一種叫做Xylitol(木糖醇)的人造甜味劑,這種甜味劑對(duì)狗的血糖水平產(chǎn)生不可預(yù)測(cè)的影響。
當(dāng)狗咀嚼口香糖時(shí),其中的Xylitol會(huì)迅速被吸收到它們的血液中。這會(huì)導(dǎo)致血糖水平迅速下降,可能會(huì)引發(fā)低血糖。低血糖在狗身體內(nèi)的影響非常嚴(yán)重,可能引發(fā)以下癥狀:
所以,當(dāng)涉及到哈士奇是否可以吃口香糖時(shí),我們的回答是不可以。盡管哈士奇可能會(huì)對(duì)口香糖的味道感到好奇,但我們務(wù)必要牢記,它們的健康比一塊口香糖重要得多。
當(dāng)我們注意到哈士奇吞咽了口香糖或其他含有Xylitol的物品時(shí),我們應(yīng)立即采取行動(dòng)。不要等待癥狀出現(xiàn),因?yàn)榈脱强赡軙?huì)迅速發(fā)展。帶著你的哈士奇前往獸醫(yī)那里,因?yàn)樗麄兡軌蛱峁┻m當(dāng)?shù)闹委熀妥o(hù)理。
為了確保哈士奇健康成長(zhǎng),我們需要為它們提供營(yíng)養(yǎng)均衡的食物。哈士奇是一種大型活潑的犬種,需要攝入足夠的蛋白質(zhì)、脂肪和碳水化合物。
對(duì)于哈士奇來(lái)說(shuō),飲食要盡量避免含有添加劑和人工成分的食物。我們可以選擇高質(zhì)量的干狗糧,確保主要成分是肉類和天然食材。此外,哈士奇的食物中還應(yīng)包含適量的維生素和礦物質(zhì),以滿足它們的營(yíng)養(yǎng)需求。
此外,哈士奇也需要充足的水。確保它們隨時(shí)都能夠獲得清潔、新鮮的水源,以保持身體的水分平衡。
在與家人共度美好時(shí)光的同時(shí),我們需要確保哈士奇及其他寵物的健康和安全。盡管哈士奇有時(shí)可能會(huì)有些好奇,但請(qǐng)永遠(yuǎn)不要讓它們嘗試口香糖,以免發(fā)生災(zāi)難性的后果。
相反,我們應(yīng)該始終為哈士奇提供健康、營(yíng)養(yǎng)均衡的食物,與獸醫(yī)保持定期聯(lián)系,以確保它們的身體健康。這樣,我們才能為哈士奇打造一個(gè)美好而健康的未來(lái)。
在減肥過(guò)程中,很多人會(huì)嘗試各種方法來(lái)控制食欲,其中一種方法就是吃口香糖。但是,減肥吃口香糖真的有效嗎?
口香糖主要由糖、膠質(zhì)和香味劑等成分組成。雖然口香糖的味道可以暫時(shí)抑制食欲,但是它的熱量不容忽視。長(zhǎng)期食用口香糖,不僅會(huì)導(dǎo)致體重增加,還會(huì)對(duì)身體健康造成潛在的危害。
對(duì)于減肥者來(lái)說(shuō),控制飲食是至關(guān)重要的。應(yīng)該盡量避免高熱量、高糖的食物,如糖果、巧克力、蛋糕等。相反,應(yīng)該選擇一些低熱量、高纖維的食物,如蔬菜、水果、瘦肉等,以滿足身體的營(yíng)養(yǎng)需求,同時(shí)控制體重。
雖然口香糖可以在一定程度上抑制食欲,但是應(yīng)該注意正確的使用方法。不要過(guò)度食用口香糖,以免影響身體健康。此外,還應(yīng)該選擇一些無(wú)糖、低熱量的口香糖,以減少對(duì)身體的負(fù)擔(dān)。
減肥期間,應(yīng)該注意飲食健康,盡量避免高熱量、高糖的食物。口香糖雖然可以暫時(shí)抑制食欲,但是應(yīng)該正確使用,避免過(guò)度食用。選擇一些低糖、無(wú)糖的口香糖,以減少對(duì)身體的負(fù)擔(dān)。同時(shí),應(yīng)該注意身體健康,保持良好的生活習(xí)慣和心態(tài),以達(dá)到健康減肥的目的。
在當(dāng)今快節(jié)奏的社會(huì)中,創(chuàng)新已經(jīng)成為了成敗的關(guān)鍵。無(wú)論是在個(gè)人生活中還是商業(yè)領(lǐng)域中,都需要不斷尋求突破與創(chuàng)新的方法。而逆向思維,作為一種非傳統(tǒng)的思考方式,可能會(huì)給我們帶來(lái)新的視角和想法。
逆向思維口香糖是一種特殊的工具,它可以幫助我們以不同的角度觀察問(wèn)題,從而找到新的解決方案。在本文中,我們將探討如何有效地利用逆向思維口香糖進(jìn)行創(chuàng)新。
傳統(tǒng)的思維方式往往是在一個(gè)固定的框架中思考問(wèn)題,這種思維模式很容易限制我們的創(chuàng)造力和想象力。而逆向思維則是打破常規(guī),從不同的角度思考問(wèn)題。當(dāng)我們遇到一個(gè)難題時(shí),可以嘗試用逆向思維口香糖咀嚼片來(lái)打破常規(guī)思維。
逆向思維可以幫助我們跳出框架,重新審視問(wèn)題。例如,如果我們想設(shè)計(jì)一個(gè)更舒適的椅子,傳統(tǒng)思維可能會(huì)考慮添加更多的軟墊。但通過(guò)逆向思維,我們可能會(huì)考慮去掉椅子的某些部件,或者嘗試不同的座椅材質(zhì)。這種思考方式可以幫助我們發(fā)現(xiàn)一些非傳統(tǒng)的解決方案。
逆向思維能夠讓我們看到表面上不可能的可能性。當(dāng)我們?cè)庥鎏魬?zhàn)時(shí),往往會(huì)有一種固定的思維定勢(shì),認(rèn)為問(wèn)題沒(méi)有解決辦法。然而,逆向思維可以幫助我們找到一些看似不可能的可能性。
逆向思維口香糖是一種咀嚼片,不僅能夠刺激我們的口腔感受,還能夠刺激我們的思考。當(dāng)我們?cè)谟龅嚼щy時(shí),可以咀嚼一顆逆向思維口香糖,放松思維定勢(shì),并開始嘗試不同的解決方案。
逆向思維口香糖能夠幫助我們以新的視角看待問(wèn)題。通過(guò)逆向思維,我們可以從不同的角度思考問(wèn)題,找到一些之前被忽視的細(xì)節(jié)。
逆向思維能夠幫助我們發(fā)現(xiàn)問(wèn)題的根本原因,并尋找解決問(wèn)題的方法。有時(shí)候,問(wèn)題的解決方案可能已經(jīng)在我們身邊,只是我們沒(méi)有注意到。逆向思維可以幫助我們發(fā)現(xiàn)這些潛在的解決方案。
逆向思維口香糖可以激發(fā)我們的創(chuàng)造力。通過(guò)逆向思維,我們可以解放我們的想象力,嘗試不同的想法和方法。
逆向思維可以幫助我們尋找新的創(chuàng)新點(diǎn),發(fā)現(xiàn)新的商機(jī)。當(dāng)我們咀嚼逆向思維口香糖時(shí),我們的大腦會(huì)開始在不同的領(lǐng)域進(jìn)行聯(lián)想,創(chuàng)造新的聯(lián)系,激發(fā)新的創(chuàng)意。
逆向思維口香糖是一個(gè)理論工具,但它的真正價(jià)值在于實(shí)踐。當(dāng)我們遇到問(wèn)題時(shí),無(wú)論是個(gè)人的困惑還是商業(yè)的挑戰(zhàn),逆向思維都可以作為一個(gè)有力的工具。
通過(guò)咀嚼逆向思維口香糖,我們可以變得更加勇敢和開放,在解決問(wèn)題時(shí)更加靈活。我們可以嘗試不同的方法和思考方式,以尋找新的解決方案。
逆向思維口香糖是一種引領(lǐng)創(chuàng)新的工具。它能夠打破常規(guī)思維,看似不可能的可能性,提供新的視角,激發(fā)創(chuàng)造力,并能夠在實(shí)踐中發(fā)揮作用。
在現(xiàn)代社會(huì)中,創(chuàng)新是成功的關(guān)鍵。利用逆向思維口香糖,我們可以在思考問(wèn)題時(shí)走出常規(guī),找到新的解決方案。無(wú)論是個(gè)人生活中還是商業(yè)領(lǐng)域中,逆向思維都能夠?yàn)槲覀儙?lái)新的機(jī)會(huì)和突破。
讓我們一起咀嚼逆向思維口香糖,開啟創(chuàng)新之旅吧!
幼兒舞蹈是讓寶寶們通過(guò)舞蹈動(dòng)作的表演,來(lái)增強(qiáng)身體的協(xié)調(diào)性、靈活性和藝術(shù)表達(dá)能力的一種活動(dòng)。它在幼兒園和家庭教育中扮演著重要的角色。而口香糖歌曲作為一種特別受歡迎的舞蹈曲目,更是為幼兒舞蹈增添了活力和趣味。
幼兒期是孩子身體和心理發(fā)展的關(guān)鍵時(shí)期,而幼兒舞蹈正是針對(duì)這個(gè)時(shí)期的發(fā)展需求而設(shè)計(jì)的活動(dòng)。以下是選擇幼兒舞蹈的幾個(gè)原因:
口香糖歌曲作為幼兒舞蹈中的常見(jiàn)曲目,因激情四溢的旋律和動(dòng)感的節(jié)奏而備受歡迎。它不僅能夠喚起寶寶們的舞蹈熱情,還能帶給他們愉悅的舞蹈體驗(yàn)。
口香糖歌曲有以下幾個(gè)特點(diǎn),使其成為幼兒舞蹈中的理想曲目:
以下是一些常見(jiàn)的口香糖歌曲,它們?cè)谟變何璧钢蟹浅A餍校?/p>
口香糖歌曲給幼兒舞蹈增添了活力和趣味,讓寶寶們?cè)谖璧钢谐浞终宫F(xiàn)自己的才藝。通過(guò)幼兒舞蹈和口香糖歌曲的結(jié)合,不僅可以鍛煉孩子的身體素質(zhì),還可以培養(yǎng)他們的藝術(shù)表達(dá)和團(tuán)隊(duì)合作能力。讓我們陪伴孩子們一起跳舞,享受舞蹈帶來(lái)的快樂(lè)吧!
在我們生活中,有時(shí)候會(huì)發(fā)生一些出乎意料的、令人捧腹的小插曲。我們常常被生活中的微小事件所打動(dòng),特別是那些讓人忍俊不禁的搞笑瞬間。口香糖的惡作劇就是其中之一。
這個(gè)故事發(fā)生在我小的時(shí)候,當(dāng)時(shí)我正上小學(xué)二年級(jí)。我們的班級(jí)里有一個(gè)調(diào)皮搗蛋的男生,他總是喜歡惡作劇,給我們帶來(lái)了許多歡樂(lè)。這一次,他帶來(lái)了一大盒的口香糖,準(zhǔn)備進(jìn)行一次令人難忘的惡作劇。
這天,正值我們班的語(yǔ)文課,老師正在認(rèn)真地講解課文。突然間,這個(gè)調(diào)皮的男生悄悄地將一顆口香糖放在了同桌的椅子上。大家都知道,這個(gè)男生的惡作劇總是令人哭笑不得,所以我們都悄悄地朝那位同學(xué)投去了疑惑又期待的眼神。
課程進(jìn)行到一半的時(shí)候,同桌突然感覺(jué)到了底下那顆口香糖。由于坐的姿勢(shì),他沒(méi)有發(fā)現(xiàn)什么異常,但他隱約感覺(jué)到了一些不對(duì)勁。他動(dòng)了動(dòng)身子,想要擺脫這個(gè)不適的感覺(jué),但無(wú)奈是沒(méi)有成功。
我們?nèi)嗟哪抗舛技性谕郎砩希那牡匕底云矶\著,希望他能發(fā)現(xiàn)這個(gè)小惡作劇。就在大家的期待中,同桌開始頻繁地?fù)u晃身子,想要擺脫這個(gè)讓他感到不適的東西。同時(shí),他的表情變得越來(lái)越痛苦,仿佛在承受著極大的煎熬。
這一幕讓我們禁不住笑了出來(lái),盡管我們也擔(dān)心同桌會(huì)不會(huì)因?yàn)檫@個(gè)惡作劇而受傷。但是我們也不得不承認(rèn),這個(gè)調(diào)皮的男生的惡作劇真的太有趣了。他總是能夠?qū)⑽⑿〉氖虑檠堇[得如此精彩,讓每一個(gè)人都忍俊不禁。
經(jīng)過(guò)了幾分鐘的折磨和煎熬,同桌終于發(fā)現(xiàn)了他身下的那顆口香糖。他低頭一看,立刻明白了發(fā)生了什么。全班同學(xué)都哈哈大笑起來(lái),掌聲和笑聲此起彼伏。
同桌也沒(méi)有生氣,他笑著站起來(lái),抱著胳膊跟著大家一起笑。他用力地拍了拍調(diào)皮的男生的肩膀,表示自己并不在意這個(gè)小小的惡作劇。我們班級(jí)的氣氛一下子變得輕松愉快起來(lái),仿佛在那一刻,我們都忘記了上課的緊張和學(xué)習(xí)的壓力。
這個(gè)小小的惡作劇,不僅給我們帶來(lái)了歡樂(lè),也教會(huì)了我們寬容和忍耐。同桌能夠用笑容來(lái)面對(duì)這個(gè)惡作劇,讓我們明白了在生活中遇到一些小事情時(shí),應(yīng)該放寬心態(tài),不要太過(guò)于認(rèn)真。生活中的小插曲和幽默瞬間,正是給我們帶來(lái)放松和愉悅的機(jī)會(huì)。
這個(gè)小惡作劇也引發(fā)了我們對(duì)幽默的思考。幽默是人們生活中重要的一部分,可以幫助人們消除壓力,舒緩緊張的情緒。同時(shí),幽默可以促進(jìn)人與人之間的交流和溝通,增強(qiáng)彼此的感情。當(dāng)我們欣賞幽默的時(shí)候,我們會(huì)感到輕松愉悅,與他人之間的距離也會(huì)拉近。
我們每個(gè)人都需要一些微小的搞笑瞬間來(lái)緩解生活中的壓力和疲勞。當(dāng)我們笑得開心時(shí),我們的身心都會(huì)得到放松,我們會(huì)感到更加快樂(lè)和滿足。因此,在我們生活中,不妨多一些幽默和笑聲,讓自己的生活更加豐富多彩。
這個(gè)口香糖的惡作劇雖然只是一個(gè)小小的插曲,但它給我們每個(gè)人留下了深刻的印象。我們班級(jí)的同學(xué),因?yàn)檫@個(gè)小惡作劇,變得更加團(tuán)結(jié)和融洽。調(diào)皮的男生也學(xué)會(huì)了如何用幽默來(lái)打破班級(jí)的沉悶氛圍,為大家?guī)?lái)歡樂(lè)。
在我們的回憶中,這個(gè)小惡作劇將永遠(yuǎn)成為我們班級(jí)的獨(dú)特記憶,而這個(gè)調(diào)皮的男生也將永遠(yuǎn)留在我們心中。
希望你也能在生活中遇到一些類似的幽默瞬間,讓你的生活更加快樂(lè)和愉悅。
口香糖作為一種小眾但廣受喜愛(ài)的休閑食品,近年來(lái)在市場(chǎng)上逐漸嶄露頭角。為了進(jìn)一步提升品牌形象,許多口香糖生產(chǎn)商開始注重公關(guān)活動(dòng)的策劃和執(zhí)行。本文將探討口香糖公關(guān)活動(dòng)的成功案例,并揭示其中的秘訣。
口香糖公關(guān)活動(dòng)不僅可以增加品牌的曝光度,提升消費(fèi)者對(duì)產(chǎn)品的認(rèn)知度,還可以幫助建立積極的品牌形象,促進(jìn)產(chǎn)品銷售。通過(guò)巧妙的公關(guān)策略,口香糖企業(yè)可以與消費(fèi)者建立緊密的聯(lián)系,促進(jìn)品牌忠誠(chéng)度的提升。
以下是幾個(gè)口香糖企業(yè)成功開展公關(guān)活動(dòng)的案例:
要想成功開展口香糖公關(guān)活動(dòng),企業(yè)需要注意以下幾點(diǎn):
通過(guò)合理的口香糖公關(guān)活動(dòng)策劃和執(zhí)行,口香糖企業(yè)可以有效提升品牌形象,吸引更多消費(fèi)者的關(guān)注和支持,實(shí)現(xiàn)品牌的可持續(xù)發(fā)展。
戴牙套是為了矯正牙齒,讓牙齒排列更加整齊美觀。但是在戴牙套的過(guò)程中,食物選擇變得更加謹(jǐn)慎,其中包括口香糖。許多人喜歡在戴牙套的情況下嚼口香糖,但口香糖是否適合戴牙套者存在一定的爭(zhēng)議。
口香糖對(duì)于口腔的健康有一定的影響,尤其是對(duì)于戴牙套者而言。正規(guī)的牙醫(yī)通常建議患者在戴牙套期間避免嚼口香糖,因?yàn)榭谙闾窃诮赖倪^(guò)程中會(huì)產(chǎn)生拉力,這可能會(huì)影響牙套的矯正效果,甚至導(dǎo)致牙套脫落,延長(zhǎng)矯正的時(shí)間。
另外,口香糖中含有的糖分和色素也可能對(duì)牙齒造成損害,增加蛀牙的風(fēng)險(xiǎn)。戴牙套期間,口腔衛(wèi)生至關(guān)重要,任何可能影響牙齒健康的行為都應(yīng)該避免。
嚼口香糖會(huì)導(dǎo)致口腔中細(xì)菌增加,增加蛀牙的風(fēng)險(xiǎn)。口香糖中所含的糖分會(huì)被細(xì)菌利用產(chǎn)生酸性物質(zhì),腐蝕牙釉質(zhì),造成蛀牙。如果戴牙套者長(zhǎng)期嚼口香糖,口腔健康可能會(huì)受到影響。
此外,口香糖的黏性會(huì)導(dǎo)致牙齒上殘留較多的糖分,增加了細(xì)菌感染的機(jī)會(huì)。對(duì)于戴牙套者而言,牙齒周圍的衛(wèi)生更加重要,避免食用黏性食物是維護(hù)口腔健康的關(guān)鍵。
通過(guò)以上方法,我們可以保持口腔清潔,減少口腔感染的風(fēng)險(xiǎn),保證牙套的矯正效果。戴牙套期間,我們應(yīng)該特別注意口腔衛(wèi)生,避免食用對(duì)牙齒有害的食物,包括口香糖。
口香糖是一種令人愉悅的零食,但當(dāng)它粘在我們的衣物、地板或家具上時(shí),就變得非常煩人了。傳統(tǒng)的清潔方法往往是費(fèi)時(shí)費(fèi)力的,而且容易損壞物品表面。然而,現(xiàn)在有了口香糖清洗機(jī),它可以輕松高效地清潔這些頑固的小東西。
口香糖清洗機(jī)是一種專門設(shè)計(jì)用于清潔口香糖的小型電動(dòng)設(shè)備。它采用了先進(jìn)的震動(dòng)和加熱技術(shù),可以迅速將口香糖從各種物體表面徹底清除。
口香糖清洗機(jī)的工作過(guò)程非常簡(jiǎn)單。首先,將設(shè)備插入電源,然后打開開關(guān)使其開始工作。接下來(lái),將口香糖清洗機(jī)的清潔頭對(duì)準(zhǔn)口香糖所粘附的表面,然后用適當(dāng)?shù)膲毫﹂_始移動(dòng)設(shè)備。清潔頭的振動(dòng)和加熱作用會(huì)使口香糖分解,使其與物體表面分離。
口香糖清洗機(jī)還配備了吸塵功能,它可以迅速將已清潔的口香糖顆粒吸入設(shè)備內(nèi)部的塵箱中。這樣不僅可以保持清潔的效果,還可以避免口香糖殘留在其他地方。
雖然口香糖清洗機(jī)非常方便易用,但在使用之前仍然需要注意一些事項(xiàng)。
相比傳統(tǒng)的口香糖清潔方法,口香糖清洗機(jī)具有許多優(yōu)勢(shì)。
首先,口香糖清洗機(jī)可以節(jié)省時(shí)間和精力。使用傳統(tǒng)方法清除口香糖往往要花費(fèi)很長(zhǎng)時(shí)間,而且效果有限。口香糖清洗機(jī)通過(guò)振動(dòng)和加熱的作用,可以在極短的時(shí)間內(nèi)將口香糖完全清除。
其次,口香糖清洗機(jī)能夠保護(hù)物體表面。傳統(tǒng)方法往往需要使用刀子或刷子來(lái)刮去口香糖,容易造成物體表面的劃痕或損傷。口香糖清洗機(jī)通過(guò)震動(dòng)和加熱作用,將口香糖分解,不會(huì)對(duì)物體表面造成任何傷害。
此外,口香糖清洗機(jī)還具有吸塵功能,可以將已清潔的口香糖顆粒吸入設(shè)備內(nèi)部的塵箱中。這樣不僅可以保持清潔的效果,還可以避免口香糖殘留在其他地方。
口香糖清洗機(jī)是一種方便高效的小道具,可以輕松清潔各種表面上的口香糖。它的工作原理簡(jiǎn)單,操作易上手,同時(shí)具有高效、安全、不損傷物體表面等優(yōu)點(diǎn)。如果您經(jīng)常面對(duì)口香糖粘在衣物、地板或家具上的問(wèn)題,不妨嘗試一下口香糖清洗機(jī),它將為您解決困擾,讓您的清潔工作更加輕松愉快。
之前看了Mahout官方示例 20news 的調(diào)用實(shí)現(xiàn);于是想根據(jù)示例的流程實(shí)現(xiàn)其他例子。網(wǎng)上看到了一個(gè)關(guān)于天氣適不適合打羽毛球的例子。
訓(xùn)練數(shù)據(jù):
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
檢測(cè)數(shù)據(jù):
sunny,hot,high,weak
結(jié)果:
Yes=》 0.007039
No=》 0.027418
于是使用Java代碼調(diào)用Mahout的工具類實(shí)現(xiàn)分類。
基本思想:
1. 構(gòu)造分類數(shù)據(jù)。
2. 使用Mahout工具類進(jìn)行訓(xùn)練,得到訓(xùn)練模型。
3。將要檢測(cè)數(shù)據(jù)轉(zhuǎn)換成vector數(shù)據(jù)。
4. 分類器對(duì)vector數(shù)據(jù)進(jìn)行分類。
接下來(lái)貼下我的代碼實(shí)現(xiàn)=》
1. 構(gòu)造分類數(shù)據(jù):
在hdfs主要?jiǎng)?chuàng)建一個(gè)文件夾路徑 /zhoujainfeng/playtennis/input 并將分類文件夾 no 和 yes 的數(shù)據(jù)傳到hdfs上面。
數(shù)據(jù)文件格式,如D1文件內(nèi)容: Sunny Hot High Weak
2. 使用Mahout工具類進(jìn)行訓(xùn)練,得到訓(xùn)練模型。
3。將要檢測(cè)數(shù)據(jù)轉(zhuǎn)換成vector數(shù)據(jù)。
4. 分類器對(duì)vector數(shù)據(jù)進(jìn)行分類。
這三步,代碼我就一次全貼出來(lái);主要是兩個(gè)類 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";
/*
* 測(cè)試代碼
*/
public static void main(String[] args) {
//將訓(xùn)練數(shù)據(jù)轉(zhuǎn)換成 vector數(shù)據(jù)
makeTrainVector();
//產(chǎn)生訓(xùn)練模型
makeModel(false);
//測(cè)試檢測(cè)數(shù)據(jù)
BayesCheckData.printResult();
}
public static void makeCheckVector(){
//將測(cè)試數(shù)據(jù)轉(zhuǎn)換成序列化文件
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參數(shù)是,是否遞歸刪除的意思
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);
}
//將序列化文件轉(zhuǎn)換成向量文件
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參數(shù)是,是否遞歸刪除的意思
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("序列化文件轉(zhuǎn)換成向量失敗!");
System.out.println(2);
}
}
public static void makeTrainVector(){
//將測(cè)試數(shù)據(jù)轉(zhuǎn)換成序列化文件
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參數(shù)是,是否遞歸刪除的意思
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);
}
//將序列化文件轉(zhuǎn)換成向量文件
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參數(shù)是,是否遞歸刪除的意思
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("序列化文件轉(zhuǎn)換成向量失敗!");
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參數(shù)是,是否遞歸刪除的意思
fs.delete(out, true);
}
if(fs.exists(label)){
//boolean參數(shù)是,是否遞歸刪除的意思
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("生成訓(xùn)練模型失敗!");
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("檢測(cè)數(shù)據(jù)構(gòu)造成vectors初始化時(shí)報(bào)錯(cuò)。。。。");
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時(shí)表示總文檔數(shù)
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("檢測(cè)所屬類別是:"+getCheckResult());
}
}