在當(dāng)今數(shù)字化時代,音視頻開發(fā)和機(jī)器學(xué)習(xí)已經(jīng)成為IT行業(yè)中備受關(guān)注的熱門話題。作為技術(shù)領(lǐng)域中快速發(fā)展的兩大方向,音視頻開發(fā)和機(jī)器學(xué)習(xí)的結(jié)合不僅為我們帶來了全新的科技體驗,更在各個行業(yè)中展現(xiàn)出巨大的潛力。
音視頻開發(fā)是指利用計算機(jī)技術(shù)進(jìn)行音頻和視頻內(nèi)容的處理、編輯、傳輸和播放。隨著網(wǎng)絡(luò)帶寬的提升和智能手機(jī)等移動設(shè)備的普及,人們對于音視頻內(nèi)容的需求不斷增加,這也推動了音視頻開發(fā)技術(shù)的發(fā)展。無論是在線直播、短視頻應(yīng)用還是游戲開發(fā),音視頻開發(fā)都發(fā)揮著至關(guān)重要的作用。
機(jī)器學(xué)習(xí)是人工智能的一個重要分支,通過訓(xùn)練模型讓計算機(jī)從數(shù)據(jù)中學(xué)習(xí)并不斷優(yōu)化算法,以實現(xiàn)特定任務(wù)的自動化。隨著大數(shù)據(jù)的普及和計算能力的提升,機(jī)器學(xué)習(xí)技術(shù)正日益成為各行各業(yè)的必備技能。
將音視頻開發(fā)與機(jī)器學(xué)習(xí)相結(jié)合,可以為音視頻內(nèi)容的處理和分析帶來全新的可能性。通過機(jī)器學(xué)習(xí)算法,可以實現(xiàn)音視頻內(nèi)容的智能識別、內(nèi)容推薦和個性化定制,提升用戶體驗的同時也提高了生產(chǎn)效率。
然而,音視頻開發(fā)和機(jī)器學(xué)習(xí)的結(jié)合也面臨著一些挑戰(zhàn),比如數(shù)據(jù)的標(biāo)注和清洗、模型的訓(xùn)練和優(yōu)化等問題。但正是這些挑戰(zhàn),為我們帶來了更多的機(jī)遇。隨著技術(shù)的不斷進(jìn)步和應(yīng)用場景的拓展,音視頻開發(fā)和機(jī)器學(xué)習(xí)的融合將會引領(lǐng)新一波科技革命。
綜合來看,音視頻開發(fā)和機(jī)器學(xué)習(xí)的融合不僅僅是技術(shù)上的創(chuàng)新,更是對未來數(shù)字化世界的探索和呈現(xiàn)。隨著全球技術(shù)的飛速發(fā)展,我們有理由相信,音視頻開發(fā)和機(jī)器學(xué)習(xí)的結(jié)合將為我們帶來更加智能、便捷和豐富的生活體驗。
音視頻開發(fā)的職責(zé)是:
1、負(fù)責(zé)移動端音視頻SDK的產(chǎn)品化、場景化解決方案研發(fā);
2、參與多個應(yīng)用的多媒體相關(guān)架構(gòu)設(shè)計、開發(fā)、性能優(yōu)化等工作;
3、參與音視頻基礎(chǔ)模塊和組件的研發(fā)、維護(hù)和優(yōu)化。
程序員開發(fā)的職責(zé)是:
1、參與Android、IOS平臺下的APP應(yīng)用開發(fā)、上線和日常維護(hù)工作;
2、根據(jù)產(chǎn)品需求完成模塊設(shè)計、編碼、和bug修改等工作;
3、根據(jù)開發(fā)過程中的體驗對產(chǎn)品提出改進(jìn)意見;
4、改善軟件的易用性,提升用戶使用體驗 。
在今天的競爭激烈的互聯(lián)網(wǎng)行業(yè)中,找到一份滿意的開發(fā)工作并不容易。對于那些正在尋找機(jī)會的開發(fā)者來說,面試是一個關(guān)鍵的環(huán)節(jié)。面試官通常會對你的技術(shù)能力、項目經(jīng)驗和問題解決能力進(jìn)行考察。為了幫助你在互聯(lián)網(wǎng)開發(fā)面試中脫穎而出,我精選了一些常見的面試題,并給出了詳細(xì)的解析。
關(guān)鍵詞:前端路由
前端路由是一個重要的概念,它可以實現(xiàn)單頁應(yīng)用(SPA)的頁面切換功能。常見的前端路由庫有React Router、Vue Router等。在面試中,可能會被問到如何自己實現(xiàn)一個簡單的前端路由。
要實現(xiàn)一個簡單的前端路由,可以利用5的History API。使用pushState()方法可以將URL的改變添加到瀏覽歷史記錄中,然后可以通過popstate事件監(jiān)聽URL的變化,并根據(jù)URL進(jìn)行頁面跳轉(zhuǎn)。以下是一個簡單的示例:
window.onpopstate = function(event) {
// 根據(jù)event.state進(jìn)行頁面跳轉(zhuǎn)
};
var stateObj = { title: "page", url: "/page" };
history.pushState(stateObj, stateObj.title, stateObj.url);
關(guān)鍵詞:跨域
在互聯(lián)網(wǎng)開發(fā)中,跨域請求是一個常見的問題。由于瀏覽器的同源策略限制,不同域名、不同端口、不同協(xié)議之間的請求會被禁止。為了解決跨域問題,我們可以采用以下幾種方法:
關(guān)鍵詞:RESTful API
RESTful API是一種設(shè)計風(fēng)格,它將Web應(yīng)用程序的所有功能抽象為一組資源,并通過HTTP方法對資源進(jìn)行操作。在面試中,面試官可能會問你對RESTful API的理解以及如何設(shè)計一個符合RESTful風(fēng)格的API。
一個符合RESTful風(fēng)格的API應(yīng)該具備以下特點:
關(guān)鍵詞:前端性能優(yōu)化
在互聯(lián)網(wǎng)開發(fā)中,前端性能優(yōu)化是一個永恒的話題。優(yōu)化前端性能可以提升用戶體驗,降低服務(wù)器壓力。以下是一些常見的前端性能優(yōu)化技巧:
關(guān)鍵詞:前端安全
前端安全是保護(hù)Web應(yīng)用程序免受惡意攻擊的重要一環(huán)。在面試中,可能會收到與前端安全相關(guān)的問題。以下是一些常見的前端安全問題和對應(yīng)的解決方案:
如果你能對上述面試題給出準(zhǔn)確的回答,并展示出你在實際項目中的經(jīng)驗和解決問題的能力,相信你能在互聯(lián)網(wǎng)開發(fā)的面試中獲得成功。
作為一名網(wǎng)站編輯,我很高興能夠為您撰寫這篇關(guān)于前端開發(fā)經(jīng)典面試題的專業(yè)文章。前端開發(fā)是web開發(fā)的重要組成部分,涉及到網(wǎng)頁的展現(xiàn)和交互。對于前端開發(fā)崗位的求職者來說,掌握常見的前端面試題并能夠清晰地回答,無疑會大大增加入職的機(jī)會。
HTML 和 CSS 是前端開發(fā)的基礎(chǔ)知識,面試官通常會從這兩個方面測試應(yīng)聘者的功底。以下是一些常見的面試題:
JavaScript 作為前端開發(fā)的核心語言,面試官通常會從以下幾個方面測試應(yīng)聘者的熟練程度:
隨著前端框架和庫的流行,面試官也會針對常見的框架和庫進(jìn)行考察,例如:
以上就是一些前端開發(fā)常見的面試題,涉及到 HTML、CSS、JavaScript、框架等領(lǐng)域。作為一名前端開發(fā)工程師,掌握這些經(jīng)典題目并能夠深入解析,無疑會大大提升面試的成功率。希望這篇文章對您的面試準(zhǔn)備有所幫助,祝您前程似錦!
不要著急,可以向面式官表達(dá)嘗試回答問題的想法,然后可以說明這個領(lǐng)域你沒有接觸到,自己下來會認(rèn)真的去尋求答案,給面式管一個勤學(xué)上進(jìn)的印象。
在面式中,一道面式題不會是不會有太大影響的,有些面式本身就是壓力面式,看的就是你的臨場反應(yīng)能力。
Java開發(fā)面試題是在應(yīng)聘Java開發(fā)崗位時經(jīng)常會遇到的問題,它涵蓋了Java基礎(chǔ)知識、面向?qū)ο缶幊?、集合框架、多線程、IO流、異常處理、數(shù)據(jù)庫操作等各個方面。掌握這些面試題不僅有助于順利通過面試,還能夠加深對Java編程語言的理解,提升自身的編程能力。
在Java開發(fā)面試中,面試官通常會從基礎(chǔ)知識入手,考察應(yīng)聘者對Java語言的掌握程度。常見的問題包括:Java的特點和優(yōu)缺點、Java中基本數(shù)據(jù)類型、面向?qū)ο缶幊痰奶攸c、方法的重載和重寫、構(gòu)造器和靜態(tài)代碼塊的執(zhí)行順序等。掌握這些基礎(chǔ)知識對于順利通過面試至關(guān)重要。
面向?qū)ο缶幊淌荍ava開發(fā)中的核心概念,面試官會考察應(yīng)聘者對面向?qū)ο缶幊痰睦斫?。常見問題包括:什么是封裝、繼承和多態(tài),如何實現(xiàn)接口、抽象類的應(yīng)用場景、Java中的內(nèi)部類等。對面向?qū)ο缶幊淘淼氖煜こ潭戎苯佑绊懼鴳?yīng)聘者的面試表現(xiàn)。
Java的集合框架是開發(fā)中經(jīng)常使用的核心組件,面試中通常會涉及集合框架的相關(guān)問題。應(yīng)聘者需要了解集合框架的體系結(jié)構(gòu)、常用的集合類及其特點、集合類之間的區(qū)別、如何實現(xiàn)自定義的比較器等內(nèi)容。對集合框架的熟練掌握有助于應(yīng)聘者在面試中脫穎而出。
多線程是Java編程中的重要部分,面試官會考察應(yīng)聘者對多線程編程的了解程度。常見問題包括:線程的生命周期、線程的同步和互斥、線程池的原理、如何實現(xiàn)線程間通信等。對多線程編程的熟練掌握對于應(yīng)聘者的綜合能力考察至關(guān)重要。
IO流是Java中用于處理輸入輸出的重要部分,面試中經(jīng)常會涉及IO流的相關(guān)問題。應(yīng)聘者需要了解字節(jié)流和字符流的區(qū)別、不同類型的IO流、文件的輸入輸出操作、序列化與反序列化等內(nèi)容。對IO流的熟練應(yīng)用可以展現(xiàn)出應(yīng)聘者在實際開發(fā)中的能力。
異常處理是Java編程中不可或缺的部分,面試官會考察應(yīng)聘者對異常處理的掌握情況。常見問題包括:異常的分類、如何自定義異常、try-catch-finally塊的執(zhí)行順序、常見的異常類及其應(yīng)用等。對異常處理的熟練掌握能夠展現(xiàn)出應(yīng)聘者在程序健壯性方面的實力。
數(shù)據(jù)庫操作是Java開發(fā)中的常見任務(wù),面試中常常會考察應(yīng)聘者對數(shù)據(jù)庫操作的了解程度。應(yīng)聘者需要了解SQL語句的編寫、JDBC編程的基本流程、事務(wù)的特性和隔離級別、連接池的原理及其實現(xiàn)等內(nèi)容。對數(shù)據(jù)庫操作的熟練掌握有助于應(yīng)聘者在面試中展現(xiàn)出全面的技術(shù)能力。
綜上所述,掌握J(rèn)ava開發(fā)面試題不僅有助于應(yīng)聘者在面試中取得好成績,還能夠提升自身的編程水平和技術(shù)能力。希望通過本文的內(nèi)容能夠幫助到廣大Java開發(fā)人員,順利通過面試,實現(xiàn)職業(yè)發(fā)展的目標(biāo)。
感謝您閱讀本文,希望本文能為您在Java開發(fā)面試中提供幫助。
如果對方?jīng)]有公司,只是個體戶的話,是開不了抖音視頻,類似的是發(fā)票的,如果對方是公司付的話,可以要求在抬頭那里寫上視頻類目,然后就可以開具發(fā)票了
作為一名中級前端開發(fā)工程師,面試時常面臨各種棘手的面試題。這些問題不僅考察了面試者的專業(yè)知識儲備,也考驗了他們的問題分析和解決能力。為了幫助您更好地準(zhǔn)備這些面試問題,我們特別為您整理了一份中級前端開發(fā)常見面試題及詳細(xì)解答。通過系統(tǒng)學(xué)習(xí)這些面試題目,您不僅可以全面檢視自己的前端技能,還能針對性地進(jìn)行深入學(xué)習(xí),提升面試時的表現(xiàn)。
HTML和CSS是前端開發(fā)的基礎(chǔ),面試官常會就這兩項技術(shù)考察應(yīng)聘者的掌握程度。以下是一些典型的面試題:
語義化HTML是指使用恰當(dāng)?shù)腍TML標(biāo)簽來表達(dá)頁面的內(nèi)容結(jié)構(gòu),例如使用<h1>
-<h6>
標(biāo)簽來表示標(biāo)題,使用<p>
標(biāo)簽來表示段落,使用<ul>
或<ol>
標(biāo)簽來表示列表等。語義化HTML的好處包括:
CSS選擇器主要有以下幾種:
div
、p
等。特點是簡單易用,但選擇范圍較廣。.
開頭,如.container
。可復(fù)用性強(qiáng),但需要在HTML中添加類名。#
開頭,如#header
。specificity(特殊性)最高,但I(xiàn)D在頁面中應(yīng)該是唯一的。input[type="text"]
。可以精確定位元素,但不夠語義化。div p
。可以定位頁面結(jié)構(gòu)中的特定元素。>
分隔父子關(guān)系,如ul>li
。只會選擇直接子元素,更加精確。+
選擇緊鄰的兄弟元素,如h1+p
。~
選擇所有兄弟元素,如h1~p
。CSS盒模型描述了網(wǎng)頁元素如何計算大小和位置。標(biāo)準(zhǔn)盒模型中,元素的總寬度/高度等于content + padding + border,而IE盒模型中,元素的總寬度/高度等于content。也就是說,IE盒模型會將padding和border計入到content區(qū)域中。這種差異會在某些布局場景下產(chǎn)生不同的表現(xiàn)。為了統(tǒng)一處理,可以通過box-sizing
屬性切換盒模型。
JavaScript是前端開發(fā)的核心語言,面試中必然會涉及大量與JavaScript相關(guān)的問題。以下是一些重點內(nèi)容:
閉包是指一個函數(shù)能夠訪問并操作其外部函數(shù)作用域中的變量,即使外部函數(shù)已經(jīng)執(zhí)行結(jié)束。閉包的主要作用包括:
Promise是JavaScript中用于異步編程的一種解決方案。它解決了傳統(tǒng)回調(diào)函數(shù)嵌套過深(回調(diào)地獄)的問題,使異步代碼更加清晰、可讀性更強(qiáng)。Promise有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗)。通過Promise的then()
和catch()
方法,可以更好地處理異步操作的成功和失敗情況。
事件循環(huán)是JavaScript運(yùn)行的機(jī)制,負(fù)責(zé)監(jiān)視Call Stack和Task Queue(包括微任務(wù)隊列和宏任務(wù)隊列),按照先進(jìn)先出的原則執(zhí)行任務(wù)。具體工作機(jī)制如下:
隨著前端技術(shù)的快速發(fā)展,越來越多的前端框架如React、Vue、Angular等涌現(xiàn)。面試中通常會就這些流行框架考察應(yīng)聘者的掌握程度。以下是一些常見的面試題:
React組件有以下幾個主要生命周期階段:
constructor()
、static getDerivedStateFromProps()
、render()
和componentDidMount()
,組件創(chuàng)建時執(zhí)行。static getDerivedStateFromProps()
、shouldComponentUpdate()
、render()
、getSnapshotBeforeUpdate()
和componentDidUpdate()
,組件更新時執(zhí)行。componentWillUnmount()
,組件卸載時執(zhí)行。static getDerivedStateFromError()
和componentDidCatch()
,組件出錯時執(zhí)行。Vue實現(xiàn)雙向數(shù)據(jù)綁定的核心是利用了Object.defineProperty()方法。當(dāng)數(shù)據(jù)發(fā)生變化時,Vue會自動地更新視圖;當(dāng)用戶在視圖上做出修改時,數(shù)據(jù)也會自動地更新。具體原理如下:
Vuex是Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式。它的核心概念包括:
以上就是我為您整理的中級前端開發(fā)常見面試題及詳細(xì)解答。通過系統(tǒng)學(xué)習(xí)這些題目,相信您一定能夠提升自己的前端技能,在下次面試中表現(xiàn)出色。祝您好運(yùn)!
感謝您仔細(xì)閱讀完這篇文章,希望這些內(nèi)容對您的前端面試準(zhǔn)備有所幫助。如果您還有任何其他問題,歡迎隨時與我交流探討。祝您工作順利,前程似錦!
Vue.js是一款流行的 JavaScript 前端框架,在前端開發(fā)行業(yè)廣受歡迎。作為一名前端開發(fā)人員,掌握 Vue.js 的相關(guān)知識點并能夠應(yīng)對面試中常見的問題,對于求職和提高自身技能都非常重要。本文將從基礎(chǔ)知識、核心原理、常見問題等方面,為您整理并解答 Vue.js 前端開發(fā)面試題,幫助您更好地準(zhǔn)備面試。
Vue.js 是一個用于構(gòu)建用戶界面的漸進(jìn)式 JavaScript 框架。它的核心是一個反應(yīng)式的數(shù)據(jù)綁定系統(tǒng),可以非常簡單地開發(fā)出復(fù)雜的 Web 應(yīng)用程序。在這一部分,我們將介紹 Vue.js 的基礎(chǔ)知識,包括它的特點、組件、指令等。
Vue.js 的核心原理包括響應(yīng)式系統(tǒng)、虛擬 DOM、生命周期等。下面將分別介紹這些核心概念:
在 Vue.js 面試中,常會涉及以下幾類問題:
通過系統(tǒng)地學(xué)習(xí) Vue.js 相關(guān)知識,并結(jié)合實際開發(fā)經(jīng)驗,相信您一定能夠順利通過面試,為您的前端開發(fā)事業(yè)增添新的動力。
感謝您閱讀本文,希望這篇文章對您有所幫助。如果您還有任何其他問題,歡迎隨時與我交流探討。祝您前程似錦,事業(yè)有成!
之前看了Mahout官方示例 20news 的調(diào)用實現(xiàn);于是想根據(jù)示例的流程實現(xiàn)其他例子。網(wǎng)上看到了一個關(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
檢測數(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工具類進(jìn)行訓(xùn)練,得到訓(xùn)練模型。
3。將要檢測數(shù)據(jù)轉(zhuǎn)換成vector數(shù)據(jù)。
4. 分類器對vector數(shù)據(jù)進(jìn)行分類。
接下來貼下我的代碼實現(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工具類進(jìn)行訓(xùn)練,得到訓(xùn)練模型。
3。將要檢測數(shù)據(jù)轉(zhuǎn)換成vector數(shù)據(jù)。
4. 分類器對vector數(shù)據(jù)進(jìn)行分類。
這三步,代碼我就一次全貼出來;主要是兩個類 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) {
//將訓(xùn)練數(shù)據(jù)轉(zhuǎn)換成 vector數(shù)據(jù)
makeTrainVector();
//產(chǎn)生訓(xù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("文件序列化失?。?#34;);
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)換成向量失?。?#34;);
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("檢測數(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());
}
}