真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

topn函數(shù)python topn算法java

OBIEE 排序函數(shù) TopN()、BottomN() 和 Rank()

OBIEE 中有一些聚合函數(shù)可以對事實(shí)表的數(shù)據(jù)進(jìn)行排序,比如 Max() 、 Min() 、 Median() 分別可以取最大值、最小值、中間值。而函數(shù) Rank() 可以對某一數(shù)值列進(jìn)行排序,并返回整數(shù)型的序號; TopN() 和 BottomN() 不僅可以對某一數(shù)值列進(jìn)行排序返回整數(shù)型序號,還可以只返回固定的行數(shù)。由于 TopN() 和 BottomN() 功能類似只不過一個升序一個降序,下文中只用 TopN() 做示例。

創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、羅山網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為羅山等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

一、 Rank() 和 TopN() 兩個函數(shù)的介紹:

二、 用法示例:

在分析中拖拽同一個數(shù)值列,分別對其編寫 TopN() 和 Rank() 公式:

得到并查看結(jié)果??梢钥吹?, TopN() 和 Rank() 返回的是序號,并且結(jié)果集按照 TopN() 的表達(dá)式,只取了最大的前 10 行數(shù)據(jù),并且 TopN() 和 Rank() 的排序結(jié)果是一致的:

jieba分詞(R vs. python)

自然語言處理(NLP)是機(jī)器學(xué)習(xí)重要分支之一,主要應(yīng)用于篇章理解、文本摘要、情感分析、知識圖譜、文本翻譯等領(lǐng)域。而NLP應(yīng)用首先是對文本進(jìn)行分詞,當(dāng)前中文分詞器有Ansj、paoding、盤古分詞等多種,而最基礎(chǔ)的分詞器應(yīng)該屬于jieba分詞器(比較見下圖)。

下面將分別應(yīng)用R和python對jieba分詞器在中文分詞、詞性標(biāo)注和關(guān)鍵詞提取領(lǐng)域的應(yīng)用進(jìn)行比較。

R實(shí)現(xiàn)

通過函數(shù)worker()來初始化分詞引擎,使用segment()進(jìn)行分詞。有四種分詞模式:最大概率法(MP)、隱馬爾科夫模型(HMM)、混合模型(Mix)及索引模型(query),默認(rèn)為混合模型。具體可查看help(worker).

#install.packages('jiebaR')library(jiebaR)mixseg - worker()segment( "這是一段測試文本" , mixseg ) #或者用以下操作mixseg['這是一段測試文本']mixseg = "這是一段測試文本"

python實(shí)現(xiàn)

python中需安裝jieba庫,運(yùn)用jieba.cut實(shí)現(xiàn)分詞。cut_all參數(shù)為分詞類型,默認(rèn)為精確模式。

import jiebaseg_list = jieba.cut(u"這是一段測試文本",cut_all = False)print("Full mode: "+ ",".join(seg_list))? #默認(rèn)精確模式

無論是R還是python都為utf—8編碼。

R實(shí)現(xiàn)

可以使用=.tagger 或者tag 來進(jìn)行分詞和詞性標(biāo)注,詞性標(biāo)注使用混合模型模型分詞,標(biāo)注采用和 ictclas 兼容的標(biāo)記法。

words = "我愛北京天安門"tagger = worker("tag") #開啟詞性標(biāo)注啟發(fā)器tagger = words? ? #? ? r? ? ? ? v? ? ? ns? ? ? ns? ? # "我"? ? "愛"? "北京" "天安門"

python實(shí)現(xiàn)

#詞性標(biāo)注import jieba.posseg as psegwords = pseg.cut("我愛北京天安門")for word,flag in words:? ? print('%s, %s' %(word,flag))

R實(shí)現(xiàn)

R關(guān)鍵詞提取使用逆向文件頻率(IDF)文本語料庫,通過worker參數(shù)“keywords”開啟關(guān)鍵詞提取啟發(fā)器,topn參數(shù)為關(guān)鍵詞的個數(shù)。

keys = worker("keywords",topn = 5, idf = IDFPATH)keys = "會議邀請到美國密歇根大學(xué)(University of Michigan, Ann Arbor)環(huán)境健康科學(xué)系副教授奚傳武博士作題為“Multibarrier approach for safe drinking waterin the US : Why it failed in Flint”的學(xué)術(shù)講座,介紹美國密歇根Flint市飲用水污染事故的發(fā)生發(fā)展和處置等方面內(nèi)容。講座后各相關(guān)單位同志與奚傳武教授就生活飲用水在線監(jiān)測系統(tǒng)、美國水污染事件的處置方式、生活飲用水老舊管網(wǎng)改造、如何有效減少消毒副產(chǎn)物以及美國涉水產(chǎn)品和二次供水單位的監(jiān)管模式等問題進(jìn)行了探討和交流。本次交流會是我市生活飲用水衛(wèi)生管理工作洽商機(jī)制運(yùn)行以來的又一次新嘗試,也為我市衛(wèi)生計生綜合監(jiān)督部門探索生活飲用水衛(wèi)生安全管理模式及突發(fā)水污染事件的應(yīng)對措施開拓了眼界和思路。"#結(jié)果:#? ? ? ? 48.8677? ? ? ? 23.4784? ? ? ? 22.1402? ? ? ? 20.326? ? ? ? 18.5354 #? ? ? "飲用水"? ? ? ? "Flint"? ? ? ? "衛(wèi)生"? ? ? "水污染"? ? ? ? "生活"

python實(shí)現(xiàn)

python實(shí)現(xiàn)關(guān)鍵詞提取可運(yùn)用TF-IDF方法和TextRank方法。allowPOS參數(shù)為限定范圍詞性類型。

#關(guān)鍵詞提取import jieba.analysecontent = u'會議邀請到美國密歇根大學(xué)(University of Michigan, Ann Arbor)環(huán)境健康科學(xué)系副教授奚傳武博士作題為“Multibarrier approach for safe drinking waterin the US : Why it failed in Flint”的學(xué)術(shù)講座,介紹美國密歇根Flint市飲用水污染事故的發(fā)生發(fā)展和處置等方面內(nèi)容。講座后各相關(guān)單位同志與奚傳武教授就生活飲用水在線監(jiān)測系統(tǒng)、美國水污染事件的處置方式、生活飲用水老舊管網(wǎng)改造、如何有效減少消毒副產(chǎn)物以及美國涉水產(chǎn)品和二次供水單位的監(jiān)管模式等問題進(jìn)行了探討和交流。本次交流會是我市生活飲用水衛(wèi)生管理工作洽商機(jī)制運(yùn)行以來的又一次新嘗試,也為我市衛(wèi)生計生綜合監(jiān)督部門探索生活飲用水衛(wèi)生安全管理模式及突發(fā)水污染事件的應(yīng)對措施開拓了眼界和思路。'#基于TF-IDFkeywords = jieba.analyse.extract_tags(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords:? ? ? ? print item[0],item[1]? #基于TF-IDF結(jié)果# 飲用水 0.448327672795# Flint 0.219353532163# 衛(wèi)生 0.203120821773# 水污染 0.186477211628# 生活 0.170049997544

#基于TextRankkeywords = jieba.analyse.textrank(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords:? ? ? ? print item[0],item[1]? ? #基于TextRank結(jié)果:# 飲用水 1.0# 美國 0.570564785973# 奚傳武 0.510738424509# 單位 0.472841889334# 講座 0.443770732053

寫在文后

自然語言處理(NLP)在數(shù)據(jù)分析領(lǐng)域有其特殊的應(yīng)用,在R中除了jiebaR包,中文分詞Rwordseg包也非常常用。一般的文本挖掘步驟包括:文本獲?。ㄖ饕镁W(wǎng)絡(luò)爬?。谋咎幚恚ǚ衷~、詞性標(biāo)注、刪除停用詞等)——文本分析(主題模型、情感分析)——分析可視化(詞云、知識圖譜等)。本文是自然語言處理的第一篇,后續(xù)將分別總結(jié)下應(yīng)用深度學(xué)習(xí)Word2vec進(jìn)行詞嵌入以及主題模型、情感分析的常用NLP方法。

參考資料

Introduction · jiebaR 中文分詞

知乎:【文本分析】利用jiebaR進(jìn)行中文分詞

雪晴數(shù)據(jù)網(wǎng):全棧數(shù)據(jù)工程師養(yǎng)成攻略

搜狗實(shí)驗(yàn)室,詞性標(biāo)注應(yīng)用

【R文本挖掘】中文分詞Rwordseg

使用word2vec計算詞向量之間的相似度

string為你需要獲取向量的詞,

double[] array = vec.getWordVector(string);

array是這個詞的向量。

首先在創(chuàng)建vec的時候要保證.minWordFrequency(1),否則有些詞你是得不到向量的,這個方法是設(shè)置詞的最小使用頻率。

python gensim怎么用word2vect

詞向量(word2vec)原始的代碼是C寫的,python也有對應(yīng)的版本,被集成在一個非常牛逼的框架gensim中。

我在自己的開源語義網(wǎng)絡(luò)項(xiàng)目graph-mind(其實(shí)是我自己寫的小玩具)中使用了這些功能,大家可以直接用我在上面做的進(jìn)一步的封裝傻瓜式地完成一些操作,下面分享調(diào)用方法和一些code上的心得。

1.一些類成員變量:

[python]?view plain?copy

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訓(xùn)練模型的磁盤存儲文件(model在內(nèi)存中總是不踏實(shí)),_size是詞向量的維度,_window是詞向量訓(xùn)練時的上下文掃描窗口大小,后面那個不知道,按默認(rèn)來,_workers是訓(xùn)練的進(jìn)程數(shù)(需要更精準(zhǔn)的解釋,請指正),默認(rèn)是當(dāng)前運(yùn)行機(jī)器的處理器核數(shù)。這些參數(shù)先記住就可以了。

2.初始化并首次訓(xùn)練word2vec模型

完成這個功能的核心函數(shù)是initTrainWord2VecModel,傳入兩個參數(shù):corpusFilePath和safe_model,分別代表訓(xùn)練語料的路徑和是否選擇“安全模式”進(jìn)行初次訓(xùn)練。關(guān)于這個“安全模式”后面會講,先看代碼:

[python]?view plain?copy

def?initTrainWord2VecModel(self,?corpusFilePath,?safe_model=False):

'''''

init?and?train?a?new?w2v?model

(corpusFilePath?can?be?a?path?of?corpus?file?or?directory?or?a?file?directly,?in?some?time?it?can?be?sentences?directly

about?soft_model:

if?safe_model?is?true,?the?process?of?training?uses?update?way?to?refresh?model,

and?this?can?keep?the?usage?of?os's?memory?safe?but?slowly.

and?if?safe_model?is?false,?the?process?of?training?uses?the?way?that?load?all

corpus?lines?into?a?sentences?list?and?train?them?one?time.)

'''

extraSegOpt().reLoadEncoding()

fileType?=?localFileOptUnit.checkFileState(corpusFilePath)

if?fileType?==?u'error':

warnings.warn('load?file?error!')

return?None

else:

model?=?None

if?fileType?==?u'opened':

print('training?model?from?singleFile!')

model?=?Word2Vec(LineSentence(corpusFilePath),?size=self._size,?window=self._window,?min_count=self._minCount,?workers=self._workers)

elif?fileType?==?u'file':

corpusFile?=?open(corpusFilePath,?u'r')

print('training?model?from?singleFile!')

model?=?Word2Vec(LineSentence(corpusFile),?size=self._size,?window=self._window,?min_count=self._minCount,?workers=self._workers)

elif?fileType?==?u'directory':

corpusFiles?=?localFileOptUnit.listAllFileInDirectory(corpusFilePath)

print('training?model?from?listFiles?of?directory!')

if?safe_model?==?True:

model?=?Word2Vec(LineSentence(corpusFiles[0]),?size=self._size,?window=self._window,?min_count=self._minCount,?workers=self._workers)

for?file?in?corpusFiles[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)

elif?fileType?==?u'other':

#?TODO?add?sentences?list?directly

pass

model.save(self.modelPath)

model.init_sims()

print('producing?word2vec?model?...?ok!')

return?model

首先是一些雜七雜八的,判斷一下輸入文件路徑下訪問結(jié)果的類型,根據(jù)不同的類型做出不同的文件處理反應(yīng),這個大家應(yīng)該能看懂,以corpusFilePath為一個已經(jīng)打開的file對象為例,創(chuàng)建word2vec model的代碼為:

[python]?view plain?copy

model?=?Word2Vec(LineSentence(corpusFilePath),?size=self._size,?window=self._window,?min_count=self._minCount,?workers=self._workers)

其實(shí)就是這么簡單,但是為了代碼健壯一些,就變成了上面那么長。問題是在面對一個路徑下的許多訓(xùn)練文檔且數(shù)目巨大的時候,一次性載入內(nèi)存可能不太靠譜了(沒有細(xì)研究gensim在Word2Vec構(gòu)造方法中有沒有考慮這個問題,只是一種習(xí)慣性的警惕),于是我設(shè)定了一個參數(shù)safe_model用于判斷初始訓(xùn)練是否開啟“安全模式”,所謂安全模式,就是最初只載入一篇語料的內(nèi)容,后面的初始訓(xùn)練文檔通過增量式學(xué)習(xí)的方式,更新到原先的model中。

上面的代碼里,corpusFilePath可以傳入一個已經(jīng)打開的file對象,或是一個單個文件的地址,或一個文件夾的路徑,通過函數(shù)checkFileState已經(jīng)做了類型的判斷。另外一個函數(shù)是updateW2VModelUnit,用于增量式訓(xùn)練更新w2v的model,下面會具體介紹。loadSetencesFromFiles函數(shù)用于載入一個文件夾中全部語料的所有句子,這個在源代碼里有,很簡單,哥就不多說了。

3.增量式訓(xùn)練更新word2vec模型

增量式訓(xùn)練w2v模型,上面提到了一個這么做的原因:避免把全部的訓(xùn)練語料一次性載入到內(nèi)存中。另一個原因是為了應(yīng)對語料隨時增加的情況。gensim當(dāng)然給出了這樣的solution,調(diào)用如下:

[python]?view plain?copy

def?updateW2VModelUnit(self,?model,?corpusSingleFilePath):

'''''

(only?can?be?a?singleFile)

'''

fileType?=?localFileOptUnit.checkFileState(corpusSingleFilePath)

if?fileType?==?u'directory':

warnings.warn('can?not?deal?a?directory!')

return?model

if?fileType?==?u'opened':

trainedWordCount?=?model.train(LineSentence(corpusSingleFilePath))

print('update?model,?update?words?num?is:?'?+?trainedWordCount)

elif?fileType?==?u'file':

corpusSingleFile?=?open(corpusSingleFilePath,?u'r')

trainedWordCount?=?model.train(LineSentence(corpusSingleFile))

print('update?model,?update?words?num?is:?'?+?trainedWordCount)

else:

#?TODO?add?sentences?list?directly?(same?as?last?function)

pass

return?model

簡單檢查文件type之后,調(diào)用model對象的train方法就可以實(shí)現(xiàn)對model的更新,這個方法傳入的是新語料的sentences,會返回模型中新增詞匯的數(shù)量。函數(shù)全部執(zhí)行完后,return更新后的model,源代碼中在這個函數(shù)下面有能夠處理多類文件參數(shù)(同2)的增強(qiáng)方法,這里就不多介紹了。

4.各種基礎(chǔ)查詢

當(dāng)你確定model已經(jīng)訓(xùn)練完成,不會再更新的時候,可以對model進(jìn)行鎖定,并且據(jù)說是預(yù)載了相似度矩陣能夠提高后面的查詢速度,但是你的model從此以后就read only了。

[python]?view plain?copy

def?finishTrainModel(self,?modelFilePath=None):

'''''

warning:?after?this,?the?model?is?read-only?(can't?be?update)

'''

if?modelFilePath?==?None:

modelFilePath?=?self.modelPath

model?=?self.loadModelfromFile(modelFilePath)

model.init_sims(replace=True)

可以看到,所謂的鎖定模型方法,就是init_sims,并且把里面的replace參數(shù)設(shè)定為True。

然后是一些word2vec模型的查詢方法:

[python]?view plain?copy

def?getWordVec(self,?model,?wordStr):

'''''

get?the?word's?vector?as?arrayList?type?from?w2v?model

'''

return?model[wordStr]

[python]?view plain?copy

def?queryMostSimilarWordVec(self,?model,?wordStr,?topN=20):

'''''

MSimilar?words?basic?query?function

return?2-dim?List?[0]?is?word?[1]?is?double-prob

'''

similarPairList?=?model.most_similar(wordStr.decode('utf-8'),?topn=topN)

return?similarPairList

[python]?view plain?copy

def?culSimBtwWordVecs(self,?model,?wordStr1,?wordStr2):

'''''

two?words?similar?basic?query?function

return?double-prob

'''

similarValue?=?model.similarity(wordStr1.decode('utf-8'),?wordStr2.decode('utf-8'))

return?similarValue

上述方法都很簡單,基本上一行解決,在源代碼中,各個函數(shù)下面依然是配套了相應(yīng)的model文件處理版的函數(shù)。其中,getWordVec是得到查詢詞的word2vec詞向量本身,打印出來是一個純數(shù)字的array;queryMostSimilarWordVec是得到與查詢詞關(guān)聯(lián)度最高的N個詞以及對應(yīng)的相似度,返回是一個二維list(注釋里面寫的蠻清楚);culSimBtwWordVecs是得到兩個給定詞的相似度值,直接返回double值。

5.Word2Vec詞向量的計算

研究過w2v理論的童鞋肯定知道詞向量是可以做加減計算的,基于這個性質(zhì),gensim給出了相應(yīng)的方法,調(diào)用如下:

[python]?view plain?copy

def?queryMSimilarVecswithPosNeg(self,?model,?posWordStrList,?negWordStrList,?topN=20):

'''''

pos-neg?MSimilar?words?basic?query?function

return?2-dim?List?[0]?is?word?[1]?is?double-prob

'''

posWordList?=?[]

negWordList?=?[]

for?wordStr?in?posWordStrList:

posWordList.append(wordStr.decode('utf-8'))

for?wordStr?in?negWordStrList:

negWordList.append(wordStr.decode('utf-8'))

pnSimilarPairList?=?model.most_similar(positive=posWordList,?negative=negWordList,?topn=topN)

return?pnSimilarPairList

由于用的是py27,所以之前對傳入的詞列表數(shù)據(jù)進(jìn)行編碼過濾,這里面posWordList可以認(rèn)為是對結(jié)果產(chǎn)生正能量的詞集,negWordList則是對結(jié)果產(chǎn)生負(fù)能量的詞集,同時送入most_similar方法,在設(shè)定return答案的topN,得到的返回結(jié)果形式同4中的queryMostSimilarWordVec函數(shù),大家可以這樣數(shù)學(xué)地理解這個操作:

下面一個操作是我自創(chuàng)的,假設(shè)我想用上面詞向量topN“詞-關(guān)聯(lián)度”的形式展現(xiàn)兩個詞或兩組詞之間的關(guān)聯(lián),我是這么做的:

[python]?view plain?copy

def?copeMSimilarVecsbtwWordLists(self,?model,?wordStrList1,?wordStrList2,?topN_rev=20,?topN=20):

'''''

range?word?vec?res?for?two?wordList?from?source?to?target

use?wordVector?to?express?the?relationship?between?src-wordList?and?tag-wordList

first,?use?the?tag-wordList?as?neg-wordList?to?get?the?rev-wordList,

then?use?the?scr-wordList?and?the?rev-wordList?as?the?new?src-tag-wordList

topN_rev?is?topN?of?rev-wordList?and?topN?is?the?final?topN?of?relationship?vec

'''

srcWordList?=?[]

tagWordList?=?[]

srcWordList.extend(wordStr.decode('utf-8')?for?wordStr?in?wordStrList1)

tagWordList.extend(wordStr.decode('utf-8')?for?wordStr?in?wordStrList2)

revSimilarPairList?=?self.queryMSimilarVecswithPosNeg(model,?[],?tagWordList,?topN_rev)

revWordList?=?[]

revWordList.extend(pair[0].decode('utf-8')?for?pair?in?revSimilarPairList)

stSimilarPairList?=?self.queryMSimilarVecswithPosNeg(model,?srcWordList,?revWordList,?topN)

return?stSimilarPairList

這個操作的思路就是,首先用兩組詞中的一組作為negWordList,傳入上面的queryMSimilarVecswithPosNeg函數(shù),得到topN一組的中轉(zhuǎn)詞,在使用這些中轉(zhuǎn)詞與原先的另一組詞進(jìn)行queryMSimilarVecswithPosNeg操作,很容易理解,第一步得到的是一組詞作為negWordList的反向結(jié)果,再通過這個反向結(jié)果與另一組詞得到“負(fù)負(fù)得正”的效果。這樣就可以通過一組topN的“詞-關(guān)聯(lián)度”配對List表示兩組詞之間的關(guān)系。

python問題

因?yàn)槟阌羞@樣一句判斷語句

if?x?in?"0123456789"

只要x不是0123456789,那x就不是數(shù)字了,你編的這個計算器就結(jié)束運(yùn)算了

x=50就會被判斷為非數(shù)字。

isinstance(var, type)這個函數(shù)會告訴你變量是否屬于某個變量類型,相符返回True,反之False

如果只支持整數(shù)運(yùn)算,改成:

if?isinstance(x,int):

如果要支持小數(shù)運(yùn)算,改成:

if?isinstance(x,int)?or?isinstance(x,float):


本文題目:topn函數(shù)python topn算法java
分享URL:http://weahome.cn/article/dodepeh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部