摘要:而騰訊和寶馬保時捷,網(wǎng)易和寶馬保時捷將會離得較遠(yuǎn)一些。關(guān)于的使用方法,可以參考基于的實踐。下面我們分別查看同寶馬和騰訊最相近的前個詞語??梢园l(fā)現(xiàn)和寶馬相近的詞大都屬于汽車行業(yè),而且是汽車品牌和騰訊相近的詞大都屬于互聯(lián)網(wǎng)行業(yè)。
Word2Vec簡介
Word2Vec是詞(Word)的一種表示方式。不同于one-hot vector,word2vec可以通過計算各個詞之間的距離,來表示詞與詞之間的相似度。word2vec提取了更多的特征,它使得具有相同上下文語義的詞盡可能離得近一些,而不太相關(guān)的詞盡可能離得較遠(yuǎn)一些。例如,【騰訊】和【網(wǎng)易】兩個詞向量將會離得很近,同理【寶馬】和【保時捷】兩個詞向量將會離得很近。而【騰訊】和【寶馬】/【保時捷】,【網(wǎng)易】和【寶馬】/【保時捷】將會離得較遠(yuǎn)一些。因為【騰訊】和【網(wǎng)易】都同屬于互聯(lián)網(wǎng)類目,而【寶馬】和【保時捷】都同屬于汽車類目。人以類聚,物以群分嘛!互聯(lián)網(wǎng)圈子中談的畢竟都是互聯(lián)網(wǎng)相關(guān)的話題,而汽車圈子中談?wù)摰亩际呛推囅嚓P(guān)的話題。
我們怎么得到一個詞的word2vec呢?下面我們將介紹如何使用python gensim得到我們想要的詞向量??偟膩碚f,包括以下幾個步驟:
wiki中文數(shù)據(jù)預(yù)處理
文本數(shù)據(jù)分詞
gensim word2vec訓(xùn)練
wiki中文數(shù)據(jù)預(yù)處理首先,下載wiki中文數(shù)據(jù):zhwiki-latest-pages-articles.xml.bz2。因為zhwiki數(shù)據(jù)中包含很多繁體字,所以我們想獲得簡體語料庫,接下來需要做以下兩件事:
使用gensim模塊中的WikiCorpus從bz2中獲取原始文本數(shù)據(jù)
使用OpenCC將繁體字轉(zhuǎn)換為簡體字
WikiCorpus獲取原始文本數(shù)據(jù)數(shù)據(jù)處理的python代碼如下:
from __future__ import print_function from gensim.corpora import WikiCorpus import jieba import codecs import os import six from gensim.models import Word2Vec from gensim.models.word2vec import LineSentence import multiprocessing class Config: data_path = "xxx/zhwiki" zhwiki_bz2 = "zhwiki-latest-pages-articles.xml.bz2" zhwiki_raw = "zhwiki_raw.txt" zhwiki_raw_t2s = "zhwiki_raw_t2s.txt" zhwiki_seg_t2s = "zhwiki_seg.txt" embedded_model_t2s = "embedding_model_t2s/zhwiki_embedding_t2s.model" embedded_vector_t2s = "embedding_model_t2s/vector_t2s" def dataprocess(_config): i = 0 if six.PY3: output = open(os.path.join(_config.data_path, _config.zhwiki_raw), "w") output = codecs.open(os.path.join(_config.data_path, _config.zhwiki_raw), "w") wiki = WikiCorpus(os.path.join(_config.data_path, _config.zhwiki_bz2), lemmatize=False, dictionary={}) for text in wiki.get_texts(): if six.PY3: output.write(b" ".join(text).decode("utf-8", "ignore") + " ") else: output.write(" ".join(text) + " ") i += 1 if i % 10000 == 0: print("Saved " + str(i) + " articles") output.close() print("Finished Saved " + str(i) + " articles") config = Config() dataprocess(config)使用OpenCC將繁體字轉(zhuǎn)換為簡體字
這里,需要預(yù)先安裝OpenCC,關(guān)于OpenCC在linux環(huán)境中的安裝方法,請參考這篇文章。僅僅需要兩行l(wèi)inux命令就可以完成繁體字轉(zhuǎn)換為簡體字的任務(wù),而且速度很快。
$ cd /xxx/zhwiki/ $ opencc -i zhwiki_raw.txt -o zhwiki_t2s.txt -c t2s.json文本數(shù)據(jù)分詞
對于分詞這個任務(wù),我們直接使用了python的jieba分詞模塊。你也可以使用哈工大的ltp或者斯坦福的nltk python接口進(jìn)行分詞,準(zhǔn)確率及權(quán)威度挺高的。不過這兩個安裝的時候會花費(fèi)很長時間,尤其是斯坦福的。關(guān)于jieba的分詞處理代碼,參考如下:
def is_alpha(tok): try: return tok.encode("ascii").isalpha() except UnicodeEncodeError: return False def zhwiki_segment(_config, remove_alpha=True): i = 0 if six.PY3: output = open(os.path.join(_config.data_path, _config.zhwiki_seg_t2s), "w", encoding="utf-8") output = codecs.open(os.path.join(_config.data_path, _config.zhwiki_seg_t2s), "w", encoding="utf-8") print("Start...") with codecs.open(os.path.join(_config.data_path, _config.zhwiki_raw_t2s), "r", encoding="utf-8") as raw_input: for line in raw_input.readlines(): line = line.strip() i += 1 print("line " + str(i)) text = line.split() if True: text = [w for w in text if not is_alpha(w)] word_cut_seed = [jieba.cut(t) for t in text] tmp = "" for sent in word_cut_seed: for tok in sent: tmp += tok + " " tmp = tmp.strip() if tmp: output.write(tmp + " ") output.close() zhwiki_segment(config)gensim word2vec訓(xùn)練
python的gensim模塊提供了word2vec訓(xùn)練,為我們模型的訓(xùn)練提供了很大的方便。關(guān)于gensim的使用方法,可以參考基于Gensim的Word2Vec實踐。
本次訓(xùn)練的詞向量大小size為50,訓(xùn)練窗口為5,最小詞頻為5,并使用了多線程,具體代碼如下:
def word2vec(_config, saved=False): print("Start...") model = Word2Vec(LineSentence(os.path.join(_config.data_path, _config.zhwiki_seg_t2s)), size=50, window=5, min_count=5, workers=multiprocessing.cpu_count()) if saved: model.save(os.path.join(_config.data_path, _config.embedded_model_t2s)) model.save_word2vec_format(os.path.join(_config.data_path, _config.embedded_vector_t2s), binary=False) print("Finished!") return model def wordsimilarity(word, model): semi = "" try: semi = model.most_similar(word, topn=10) except KeyError: print("The word not in vocabulary!") for term in semi: print("%s,%s" % (term[0],term[1])) model = word2vec(config, saved=True)
word2vec訓(xùn)練已經(jīng)完成,我們得到了想要的模型以及詞向量,并保存到本地。下面我們分別查看同【寶馬】和【騰訊】最相近的前10個詞語??梢园l(fā)現(xiàn):和【寶馬】相近的詞大都屬于汽車行業(yè),而且是汽車品牌;和【騰訊】相近的詞大都屬于互聯(lián)網(wǎng)行業(yè)。
>>> wordsimilarity(word=u"寶馬", model=model) 保時捷,0.92567974329 固特異,0.888278841972 勞斯萊斯,0.884045600891 奧迪,0.881808757782 馬自達(dá),0.881799697876 亞菲特,0.880708634853 歐寶,0.877104878426 雪鐵龍,0.876984715462 瑪莎拉蒂,0.868475496769 桑塔納,0.865387916565 >>> wordsimilarity(word=u"騰訊", model=model) 網(wǎng)易,0.880213916302 優(yōu)酷,0.873666107655 騰訊網(wǎng),0.87026232481 廣州日報,0.859486758709 微信,0.835543811321 天涯社區(qū),0.834927380085 李彥宏,0.832848489285 土豆網(wǎng),0.831390202045 團(tuán)購,0.829696238041 搜狐網(wǎng),0.825544642448
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38691.html
摘要:下載數(shù)據(jù)方法使用官方的數(shù)據(jù)最新打包的中文文檔下載地址是。中文維基數(shù)據(jù)繁簡混雜大家都說存在這個問題,但的網(wǎng)站是將繁體中文和簡體中文分開處理的,所以一直覺得從數(shù)據(jù)庫到結(jié)構(gòu)都應(yīng)有方法將兩者區(qū)分開,暫罷,待有空研究其數(shù)據(jù)時再議。 照例,先講下環(huán)境,Mac OSX 10.11.2 ,Python 3.4.3。 下載數(shù)據(jù) 方法1:使用官方dump的xml數(shù)據(jù) 最新打包的中文文檔下載地址是:http...
摘要:在自然語言處理中,一個很重要的技術(shù)手段就是將文檔轉(zhuǎn)換為一個矢量,這個過程一般是使用這個庫進(jìn)行處理的。自然語言處理中,一般來說,代表詞。自然語言預(yù)處理中,一個很重要的步驟就是將你收集的句子進(jìn)行分詞,將一個句子分解成詞的列表。 前言 本文根據(jù)實際項目撰寫,由于項目保密要求,源代碼將進(jìn)行一定程度的刪減。本文撰寫的目的是進(jìn)行公司培訓(xùn),請勿以任何形式進(jìn)行轉(zhuǎn)載。由于是日語項目,用到的分詞軟件等,在...
閱讀 2784·2021-10-11 11:08
閱讀 1502·2021-09-30 09:48
閱讀 1062·2021-09-22 15:29
閱讀 1049·2019-08-30 15:54
閱讀 990·2019-08-29 15:19
閱讀 541·2019-08-29 13:12
閱讀 3176·2019-08-26 13:53
閱讀 978·2019-08-26 13:28