A. GetLength(this string str)參數加this有什麼用
文字來源:MSDN---擴展方法(C# 編程指南)擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this 修飾符為前綴。僅當您使用 using 指令將命名空間顯式導入到源代碼中之後,擴展方法才位於范圍中。下面的示例演示為 System..::.String 類定義的一個擴展方法。請注意,它是在非嵌套、非泛型靜態類內部定義的:namespace ExtensionMethods{public static class MyExtensions{public static int wordCount(this String str){return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;}}} 可使用以下 using 指令將 WordCount 擴展方法放入范圍中:using ExtensionMethods;而且,可以在應用程序中使用以下語法對該擴展方法進行調用:string s = "Hello Extension Methods"; int i = s.WordCount();在代碼中,可以使用實例方法語法調用該擴展方法。但是,編譯器生成的中間語言 (IL) 會將代碼轉換為對靜態方法的調用。因此,並未真正違反封裝原則。實際上,擴展方法無法訪問它們所擴展的類型中的私有變數。通用准則 通常,建議您只在不得已的情況下才實現擴展方法,並謹慎地實現。只要有可能,必須擴展現有類型的客戶端代碼都應該通過創建從現有類型派生的新類型來達到這一目的。有關更多信息,請參見繼承(C# 編程指南)。在使用擴展方法來擴展您無法更改其源代碼的類型時,您需要承受該類型實現中的更改會導致擴展方法失效的風險。如果您確實為給定類型實現了擴展方法,請記住以下兩點:如果擴展方法與該類型中定義的方法具有相同的簽名,則擴展方法永遠不會被調用。擴展方法被在命名空間級別放入范圍中。例如,如果您在同一個名為 Extensions 的命名空間中具有多個包含擴展方法的靜態類,則這些擴展方法將全部由 using Extensions; 指令放入范圍中。類庫的實施者不應使用擴展方法來避免創建程序集的新版本。
B. 大家對spark的源碼了解多少,sparkshuffle,調度,sparkstreaming的源碼
流(Streaming),在大數據時代為數據流處理,就像水流一樣,是數據流;既然是數據流處理,就會想到數據的流入、數據的加工、數據的流出。
日常工作、生活中數據來源很多不同的地方。例如:工業時代的汽車製造、監控設備、工業設備會產生很多源數據;信息時代的電商網站、日誌伺服器、社交網路、金融交易系統、黑客攻擊、垃圾郵件、交通監控等;通信時代的手機、平板、智能設備、物聯網等會產生很多實時數據,數據流無處不在。
在大數據時代SparkStreaming能做什麼?
平時用戶都有網上購物的經歷,用戶在網站上進行的各種操作通過Spark Streaming流處理技術可以被監控,用戶的購買愛好、關注度、交易等可以進行行為分析。在金融領域,通過Spark Streaming流處理技術可以對交易量很大的賬號進行監控,防止罪犯洗錢、財產轉移、防欺詐等。在網路安全性方面,黑客攻擊時有發生,通過Spark Streaming流處理技術可以將某類可疑IP進行監控並結合機器學習訓練模型匹配出當前請求是否屬於黑客攻擊。其他方面,如:垃圾郵件監控過濾、交通監控、網路監控、工業設備監控的背後都是Spark Streaming發揮強大流處理的地方。
大數據時代,數據價值一般怎麼定義?
所有沒經過流處理的數據都是無效數據或沒有價值的數據;數據產生之後立即處理產生的價值是最大的,數據放置越久或越滯後其使用價值越低。以前絕大多數電商網站盈利走的是網路流量(即用戶的訪問量),如今,電商網站不僅僅需要關注流量、交易量,更重要的是要通過數據流技術讓電商網站的各種數據流動起來,通過實時流動的數據及時分析、挖掘出各種有價值的數據;比如:對不同交易量的用戶指定用戶畫像,從而提供不同服務質量;准對用戶訪問電商網站板塊愛好及時推薦相關的信息。
SparkStreaming VSHadoopMR:
Spark Streaming是一個准實時流處理框架,而Hadoop MR是一個離線、批處理框架;很顯然,在數據的價值性角度,Spark Streaming完勝於Hadoop MR。
SparkStreaming VS Storm:
Spark Streaming是一個准實時流處理框架,處理響應時間一般以分鍾為單位,也就是說處理實時數據的延遲時間是秒級別的;Storm是一個實時流處理框架,處理響應是毫秒級的。所以在流框架選型方面要看具體業務場景。需要澄清的是現在很多人認為Spark Streaming流處理運行不穩定、數據丟失、事務性支持不好等等,那是因為很多人不會駕馭Spark Streaming及Spark本身。在Spark Streaming流處理的延遲時間方面,Spark定製版本,會將Spark Streaming的延遲從秒級別推進到100毫秒之內甚至更少。
SparkStreaming優點:
1、提供了豐富的API,企業中能快速實現各種復雜的業務邏輯。
2、流入Spark Streaming的數據流通過和機器學習演算法結合,完成機器模擬和圖計算。
3、Spark Streaming基於Spark優秀的血統。
SparkStreaming能不能像Storm一樣,一條一條處理數據?
Storm處理數據的方式是以條為單位來一條一條處理的,而Spark Streaming基於單位時間處理數據的,SparkStreaming能不能像Storm一樣呢?答案是:可以的。
業界一般的做法是Spark Streaming和Kafka搭檔即可達到這種效果,入下圖:
總結:
使用Spark Streaming可以處理各種數據來源類型,如:資料庫、HDFS,伺服器log日誌、網路流,其強大超越了你想像不到的場景,只是很多時候大家不會用,其真正原因是對Spark、spark streaming本身不了解。
C. hadoop hdfs 源碼怎麼看
在使用Hadoop的過程中,很容易通過FileSystem類的API來讀取HDFS中的文件內容,讀取內容的過程是怎樣的呢?今天來分析客戶端讀取HDFS文件的過程,下面的一個小程序完成的功能是讀取HDFS中某個目錄下的文件內容,然後輸出到控制台,代碼如下:
[java] view plain
public class LoadDataFromHDFS {
public static void main(String[] args) throws IOException {
new LoadDataFromHDFS().loadFromHdfs("hdfs://localhost:9000/user/wordcount/");
}
public void loadFromHdfs(String hdfsPath) throws IOException {
Configuration conf = new Configuration();
Path hdfs = new Path(hdfsPath);
FileSystem in = FileSystem.get(conf);
//in = FileSystem.get(URI.create(hdfsPath), conf);//這兩行都會創建一個DistributedFileSystem對象
FileStatus[] status = in.listStatus(hdfs);
for(int i = 0; i < status.length; i++) {
byte[] buff = new byte[1024];
FSDataInputStream inputStream = in.open(status[i].getPath());
while(inputStream.read(buff) > 0) {
System.out.print(new String(buff));
}
inputStream.close();
}
}
}
FileSystem in = FileSystem.get(conf)這行代碼創建一個DistributedFileSystem,如果直接傳入一個Configuration類型的參數,那麼默認會讀取屬性fs.default.name的值,根據這個屬性的值創建對應的FileSystem子類對象,如果沒有配置fs.default.name屬性的值,那麼默認創建一個org.apache.hadoop.fs.LocalFileSystem類型的對象。但是這里是要讀取HDFS中的文件,所以在core-site.xml文件中配置fs.default.name屬性的值為hdfs://localhost:9000,這樣FileSystem.get(conf)返回的才是一個DistributedFileSystem類的對象。 還有一種創建DistributedFileSystem這種指定文件系統類型對像的方法是使用FileSystem.get(Configuration conf)的一個重載方法FileSystem.get(URI uri, Configuration),其實調用第一個方法時在FileSystem類中先讀取conf中的屬性fs.default.name的值,再調用的FileSystem.get(URI uri, Configuration)方法。
D. python gensim怎麼用word2vect
詞向量(word2vec)原始的代碼是C寫的,python也有對應的版本,被集成在一個非常牛逼的框架gensim中。
我在自己的開源語義網路項目graph-mind(其實是我自己寫的小玩具)中使用了這些功能,大家可以直接用我在上面做的進一步的封裝傻瓜式地完成一些操作,下面分享調用方法和一些code上的心得。
1.一些類成員變數:
[python]view plain
def__init__(self,modelPath,_size=100,_window=5,_minCount=1,_workers=multiprocessing.cpu_count()):
self.modelPath=modelPath
self._size=_size
self._window=_window
self._minCount=_minCount
self._workers=_workers
modelPath是word2vec訓練模型的磁碟存儲文件(model在內存中總是不踏實),_size是詞向量的維度,_window是詞向量訓練時的上下文掃描窗口大小,後面那個不知道,按默認來,_workers是訓練的進程數(需要更精準的解釋,請指正),默認是當前運行機器的處理器核數。這些參數先記住就可以了。
2.初始化並首次訓練word2vec模型
完成這個功能的核心函數是initTrainWord2VecModel,傳入兩個參數:corpusFilePath和safe_model,分別代表訓練語料的路徑和是否選擇「安全模式」進行初次訓練。關於這個「安全模式」後面會講,先看代碼:
[python]view plain
definitTrainWord2VecModel(self,corpusFilePath,safe_model=False):
'''''
initandtrainaneww2vmodel
(,
aboutsoft_model:
ifsafe_modelistrue,,
andthiscankeeptheusageofos'smemorysafebutslowly.
andifsafe_modelisfalse,
.)
'''
extraSegOpt().reLoadEncoding()
fileType=localFileOptUnit.checkFileState(corpusFilePath)
iffileType==u'error':
warnings.warn('loadfileerror!')
returnNone
else:
model=None
iffileType==u'opened':
print('trainingmodelfromsingleFile!')
model=Word2Vec(LineSentence(corpusFilePath),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)
eliffileType==u'file':
corpusFile=open(corpusFilePath,u'r')
print('trainingmodelfromsingleFile!')
model=Word2Vec(LineSentence(corpusFile),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)
eliffileType==u'directory':
corpusFiles=localFileOptUnit.listAllFileInDirectory(corpusFilePath)
print('!')
ifsafe_model==True:
model=Word2Vec(LineSentence(corpusFiles[0]),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)
forfileincorpusFiles[1:len(corpusFiles)]:
model=self.updateW2VModelUnit(model,file)
else:
sentences=self.loadSetencesFromFiles(corpusFiles)
model=Word2Vec(sentences,size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)
eliffileType==u'other':
#TODOaddsentenceslistdirectly
pass
model.save(self.modelPath)
model.init_sims()
print('procingword2vecmodel...ok!')
returnmodel
首先是一些雜七雜八的,判斷一下輸入文件路徑下訪問結果的類型,根據不同的類型做出不同的文件處理反應,這個大家應該能看懂,以corpusFilePath為一個已經打開的file對象為例,創建word2vec model的代碼為:
[python]view plain
model=Word2Vec(LineSentence(corpusFilePath),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)
其實就是這么簡單,但是為了代碼健壯一些,就變成了上面那麼長。問題是在面對一個路徑下的許多訓練文檔且數目巨大的時候,一次性載入內存可能不太靠譜了(沒有細研究gensim在Word2Vec構造方法中有沒有考慮這個問題,只是一種習慣性的警惕),於是我設定了一個參數safe_model用於判斷初始訓練是否開啟「安全模式」,所謂安全模式,就是最初只載入一篇語料的內容,後面的初始訓練文檔通過增量式學習的方式,更新到原先的model中。
上面的代碼里,corpusFilePath可以傳入一個已經打開的file對象,或是一個單個文件的地址,或一個文件夾的路徑,通過函數checkFileState已經做了類型的判斷。另外一個函數是updateW2VModelUnit,用於增量式訓練更新w2v的model,下面會具體介紹。loadSetencesFromFiles函數用於載入一個文件夾中全部語料的所有句子,這個在源代碼里有,很簡單,哥就不多說了。
3.增量式訓練更新word2vec模型
增量式訓練w2v模型,上面提到了一個這么做的原因:避免把全部的訓練語料一次性載入到內存中。另一個原因是為了應對語料隨時增加的情況。gensim當然給出了這樣的solution,調用如下:
[python]view plain
defupdateW2VModelUnit(self,model,corpusSingleFilePath):
'''''
(onlycanbeasingleFile)
'''
fileType=localFileOptUnit.checkFileState(corpusSingleFilePath)
iffileType==u'directory':
warnings.warn('cannotdealadirectory!')
returnmodel
iffileType==u'opened':
trainedWordCount=model.train(LineSentence(corpusSingleFilePath))
print('updatemodel,updatewordsnumis:'+trainedWordCount)
eliffileType==u'file':
corpusSingleFile=open(corpusSingleFilePath,u'r')
trainedWordCount=model.train(LineSentence(corpusSingleFile))
print('updatemodel,updatewordsnumis:'+trainedWordCount)
else:
#TODOaddsentenceslistdirectly(sameaslastfunction)
pass
returnmodel
簡單檢查文件type之後,調用model對象的train方法就可以實現對model的更新,這個方法傳入的是新語料的sentences,會返回模型中新增詞彙的數量。函數全部執行完後,return更新後的model,源代碼中在這個函數下面有能夠處理多類文件參數(同2)的增強方法,這里就不多介紹了。
4.各種基礎查詢
當你確定model已經訓練完成,不會再更新的時候,可以對model進行鎖定,並且據說是預載了相似度矩陣能夠提高後面的查詢速度,但是你的model從此以後就read only了。
[python]view plain
deffinishTrainModel(self,modelFilePath=None):
'''''
warning:afterthis,themodelisread-only(can'tbeupdate)
'''
ifmodelFilePath==None:
modelFilePath=self.modelPath
model=self.loadModelfromFile(modelFilePath)
model.init_sims(replace=True)
可以看到,所謂的鎖定模型方法,就是init_sims,並且把裡面的replace參數設定為True。
然後是一些word2vec模型的查詢方法:
[python]view plain
defgetWordVec(self,model,wordStr):
'''''
gettheword'
'''
returnmodel[wordStr]
[python]view plain
defqueryMostSimilarWordVec(self,model,wordStr,topN=20):
'''''
return2-dimList[0]isword[1]isdouble-prob
'''
similarPairList=model.most_similar(wordStr.decode('utf-8'),topn=topN)
returnsimilarPairList
[python]view plain
defculSimBtwWordVecs(self,model,wordStr1,wordStr2):
'''''
returndouble-prob
'''
similarValue=model.similarity(wordStr1.decode('utf-8'),wordStr2.decode('utf-8'))
returnsimilarValue
上述方法都很簡單,基本上一行解決,在源代碼中,各個函數下面依然是配套了相應的model文件處理版的函數。其中,getWordVec是得到查詢詞的word2vec詞向量本身,列印出來是一個純數字的array;queryMostSimilarWordVec是得到與查詢詞關聯度最高的N個詞以及對應的相似度,返回是一個二維list(注釋裡面寫的蠻清楚);culSimBtwWordVecs是得到兩個給定詞的相似度值,直接返回double值。
5.Word2Vec詞向量的計算
研究過w2v理論的童鞋肯定知道詞向量是可以做加減計算的,基於這個性質,gensim給出了相應的方法,調用如下:
[python]view plain
(self,model,posWordStrList,negWordStrList,topN=20):
'''''
pos-neg
return2-dimList[0]isword[1]isdouble-prob
'''
posWordList=[]
negWordList=[]
forwordStrinposWordStrList:
posWordList.append(wordStr.decode('utf-8'))
forwordStrinnegWordStrList:
negWordList.append(wordStr.decode('utf-8'))
pnSimilarPairList=model.most_similar(positive=posWordList,negative=negWordList,topn=topN)
returnpnSimilarPairList
由於用的是py27,所以之前對傳入的詞列表數據進行編碼過濾,這裡面posWordList可以認為是對結果產生正能量的詞集,negWordList則是對結果產生負能量的詞集,同時送入most_similar方法,在設定return答案的topN,得到的返回結果形式同4中的queryMostSimilarWordVec函數,大家可以這樣數學地理解這個操作:
下面一個操作是我自創的,假設我想用上面詞向量topN「詞-關聯度」的形式展現兩個詞或兩組詞之間的關聯,我是這么做的:
[python]view plain
(self,model,wordStrList1,wordStrList2,topN_rev=20,topN=20):
'''''
-wordListandtag-wordList
first,usethetag-wordListasneg-wordListtogettherev-wordList,
thenusethescr-wordListandtherev-wordListasthenewsrc-tag-wordList
topN_revistopNofrev-
'''
srcWordList=[]
tagWordList=[]
srcWordList.extend(wordStr.decode('utf-8')forwordStrinwordStrList1)
tagWordList.extend(wordStr.decode('utf-8')forwordStrinwordStrList2)
revSimilarPairList=self.queryMSimilarVecswithPosNeg(model,[],tagWordList,topN_rev)
revWordList=[]
revWordList.extend(pair[0].decode('utf-8')forpairinrevSimilarPairList)
stSimilarPairList=self.queryMSimilarVecswithPosNeg(model,srcWordList,revWordList,topN)
returnstSimilarPairList
這個操作的思路就是,首先用兩組詞中的一組作為negWordList,傳入上面的queryMSimilarVecswithPosNeg函數,得到topN一組的中轉詞,在使用這些中轉詞與原先的另一組詞進行queryMSimilarVecswithPosNeg操作,很容易理解,第一步得到的是一組詞作為negWordList的反向結果,再通過這個反向結果與另一組詞得到「負負得正」的效果。這樣就可以通過一組topN的「詞-關聯度」配對List表示兩組詞之間的關系。