摘要:而騰訊和寶馬保時捷,網易和寶馬保時捷將會離得較遠一些。關于的使用方法,可以參考基于的實踐。下面我們分別查看同寶馬和騰訊最相近的前個詞語。可以發現和寶馬相近的詞大都屬于汽車行業,而且是汽車品牌和騰訊相近的詞大都屬于互聯網行業。
Word2Vec簡介
Word2Vec是詞(Word)的一種表示方式。不同于one-hot vector,word2vec可以通過計算各個詞之間的距離,來表示詞與詞之間的相似度。word2vec提取了更多的特征,它使得具有相同上下文語義的詞盡可能離得近一些,而不太相關的詞盡可能離得較遠一些。例如,【騰訊】和【網易】兩個詞向量將會離得很近,同理【寶馬】和【保時捷】兩個詞向量將會離得很近。而【騰訊】和【寶馬】/【保時捷】,【網易】和【寶馬】/【保時捷】將會離得較遠一些。因為【騰訊】和【網易】都同屬于互聯網類目,而【寶馬】和【保時捷】都同屬于汽車類目。人以類聚,物以群分嘛!互聯網圈子中談的畢竟都是互聯網相關的話題,而汽車圈子中談論的都是和汽車相關的話題。
我們怎么得到一個詞的word2vec呢?下面我們將介紹如何使用python gensim得到我們想要的詞向量。總的來說,包括以下幾個步驟:
wiki中文數據預處理
文本數據分詞
gensim word2vec訓練
wiki中文數據預處理首先,下載wiki中文數據:zhwiki-latest-pages-articles.xml.bz2。因為zhwiki數據中包含很多繁體字,所以我們想獲得簡體語料庫,接下來需要做以下兩件事:
使用gensim模塊中的WikiCorpus從bz2中獲取原始文本數據
使用OpenCC將繁體字轉換為簡體字
WikiCorpus獲取原始文本數據數據處理的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將繁體字轉換為簡體字
這里,需要預先安裝OpenCC,關于OpenCC在linux環境中的安裝方法,請參考這篇文章。僅僅需要兩行linux命令就可以完成繁體字轉換為簡體字的任務,而且速度很快。
$ cd /xxx/zhwiki/ $ opencc -i zhwiki_raw.txt -o zhwiki_t2s.txt -c t2s.json文本數據分詞
對于分詞這個任務,我們直接使用了python的jieba分詞模塊。你也可以使用哈工大的ltp或者斯坦福的nltk python接口進行分詞,準確率及權威度挺高的。不過這兩個安裝的時候會花費很長時間,尤其是斯坦福的。關于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訓練
python的gensim模塊提供了word2vec訓練,為我們模型的訓練提供了很大的方便。關于gensim的使用方法,可以參考基于Gensim的Word2Vec實踐。
本次訓練的詞向量大小size為50,訓練窗口為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訓練已經完成,我們得到了想要的模型以及詞向量,并保存到本地。下面我們分別查看同【寶馬】和【騰訊】最相近的前10個詞語。可以發現:和【寶馬】相近的詞大都屬于汽車行業,而且是汽車品牌;和【騰訊】相近的詞大都屬于互聯網行業。
>>> wordsimilarity(word=u"寶馬", model=model) 保時捷,0.92567974329 固特異,0.888278841972 勞斯萊斯,0.884045600891 奧迪,0.881808757782 馬自達,0.881799697876 亞菲特,0.880708634853 歐寶,0.877104878426 雪鐵龍,0.876984715462 瑪莎拉蒂,0.868475496769 桑塔納,0.865387916565 >>> wordsimilarity(word=u"騰訊", model=model) 網易,0.880213916302 優酷,0.873666107655 騰訊網,0.87026232481 廣州日報,0.859486758709 微信,0.835543811321 天涯社區,0.834927380085 李彥宏,0.832848489285 土豆網,0.831390202045 團購,0.829696238041 搜狐網,0.825544642448
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38691.html
摘要:下載數據方法使用官方的數據最新打包的中文文檔下載地址是。中文維基數據繁簡混雜大家都說存在這個問題,但的網站是將繁體中文和簡體中文分開處理的,所以一直覺得從數據庫到結構都應有方法將兩者區分開,暫罷,待有空研究其數據時再議。 照例,先講下環境,Mac OSX 10.11.2 ,Python 3.4.3。 下載數據 方法1:使用官方dump的xml數據 最新打包的中文文檔下載地址是:http...
摘要:在自然語言處理中,一個很重要的技術手段就是將文檔轉換為一個矢量,這個過程一般是使用這個庫進行處理的。自然語言處理中,一般來說,代表詞。自然語言預處理中,一個很重要的步驟就是將你收集的句子進行分詞,將一個句子分解成詞的列表。 前言 本文根據實際項目撰寫,由于項目保密要求,源代碼將進行一定程度的刪減。本文撰寫的目的是進行公司培訓,請勿以任何形式進行轉載。由于是日語項目,用到的分詞軟件等,在...
閱讀 2770·2021-10-11 11:08
閱讀 1489·2021-09-30 09:48
閱讀 1049·2021-09-22 15:29
閱讀 1037·2019-08-30 15:54
閱讀 976·2019-08-29 15:19
閱讀 526·2019-08-29 13:12
閱讀 3161·2019-08-26 13:53
閱讀 957·2019-08-26 13:28