蠟字,原意是蠅蛹,從蟲部(以蟲為偏旁)代表動物性的油脂。 燭字,原意是火把,從火部(以火為偏旁),主意就是火把。燭繁體為燭,蜀字是讀音,zhushu。后來簡寫為蟲。 所以燭字的蟲與蠟燭這個詞沒有什么關聯(lián)性,它只是讀音。而蠟字那半個蟲字,油脂的代表才是這個詞的關鍵。 二者聯(lián)系起來可以這樣理解帶油脂的火把。
1、首先要注意一定要選無煙大豆蠟的,不要問為什么,只有這個不嗆,當然有些蠟燭用了棉線燭心的,滅的時候肯定有黑煙,但只是一瞬間,矯情的話可以弄個滅炷罩。
2、第一次燃燒的時候盡量燒夠40分鐘以上,風不要太大,這樣會有一個很圓的圓心,最后可以充分利用。
3、有牌子的幾個固然好 但是就是貴 個人覺得沒那個必要,除非你是個無品牌不歡的人,什么都要用大牌。
4、價格一般選50左右的就行了,真的不用太貴的,但拼夕夕上有很多特別便宜的注意,并不是全都是大豆臘的,大多數(shù)成分石蠟夾雜大豆臘。慎買。
5、大豆臘熔點比較低 超過40度就出汗,超過50度肯定就化了。所以夏天買注意,別覺得這是產(chǎn)品不好,好才化,你搞個石蠟的試試。邦邦硬。所以不要傻。
6、網(wǎng)上有好幾家都還不錯的,有想要的我可以推薦。
在家庭購房的過程中,選擇一個適宜的房屋平面圖是至關重要的。倆室倆廳的平面圖備受許多家庭青睞,因為它為居住者提供了足夠的私密性、靈活性和舒適性。在這篇博客中,我們將探討倆室倆廳平面圖的優(yōu)點以及如何打破常規(guī)布局創(chuàng)造一種時尚而現(xiàn)代的居住環(huán)境。
倆室倆廳的平面圖設計非常實用,適合各種家庭類型。以下是該房屋平面圖的一些重要優(yōu)點:
總之,倆室倆廳平面圖提供了具有私密性、靈活性和舒適性的居住空間。
為了使倆室倆廳的平面圖更加時尚和現(xiàn)代,我們可以采用一些創(chuàng)意的設計方法。以下是一些建議:
將廚房與客廳合而為一,打破傳統(tǒng)的隔斷模式,創(chuàng)造出一個開放、通透的空間。這種設計將增加空間的流動感,方便家庭成員在烹飪和社交活動之間無縫切換。
為倆室倆廳平面圖增加一個陽臺,并將陽臺與客廳直接相連。這樣設計不僅增加了自然采光和通風,還提供了一個舒適的戶外休閑區(qū)域,讓居住者能夠更好地享受室內(nèi)外的美好風景。
在有限的空間中,合理規(guī)劃并兼顧多種功能將變得至關重要。例如,客廳中可以設計一個嵌入式的書柜,既增加了儲物空間,又為家庭成員提供了一個閱讀和放松的場所。臥室也可以設計成帶書桌的工作區(qū),使其既能用于休息,又能用于工作學習。
在選擇適合的倆室倆廳平面圖時,需要考慮以下幾個方面:
最重要的是,選擇一個符合個人喜好和家庭需求的倆室倆廳平面圖。
倆室倆廳平面圖是一種受歡迎的房屋設計布局,它提供了私密性、靈活性和舒適性。通過打破常規(guī)布局,創(chuàng)造一種時尚而現(xiàn)代的居住環(huán)境,倆室倆廳平面圖可以成為一個理想的選擇。選擇適合自己的平面圖,為自己和家人創(chuàng)造一個溫馨的家。
在現(xiàn)代社會,動漫已經(jīng)成為了一種娛樂方式和文化符號。影響力廣泛而深遠的動漫作品吸引著無數(shù)的觀眾和粉絲。其中,倆男倆女的故事情節(jié)成為了很多人鐘愛的題材之一。我們不妨來一起探索一下倆男倆女的動漫圖片圖庫,感受這個獨特的世界吧!
倆男倆女的戀愛故事向我們展示了不同性別之間的愛情和情感。這樣的故事通常會呈現(xiàn)出截然不同的個性和世界觀之間的碰撞與融合。讓我們一同欣賞這些特別的圖畫,感受其中的浪漫和甜蜜。
倆男倆女的動漫圖片圖庫中的情節(jié)往往能夠觸動觀眾的內(nèi)心深處,讓人們對愛情和情感產(chǎn)生共鳴。通過精心繪制的畫面和人物形象,這些故事能夠在觀眾心中營造出一種真實而深刻的情感體驗。
無論是幸福的時光還是遭遇挫折的瞬間,倆男倆女之間的情感糾葛和成長歷程都能夠讓觀眾感同身受。這樣的情感共鳴讓人們更加珍惜和理解愛情的真諦。
倆男倆女的故事不僅僅限于愛情,還常常展現(xiàn)出深厚的友誼和親情。伴隨著故事的發(fā)展,人物之間的情感關系也逐漸變得復雜而豐富。
朋友之間的默契、親人之間的牽掛,都體現(xiàn)了一個真實而溫暖的社會關系網(wǎng)絡。這樣的故事情節(jié)不僅讓觀眾產(chǎn)生共鳴,也提醒了我們珍惜身邊的關愛和陪伴。
倆男倆女的動漫圖片圖庫中也經(jīng)常涉及到人物的成長和自我探索。通過追溯他們的過去,觀察他們的成長軌跡,我們可以從中得到很多啟示和思考。
成長的道路并不平坦,每個人都會經(jīng)歷起起伏伏,經(jīng)歷各種困難和挑戰(zhàn)。倆男倆女的故事向我們展示了他們?nèi)绾瓮ㄟ^勇敢、堅持和不屈不撓的精神逐漸成長為更好的自己。
倆男倆女的動漫圖片圖庫既展示了情感故事,也涉及到了文化和多樣性的問題。在這個多元化的社會中,人們對于不同性取向和關系模式的接受程度也在逐漸提高。
通過倆男倆女動漫作品,我們能夠更加理解和尊重不同性別的愛情和生活方式。這樣的作品鼓勵人們欣賞和包容多樣性,為社會的進步和文明發(fā)展做出了貢獻。
倆男倆女的動漫圖片圖庫也是美術(shù)創(chuàng)作與表現(xiàn)的一大突破點。通過精湛的畫面和細膩的線條,藝術(shù)家們將人物形象和情感表達得淋漓盡致。
他們的創(chuàng)作靈感來自于真實社會和虛構(gòu)世界,融合了現(xiàn)實與想象,呈現(xiàn)出一種獨特的美學風格。這些作品既展示了藝術(shù)家們的才華,又為我們帶來了視覺上的享受。
倆男倆女的動漫圖片圖庫為我們呈現(xiàn)了一種獨特的視角和表達方式。通過這些作品,我們能夠更好地理解和感受愛情、友情、親情以及成長和探索的重要性。
同時,這樣的作品也推動了社會對于多樣性和包容性的認知和接受。希望未來會有更多優(yōu)秀的倆男倆女動漫作品涌現(xiàn)出來,為我們帶來更多感動和啟示。
歌曲名:倆倆相望 歌手:辛曉琪 專輯:楊佩佩精裝大戲主題曲II 倆倆相望 原唱:辛曉琪 拈朵微笑的花 想一番人世變換 到頭來輸贏又何妨 日與月共消長 富與貴難久長 今早的容顏老于昨晚 眉間放一字寬 看一段人世風光 誰不是把悲喜在嘗 海連天走不完 恩怨難計算 昨日非今日該忘 浪 滔滔 人渺渺 青春鳥 飛去了 縱然是千古風流浪里搖 風 瀟瀟 人渺渺 快意刀 山中草 愛恨的百般滋味隨風飄 歌曲鑒賞: 這首歌婉轉(zhuǎn)動聽,唱出了人世間的恩怨情仇。人們能在歌曲里找到自己的故事,印證自己的愛情。
在現(xiàn)代生活中,蠟燭燈蠟燭燈蠟燭燈雖然已經(jīng)不再是主流的照明設備,但是它在某些特定的場合下仍然具有很大的用處。本文將介紹蠟燭燈蠟燭燈蠟燭燈的應用和優(yōu)點。
在燭光晚會上使用蠟燭燈蠟燭燈蠟燭燈,可以營造出浪漫、溫馨的氛圍。在這樣的場合下,蠟燭燈蠟燭燈蠟燭燈可以作為主要的照明設備,為整個活動提供溫暖的光線。
在停電等突發(fā)事件發(fā)生時,蠟燭燈蠟燭燈蠟燭燈可以作為臨時的照明設備。由于它不需要電力,因此在這樣的場合下非常實用。
蠟燭燈蠟燭燈蠟燭燈在裝飾方面也非常實用。在一些重要的場合下,比如婚禮、生日等,使用蠟燭燈蠟燭燈蠟燭燈可以讓整個場面更加莊重、隆重。
蠟燭燈蠟燭燈蠟燭燈不需要電力,因此不會產(chǎn)生二氧化碳等有害氣體,對環(huán)境不會造成污染。同時,使用蠟燭燈蠟燭燈蠟燭燈也可以節(jié)約能源,為環(huán)保事業(yè)做出一份貢獻。
蠟燭燈蠟燭燈蠟燭燈的光線柔和、溫暖,可以改善室內(nèi)的氛圍,讓人感到更加舒適、放松。在一些需要營造浪漫、溫馨氛圍的場合下,蠟燭燈蠟燭燈蠟燭燈可以發(fā)揮出很大的作用。
蠟燭燈蠟燭燈蠟燭燈具有獨特的外觀和質(zhì)感,可以為室內(nèi)裝飾增加一份別樣的美感。在一些需要追求個性、獨特性的場合下,蠟燭燈蠟燭燈蠟燭燈也是非常實用的。
總之,雖然蠟燭燈蠟燭燈蠟燭燈已經(jīng)不再是主流的照明設備,但是它在某些特定的場合下仍然具有很大的用處。同時,蠟燭燈蠟燭燈蠟燭燈還具有節(jié)能環(huán)保、改善氛圍、獨特性等優(yōu)點,值得我們一試。
大家好,歡迎來到我的博客。今天我將為大家介紹有關蠟燭蠟燭燈的內(nèi)容。
蠟燭,是一種以蠟質(zhì)為主體、內(nèi)置蠟芯(燈芯)并點燃蠟芯進行燃燒而發(fā)光的裝置。它是人們生活中常見的光源之一,同時也具備輔助照明、裝飾和氛圍營造的功能。蠟燭通常由蠟資料、芯線和芯座三個主要部分組成。
蠟燭在古代被廣泛運用于照明,而在現(xiàn)代,雖然電燈等技術(shù)的發(fā)展已經(jīng)取代了蠟燭作為主要光源的地位,但是它仍然受到許多人喜愛。
蠟燭的歷史可以追溯到公元前3000年的古埃及時代。當時,通過將蜂蠟或動物脂肪制成的蠟燭點燃來產(chǎn)生光亮。此后,蠟燭在不同文明和時期的生活中扮演了重要的角色。
在古代,蠟燭不僅被用作照明工具,還被視為一種神圣的象征。在宗教儀式和慶典中,蠟燭經(jīng)常被點燃,象征著照亮心靈的力量和純潔。
現(xiàn)如今,蠟燭的種類繁多,根據(jù)不同的用途和特點,我們可以將其分為以下幾類:
除此之外,還有許多其他類型和款式的蠟燭,如芳香蠟燭、裝飾蠟燭等。
蠟燭燈是一種以蠟燭為光源的照明裝置。與傳統(tǒng)的蠟燭相比,蠟燭燈通過增加適合點燃的材料、改變外部結(jié)構(gòu)和加入保護措施等,使蠟燭的使用更加方便和安全。
蠟燭燈具有以下幾個特點:
在使用蠟燭時,我們需要注意以下幾點:
通過正確的使用和注意事項,我們可以更好地享受蠟燭帶來的美好體驗。
在現(xiàn)代科技高度發(fā)達的社會中,蠟燭和蠟燭燈作為源遠流長的照明工具依然被廣泛使用和喜愛。它們不僅給人們帶來光明和溫暖,也通過獨特的燭光營造出浪漫的氛圍。在我們忙碌的生活中,點燃一支蠟燭燈,讓自己感受到內(nèi)心的寧靜和美好。
謝謝大家閱讀我的博客,在評論區(qū)與我分享你們對蠟燭蠟燭燈的看法和使用心得吧!
曼徹斯特倆蛾是世界蛾類界的傳奇對決,它們的生態(tài)和行為一直引發(fā)著人們的興趣和驚嘆。這兩種蛾子,分別是曼徹斯特藍和曼徹斯特紅蛾,擁有強大而獨特的特征,使它們成為了學界和自然愛好者們的研究對象。
曼徹斯特藍蛾,科學上稱為Lepidoptera manchesterensis,是一種出現(xiàn)在曼徹斯特地區(qū)的稀有物種。它以其迷人的藍色翅膀而聞名,這種藍色是如此明亮和鮮艷,宛如正在跳舞的寶石。曼徹斯特藍蛾的發(fā)現(xiàn)地點并不多,一般只在雨林或森林的陰暗角落才能見到它們的身影。
與之相對的是曼徹斯特紅蛾,科學上稱為Lepidoptera manchesterensis rubrum,也是一種令人著迷的存在。雖然曼徹斯特紅蛾和藍蛾在生態(tài)上有著許多相似之處,但它們最大的區(qū)別在于顏色。曼徹斯特紅蛾的翅膀呈現(xiàn)出緋紅色,散發(fā)著一種神秘而妖艷的光芒,使人無法抗拒其吸引力。
曼徹斯特倆蛾在生態(tài)上有著相似的特征和行為模式。它們是夜行性動物,主要在黃昏過后才開始活動。這些蛾子依靠散發(fā)出的化學信息素來吸引異性,并進行繁殖。這是它們生命周期中最為關鍵的時刻,因為只有在繁殖時期,這些蛾子才能傳承下去。
它們的幼蟲階段也是十分有趣的。曼徹斯特倆蛾的幼蟲是食草動物,它們以特定的植物為食。根據(jù)研究發(fā)現(xiàn),曼徹斯特藍蛾的幼蟲主要以藍色花朵為食,而曼徹斯特紅蛾的幼蟲則以紅色花朵為食。這種對于特定顏色花朵的偏好是獨特而有趣的。
由于曼徹斯特倆蛾的獨特之處,它們一直受到著科學研究人員的關注。許多專家和學者致力于探索這兩種蛾子的生態(tài)、進化和遺傳學等方面。
在進化學上,曼徹斯特倆蛾的研究幫助我們了解了它們作為物種如何適應并生存下來的。它們的獨特外貌和行為模式是由于環(huán)境中特定的選擇壓力而形成的。通過對曼徹斯特倆蛾的基因組進行分析,科學家們揭示了它們在適應環(huán)境變化方面的基因調(diào)控機制。
另外,曼徹斯特倆蛾的研究也有助于我們理解生物多樣性的保護和管理。由于曼徹斯特倆蛾的稀有和珍貴,它們面臨著棲息地破壞和非法捕撈的威脅。科學家們通過研究它們的生態(tài)需求和繁殖習性,為其保護提供了科學依據(jù),并提出了相應的保護建議。
隨著科學技術(shù)的不斷發(fā)展,我們對曼徹斯特倆蛾的了解將不斷深入。未來,我們可能會通過基因編輯技術(shù)來培育更多外觀獨特的蛾子,以觀察它們的行為和生態(tài)特征。同時,科學家們也將加強對曼徹斯特倆蛾的保護工作,確保這兩種珍稀蛾子能夠在自然界中繼續(xù)繁衍生息。
曼徹斯特倆蛾的對決是自然界中一幕精彩的戲劇。無論是藍蛾的清新與紅蛾的妖艷,都在向我們展示著大自然的魅力和多樣性。希望我們能夠一直保持對曼徹斯特倆蛾的關注和研究,用科學的眼光去探索它們的奧秘。
倆納米芯片的新時代
倆納米芯片的新時代
倆納米芯片是當今科技領域最激動人心的突破之一。納米技術(shù)作為21世紀最具前沿的研究領域之一,為人類帶來了眾多的驚喜和突破。現(xiàn)在,科學家們已經(jīng)成功開發(fā)出倆納米芯片,這一突破將會徹底改變我們的生活。
什么是納米芯片?
首先,我們需要理解什么是納米芯片。納米芯片是由納米技術(shù)制造的集成電路芯片,其特點是尺寸非常小,僅為納米級別。納米級芯片通常由幾十億個二極管、晶體管和其他電子元件組成,這些元件都是微小到幾乎不可見的尺寸。
納米芯片的制造需要先進的光刻和電子束準直技術(shù),以及納米級別的材料工程。由于其尺寸小巧,納米芯片具有更高的集成度和更快的運算速度,同時功耗也更低。正是這些特點使得納米芯片在計算機、通信和物聯(lián)網(wǎng)等領域有著廣泛的應用。
倆納米芯片的突破
倆納米芯片的突破在于其材料和制造工藝的改進。通過使用最先進的納米技術(shù),科學家們成功地制造出了尺寸更小、性能更高的納米芯片。
首先,倆納米芯片采用了全新的材料。這種材料在納米級別上具有出色的電子特性,能夠?qū)崿F(xiàn)更高的導電性能和更低的電阻。同時,新材料還具有更好的熱傳導性能,可以更好地處理芯片散熱問題。
其次,倆納米芯片的制造工藝得到了突破性的提升。科學家們使用了更精密的光刻技術(shù)和更高效的電子束準直裝置,使得芯片的制造精度大大提升。這一突破使得倆納米芯片具備更高的性能和更穩(wěn)定的工作狀態(tài)。
倆納米芯片的應用前景
倆納米芯片的應用前景不可限量。由于其尺寸小巧且性能出色,納米芯片將推動電子設備和信息技術(shù)的發(fā)展。
首先,倆納米芯片的應用將推動智能手機和電腦等設備的性能升級。納米芯片的高集成度和快速運算能力將為用戶帶來更流暢的使用體驗,并支持更復雜的應用程序和功能。
其次,倆納米芯片將加速物聯(lián)網(wǎng)的發(fā)展。納米芯片可以嵌入到各種終端設備中,實現(xiàn)對物聯(lián)網(wǎng)設備的智能化控制和監(jiān)測。例如,通過嵌入納米芯片,可以實現(xiàn)智能家居的自動化控制,提升生活的便捷性和舒適度。
最后,倆納米芯片的應用還將推動人工智能和機器學習的發(fā)展。納米芯片具有更高的計算能力和更低的功耗,可以為人工智能算法提供更強大的計算支持。這將加速人工智能技術(shù)的進步,推動其在各個領域的應用。
結(jié)論
倆納米芯片的突破將會引領科技發(fā)展的新時代。納米技術(shù)是當今科技領域最具潛力的研究領域之一,而倆納米芯片的問世將為人類帶來更先進的電子設備和信息技術(shù)。
隨著納米芯片的應用不斷擴大,我們將迎來更加智能、便捷和高效的生活。同時,納米芯片的應用也將推動物聯(lián)網(wǎng)、人工智能等領域的發(fā)展。倆納米芯片的突破標志著納米技術(shù)正邁向一個新的里程碑,我們期待著未來科技的精彩呈現(xiàn)!
之前看了Mahout官方示例 20news 的調(diào)用實現(xiàn);于是想根據(jù)示例的流程實現(xiàn)其他例子。網(wǎng)上看到了一個關于天氣適不適合打羽毛球的例子。
訓練數(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)換成向量失敗!");
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());
}
}