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