文本挖掘從小白到精通(二):料庫和詞向量空間

2020-11-27 人人都是..

寫筆者最近在梳理自己的文本挖掘知識結構,藉助gensim、sklearn、keras等庫的文檔做了些擴充,會陸陸續續介紹文本向量化、tfidf、主題模型、word2vec,既會涉及理論,也會有詳細的代碼和案例進行講解,希望在梳理自身知識體系的同時也能對想學習文本挖掘的朋友有一點幫助,這是筆者寫該系列的初衷。

在本文中,筆者將會緊接著上文提及的3個概念,拓展到文本挖掘中一個重要的概念 —(文本)向量空間,它是將自然語言轉化為機器可識別符號的關鍵一步,文本相似度、文本聚類、文本分類等實際應用皆以此為基礎。

培養碼代碼的好習慣,設置日誌,列印程序運行中的細節,以便調試代碼。

import logginglogging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

import os import tempfileTEMP_FOLDER = tempfile.gettempdir()print('文件夾"{}" 將被用來存儲語料和臨時性的字典'.format(TEMP_FOLDER))

文件夾」C:UsershpAppDataLocalTemp」 將被用來存儲語料和臨時性的字典

一、從字符串到向量(From Strings to Vectors)

這次,筆者還是使用之前關於「知識圖譜」報導的標題語料庫作為示例:

from gensim import corporaimport jieba

2019-05-06 09:59:43,964 : INFO : 『pattern』 package not found; tag filters are not available for English

根據列印出的日誌可知,』pattern』沒正確安裝上,這個庫是自然語言處理裡一個很棒的庫,不過目前沒怎麼更新了,且對中文的支持不給力,所以不影響接下來的分析。

jieba.add_word('知識圖譜') #防止「知識圖譜」被切錯詞docs = ['商業新知:知識圖譜為內核,構建商業創新服務完整生態。','如何更好利用知識圖譜技術做反欺詐? 360金融首席數據科學家沈贇開講。','知識管理 | 基於知識圖譜的國際知識管理領域可視化分析。','一文詳解達觀數據知識圖譜技術與應用。','知識圖譜技術落地金融行業的關鍵四步。','一文讀懂知識圖譜的商業應用進程及技術背景。','海雲數據CPO王斌:打造大數據可視分析與AI應用的高科技企業。','智能產業|《人工智慧標準化白皮書2018》帶來創新創業新技術標準。','國家語委重大科研項目「中華經典詩詞知識圖譜構建技術研究」開題。','最全知識圖譜介紹:關鍵技術、開放數據集、應用案例匯總。','中譯語通Jove Mind知識圖譜平臺 引領企業智能化發展。','知識圖譜:知識圖譜賦能企業數位化轉型,為企業升級轉型注入新能量。']

再對文本進行分詞,用空格隔開變成字符串,方便進行下一步的處理:

documents = [' '.join(jieba.lcut(i)) for i in docs]print(documents)

[『商業 新知 : 知識圖譜 為 內核 , 構建 商業 創新 服務 完整 生態 。』,

『如何 更好 利用 知識圖譜 技術 做 反 欺詐 ? 360 金融 首席 數據 科學家 沈贇 開講 。』,

『知識 管理 | 基於 知識圖譜 的 國際 知識 管理 領域 可視化 分析 。』,

『一文 詳解 達觀 數據 知識圖譜 技術 與 應用 。』,

『知識圖譜 技術 落地 金融 行業 的 關鍵 四步 。』,

『一文 讀懂 知識圖譜 的 商業 應用 進程 及 技術 背景 。』,

『海雲 數據 CPO 王斌 : 打造 大 數據 可視 分析 與 AI 應用 的 高科技 企業 。』,

『智能 產業 | 《 人工智慧 標準化 白皮書 2018 》 帶來 創新 創業 新 技術標準 。』,

『國家語委 重大 科研項目 「 中華 經典 詩詞 知識圖譜 構建 技術 研究 」 開題 。』,

『最全 知識圖譜 介紹 : 關鍵技術 、 開放 數據 集 、 應用 案例 匯總 。』,

『中譯 語通 Jove Mind 知識圖譜 平臺 引領 企業 智能化 發展 。』,

『知識圖譜 : 知識圖譜 賦能 企業 數位化 轉型 , 為 企業 升級 轉型 注入 新 能量 。』]

這是一個包含12個文檔的小型語料,每個文檔僅包含1個語句。

首先,對這些文檔進行分詞處理,移除停用詞,並去掉那些僅在本語料中出現一次的詞彙:

from pprint import pprintfrom collections import defaultdict# 移除常用詞以及分詞stoplist = [i.strip() for i in open('datasets/stopwords_zh.txt',encoding='utf-8').readlines()]texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents]# 移除僅出現一次的詞彙frequency = defaultdict(int)for text in texts:for token in text:frequency[token] += 1texts = [[token for token in text if frequency[token] > 1] for text in texts]#使列印的格式更齊整pprint(texts)

[[『商業』, 『知識圖譜』, 『商業』, 『創新』],

[『知識圖譜』, 『技術』, 『金融』, 『數據』],

[『知識』, 『管理』, 『知識圖譜』, 『知識』, 『管理』, 『分析』],

[『一文』, 『數據』, 『知識圖譜』, 『技術』],

[『知識圖譜』, 『技術』, 『金融』],

[『一文』, 『知識圖譜』, 『商業』, 『技術』],

[『數據』, 『數據』, 『分析』, 『企業』], [『創新』],

[『知識圖譜』, 『技術』],

[『知識圖譜』, 『數據』],

[『知識圖譜』, 『企業』],

[『知識圖譜』, 『知識圖譜』, 『企業』, 『轉型』, 『企業』, 『轉型』]]

處理文檔的方式需要因時制宜,隨機應變,尤其是在不同的應用場景中,比如電商評論、博客長文以及微博內容都需要使用不同的預處理方法,筆者會在後面的文章中提及這些技巧。在這裡,基於上面的分詞,筆者僅用空格分開,然後對語句中的西文詞彙進行「小寫化(Lowercasing)」。

機器是看不懂人類的自然語言(自然語言通常是指一種自然地隨文化演化的語言。例如:英語、漢語、日語為自然語言的例子,而世界語則為人造語言,即是一種為某些特定目的而創造的語言),若要機器「讀懂」自然語言,則需要將其轉換為機器可識別的符號,比如」0″和」1″,且這種轉換的過程中需要最大限度保留自然語言特有的語義特徵,這是一個很有難度的任務。

在這裡,筆者介紹一種常見的文本表示方法——稱為詞袋模型,即Bag-of-Words)。

在詞袋模型模型下,像是句子或是文件這樣的文字可以用一個袋子裝著這些詞的方式表現,這種表現方式不考慮文法以及詞的順序。

https://baike.baidu.com/item/%E8%AF%8D%E8%A2%8B%E6%A8%A1%E5%9E%8B/22776998?fr=aladdin

後面還會有很多不同的文本表示方法,比如TF-IDF、LSA、LSI、LDA、HDP、NMF、Word2vec等。但是,請記住,不同的應用場景需要不同的文本特徵,沒有百試不爽的方法,並且,請一如既往的記住這句名言:

垃圾入,垃圾出(garbage in, garbage out)。

使用詞袋模型將多個文檔轉換為向量,每個文檔由一個向量表示,其中向量元素「i」表示第i個單詞出現在文檔中的次數。

僅通過它們的(整型)id來表徵詞彙是有利的, 問題和ID之間的映射稱為字典(dictionary):

dictionary = corpora.Dictionary(texts)dictionary.save(os.path.join(TEMP_FOLDER, 'deerwester.dict')) # 保存字典,以備後續查找之用print(dictionary)

2019-05-06 15:58:09,861 : INFO : adding document #0 to Dictionary(0 unique tokens: [])2019-05-06 15:58:09,867 : INFO : built Dictionary(12 unique tokens: [『創新』, 『商業』, 『知識圖譜』, 『技術』, 『數據』]…)

12 documents (total 42 corpus positions)

2019-05-06 15:58:09,873 : INFO : saving Dictionary object under C:Users/hp/AppDataLocal/Tempdeerwester.dict, separately None

2019-05-06 15:58:09,879 : INFO : saved C:UsershpAppDataLocalTempdeerwester.dict

Dictionary(12 unique tokens: [『創新』, 『商業』, 『知識圖譜』, 『技術』, 『數據』]…)

在這裡,我們通過gensim.corpora.dictionary.Dictionary這個類為處理過的語料庫中出現的每個詞彙分配一個獨一無二的整數ID 。 這會掃描整個文本,統計所有的詞彙計數和詞彙相關數據。 最後,我們看到在處理的語料庫中有12個不同的詞彙,這意味著每個文檔將由12個數字表示(即12-D向量)。

下面,查看每個詞彙與其對應ID之間的映射關係:

print(dictionary.token2id)

{『創新』: 0, 『商業』: 1, 『知識圖譜』: 2, 『技術』: 3, 『數據』: 4, 『金融』: 5, 『分析』: 6, 『知識』: 7, 『管理』: 8, 『一文』: 9, 『企業』: 10, 『轉型』: 11}

將分詞後的文檔實際轉換為向量:

new_doc = "知識圖譜 為 企業 轉型 助力"new_vec = dictionary.doc2bow(new_doc.lower().split())print(new_vec) # 「為」、「助力」等詞彙未出現在字典中,因而被忽略

[(2, 1), (10, 1), (11, 1)]

函數doc2bow()只是計算每個不同詞彙的出現次數,將詞彙轉換為整數詞彙id,並將結果作為一個詞袋(bag-of-words)——一個稀疏向量返回,形式為( word_id1,word_count1),( word_id2,word_count2),( word_id3,word_count3)…

在token_id中,「創新」對應的為0,「商業」為1,…,』轉型』為11。因而,新文檔「知識圖譜 為 企業 轉型 助力(知識圖譜為企業轉型助力)」將被轉換為[(2, 1), (10, 1), (11, 1)]。 「知識圖譜」、「企業」、「轉型」 出現在詞典中並出現一次。

因此,它們在稀疏向量中分別變為(2, 1), (10, 1), (11, 1)。 「為」、「轉型」、「助力」等詞彙在字典中不存在,因此不會出現在稀疏向量中。詞彙計數為0的詞彙不會出現在稀疏向量中,並且稀疏向量中將永遠不會出現像(3,0)這樣的元素。

對於熟悉scikit-learn的人來說,doc2bow()與在CountVectorizer上調用transform()有類似的作用(http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)。doc2bow()也可以像fit_transform()那樣運作。

相關詳細信息,請參閱 gensim API Doc

corpus = [dictionary.doc2bow(text) for text in texts]corpora.MmCorpus.serialize(os.path.join(TEMP_FOLDER, 'deerwester.mm'), corpus) #保存到本地,以作後用for c in corpus:print(c)

2019-05-06 16:00:28,683 : INFO : storing corpus in Matrix Market format to C:Users/hp/AppData/Local/Tempdeerwester.mm

2019-05-06 16:00:28,688 : INFO : saving sparse matrix to C:Users/hp/AppData/Local/Temp/deerwester.mm

2019-05-06 16:00:28,690 : INFO : PROGRESS: saving document

2019-05-06 16:00:28,693 : INFO : saved 12×12 matrix, density=24.306% (35/144)

2019-05-06 16:00:28,695 : INFO : saving MmCorpus index to C:UsershpAppDataLocalTempdeerwester.mm.index

[(0, 1), (1, 2), (2, 1)]

[(2, 1), (3, 1), (4, 1), (5, 1)]

[(2, 1), (6, 1), (7, 2), (8, 2)]

[(2, 1), (3, 1), (4, 1), (9, 1)]

[(2, 1), (3, 1), (5, 1)]

[(1, 1), (2, 1), (3, 1), (9, 1)]

[(4, 2), (6, 1), (10, 1)]

[(0, 1)]

[(2, 1), (3, 1)][(2, 1), (4, 1)]

[(2, 1), (10, 1)]

[(2, 2), (10, 2), (11, 2)]

到目前為止,應該清楚的是,帶有id = 10的向量特徵表示文檔中出現「企業」一詞的次數——在這12個文檔中, 只有倒數前2個和和倒數第6個的值為1,其他皆為0。

二、語料庫流(Corpus Streaming)——每次僅調用一個文檔

請注意,上面的語料(corpus)完全駐留在內存中,作為普通的Python列表而存在。 在這個簡單的例子中,它並不重要,只是為了闡述方便。讓我們假想,手頭的語料庫中有數千萬個文檔,要將所有這些文檔都存儲在RAM中是行不通的,這會消耗大量的計算資源,速度奇慢!

相反,我們假設文檔存儲在本地的單個文件中,每行一個文檔。 Gensim只要求語料庫在需要使用時,能夠一次返回一個文檔向量:

from smart_open import smart_openclass MyCorpus(object):def __iter__(self):for line in smart_open('datasets/mycorpus.txt', 'r',encoding='utf-8'):# 假設每一行一個文檔,用jieba進行分詞yield dictionary.doc2bow(' '.join(jieba.lcut(line)).lower().split())

每個文檔佔用單個文件中一行的假設並不重要,你可以設計__iter__函數以適合你的特定輸入格式,比如文檔目錄、待解析的XML、可訪問的網絡節點……只需解析你的輸入以檢索每個文檔中的所用詞彙,然後通過字典將這些詞彙轉換為它們對應的整數ID,並在__iter__中產生具有生成器屬性的稀疏向量。

corpus_memory_friendly = MyCorpus() #不需要將語料載入到內存中!print(corpus_memory_friendly)

<__main__.MyCorpus object at 0x00000160C6575320>

現在,corpus_memory_friendly是一個對象。 我們沒有定義任何列印(print)方式,因此print只輸出對象在內存中的地址, 這看起來沒啥用。 要查看其中的向量構成,需要遍歷語料庫,並列印每個文檔向量(一次一個):

for vector in corpus_memory_friendly: #每次載入一個文檔向量print(vector)

[(0, 1), (1, 2), (2, 1), (3, 1)]

[(2, 1), (3, 1), (4, 1), (5, 1), (6, 1)]

[(2, 1), (3, 3), (7, 1), (8, 2)]

[(2, 1), (3, 1), (4, 1), (5, 1), (9, 1)]

[(2, 1), (3, 1), (4, 1), (6, 1)]

[(1, 1), (2, 1), (3, 1), (4, 1), (9, 1)]

[(5, 2), (7, 1), (10, 1)]

[(0, 1)]

[(2, 1), (3, 1), (4, 1)]

[(2, 1), (3, 1), (5, 1)]

[(2, 1), (3, 1), (10, 1)]

[(2, 2), (3, 2), (10, 1)]

儘管輸出與普通的Python列表的輸出相同,但此時的語料庫對內存更友好——一次最多只有一個向量駐留在RAM中, 現在,你的語料庫想用多大就用多大,哪怕是成千上萬個文檔,只是速度稍慢罷了。

我們將使用mycorpus.txt這個文件來創建字典(Dictionary),但不是將整個文件加載到本地內存中。 然後,我們將過濾掉語料中的停用詞以及詞頻為1的詞彙,從而得到「淨化」後的語料。

請記住,dictionary.filter_tokens(或者dictionary.add_document)將調用dictionary.compactify()來刪除詞彙id序列中的間隙,空置的佔位符(」」)將會被剔除。

from six import iteritemsfrom smart_open import smart_open   #收集所有詞彙的統計信息dictionary = corpora.Dictionary(''.join(jieba.lcut(line)).lower().split() for line insmart_open('datasets/mycorpus.txt','r',encoding='utf-8'))  #停用詞和低頻詞(這裡指僅出現1次的詞彙)的ID集合stop_ids = [dictionary.token2id[stopword] for stopword in stoplist if stopword in dictionary.token2id]once_ids = [tokenid for tokenid, docfreq in iteritems(dictionary.dfs) if docfreq == 1] #真正實施去停用詞和低頻次的操作dictionary.filter_tokens(stop_ids + once_ids)print(dictionary)

2019-05-06 15:44:52,297 : INFO : adding document #0 to Dictionary(0 unique tokens: [])

2019-05-06 15:44:52,303 : INFO : built Dictionary(100 unique tokens: [『,』, 『:』, 『。』, 『為』, 『內核』]…) from 12 documents (total 164 corpus positions)

Dictionary(10 unique tokens: [『創新』, 『商業』, 『圖譜』, 『知識』, 『技術』]…)

到這裡,詞袋錶示(Bag-of-words Representation)的原理和操作就說完了。 當然,我們用這種語料庫可以做什麼是另一個問題; 計算不同單詞的出現頻率可能是有用的,但在實際場景中,這還不夠。

事實證明,我們經常需要對這個簡單的表示進行轉換(Transformation),之後才能進行文檔相似度、文本聚類或者文本分類這樣的任務。 轉換後面會提到,但在此之前,讓我們將注意力集中在語料庫持久性(Corpus Persistency)上。

三、語料格式(Corpus Formats)

存在幾種用於將向量空間(Vector Space)語料庫(向量序列)序列化到本地的文件格式。Gensim通過前面提到的流式語料庫接口(Streaming Corpus Interface)實現:以惰性方式(A Lazy Fashion)從本地讀取大量語料,一次一個文檔,而不是一次性將整個語料庫讀入本地內存中,這在語料庫極為龐大時是很折騰電腦的。

其中,一種比較值得注意的文件格式是Matrix Market格式(http://math.nist.gov/MatrixMarket/formats.html)。

下面,將文檔以Matrix Market格式保存:

#創建一個包含2個文檔的微小語料,以一個python列表呈現corpus = [[(1, 0.5)], []] # 其中一個文檔故意搞成空的corpora.MmCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.mm'), corpus)

2019-05-06 16:36:54,265 : INFO : storing corpus in Matrix Market format to C:Users/hp/AppData/Local/Temp/corpus.mm

2019-05-06 16:36:54,281 : INFO : saving sparse matrix to C:Users/hp/AppData/Local/Temp/corpus.mm

2019-05-06 16:36:54,285 : INFO : PROGRESS: saving document #

2019-05-06 16:36:54,290 : INFO : saved 2×2 matrix, density=25.000% (1/4)

2019-05-06 16:36:54,293 : INFO : saving MmCorpus index to C:Users/hp/AppData/Local/Temp/corpus.mm.index

其他的存儲格式還有Joachim’s SVMlight format(http://svmlight.joachims.org/)、Blei’s LDA-C format(http://www.cs.columbia.edu/~blei/lda-c/) 和GibbsLDA++ format(http://gibbslda.sourceforge.net/)。

corpora.SvmLightCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.svmlight'), corpus)corpora.BleiCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.lda-c'), corpus)corpora.LowCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.low'), corpus)

反向操作,從Matrix Market文件加載語料庫迭代器(Corpus Iterator):

corpus = corpora.MmCorpus(os.path.join(TEMP_FOLDER, 'corpus.mm'))

語料庫對象是流式的(Streams),因此,我們通常無法直接列印它們,只有通過遍歷才能看到其中的元素:

print(corpus)

MmCorpus(2 documents, 2 features, 1 non-zero entries)

通過迭代器列表化來查看語料庫中的元素:

# 一種列印語料庫的方式是 --- 將其整個載入內存中print(list(corpus)) # 調用 list() 能將任何序列轉化為普通的Python list

[[(1,0.5)],[]]

或者這樣:

# 另一種方法:一次列印一個文檔for doc in corpus:print(doc)

[(1, 0.5)][]

顯然,第二種方式對內存更友好,但是出於測試和開發的目的,沒有什麼比調用list(corpus)更簡單、快捷!。

接下來,以Blei的LDA-C格式保存相同的Matrix Market文檔流:

corpora.BleiCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.lda-c'), corpus)

通過這種方式,gensim也可以用作內存高效的I / O格式轉換工具:只需使用一種格式加載文檔流,然後立即以另一種格式進行保存。

四、與NumPy、SciPy的兼容性

Gensim還囊括許多高效且實用的函數,可以在(http://radimrehurek.com/gensim/matutils.html)看到,通過這些函數,我們可以輕鬆的進行numpy矩陣的轉換:

import gensimimport numpy as npnumpy_matrix = np.random.randint(10, size=[5,2])

numpy_matrix

array([[0, 4],

[0, 7],

[8, 2],

[7, 0],

[2, 1]])

corpus = gensim.matutils.Dense2Corpus(numpy_matrix)numpy_matrix_dense = gensim.matutils.corpus2dense(corpus, num_terms=10)

numpy_matrix_dense

array([[0., 4.],

[0., 7.],

[8., 2.],

[7., 0.],

[2., 1.],

[0., 0.],

[0., 0.],

[0., 0.],

[0., 0.],

[0., 0.]], dtype=float32)

與scipy.sparse矩陣相互轉換:

import scipy.sparsescipy_sparse_matrix = scipy.sparse.random(5,2)

scipy_sparse_matrix

<5×2 sparse matrix of type 『<class 『numpy.float64′>』 with 0 stored elements in COOrdinate format>

corpus = gensim.matutils.Sparse2Corpus(scipy_sparse_matrix)

corpus

<gensim.matutils.Sparse2Corpus at 0x160c65759e8>

scipy_csc_matrix = gensim.matutils.corpus2csc(corpus)

scipy_csc_matrix

<0x2 sparse matrix of type 『<class 『numpy.float64′>』 with 0 stored elements in Compressed Sparse Column format>

要獲得完整的參考(想要將字典的規模精簡下以節約內存?優化語料庫和NumPy / SciPy數組之間的轉換?),請參閱gensim的API文檔。

在下一篇文章中,筆者會接著本次的主題,說說關於主題模型和文本數據轉換,即TF-IDF模型、潛在語義索引(LSI)、隨機映射(Random Projections)、隱狄利克雷分配模型(Latent Dirichlet Allocation, LDA)、層次狄利克雷過程(Hierarchical Dirichlet Process,HDP)的教程。

#專欄作家

蘇格蘭折耳喵(微信公眾號:Social Listening與文本挖掘),人人都是產品經理專欄作家,數據PM一隻,擅長數據分析和可視化表達,熱衷於用數據發現洞察,指導實踐。

本文原創發布於人人都是產品經理。未經許可,禁止轉載。

題圖來自Unsplash,基於CC0協議

相關焦點

  • 文本挖掘從小白到精通(一):語料、向量空間和模型的概念
    本文給大家介紹幾個在使用gensim進行文本挖掘所需了解的基本概念和術語,並提供一些簡單的用法示例。enjoy~筆者最近在梳理自己的文本挖掘知識結構,藉助gensim、sklearn、keras等庫的文檔做了些擴充,希望在梳理自身知識體系的同時也能對想學習文本挖掘的朋友有一點幫助,這是筆者寫該系列的初衷。
  • 數據挖掘之文本分類技術,最詳細的原理解讀
    在理解文本信息的問題上,由於信息量的龐大,如果僅憑人工方式來收集和挖掘文本數據,不僅需要消耗大量的人力和時間,而且也是很難實現的。於是,實現自動文本分類就顯得尤其重要,它是文本信息挖掘的基本功能,也成為了處理和組織文本數據的核心技術。
  • 專欄| NLP概述和文本自動分類算法詳解
    文本挖掘任務類型的劃分 文本挖掘任務大致分為四個類型:類別到序列、序列到類別、同步的(每個輸入位置都要產生輸出)序列到序列、異步的序列到序列。 同步的序列到序列的例子包括中文分詞,命名實體識別和詞性標註。一部的序列到序列包括機器翻譯和自動摘要。
  • 何索引數以十億計的文本向量?
    這就是基於向量的匹配發揮作用的地方。將文本嵌入到向量空間詞嵌入是自然語言處理中的一種機器學習技術,用於將文本或單詞映射成向量。通過將問題移到向量空間中,我們可以使用數學運算,例如對向量求和或計算距離。我們甚至可以使用傳統的向量聚類技術將相似的單詞連結在一起。
  • 詞向量詳解:從word2vec、glove、ELMo到BERT
    各種詞向量的特點:One-hot:維度災難 and 語義鴻溝矩陣分解(LSA):利用全局語料特徵,但SVD求解計算複雜度大基於NNLM/RNNLM的詞向量:詞向量為副產物,存在效率不高等問題word2vec、fastText:優化效率高,但是基於局部語料glove:基於全局預料,結合了LSA和word2vec的優點elmo、GPT、bert:動態特徵從one-hot到word2vec
  • 每個詞會訓練一個單詞向量,直到得到詞向量空間中維度最大的向量
    從屏幕上畫一幅圖,把圖放到輸入框裡,句子中已出現的文字就按照回答路徑來傳遞到後臺,最後再由我們來回答它。可以說,nlp是各種計算機視覺任務之後的分支之一,每一類任務都蘊含著計算機理解世界的力量。那麼,在具體工作中,我們可以用來做什麼呢?以智能問答為例,我們的目標是設計一個智能輸入問題和一個智能輸出答案的回答系統。
  • Chinese Word Vectors:目前最全的中文預訓練詞向量集合
    *該項目提供了字向量,因為古漢語大多數漢字獨立成詞。多種共現信息開發者發布了在不同的共現(co-occurrence)統計數據上的詞向量。目標和上下文向量在相關的論文中一般稱為輸入和輸出向量。在這一部分中,我們可以獲取詞層面之上的任意語言單元向量。例如,漢字向量包含在詞-漢字的上下文向量中。所有向量都在百度百科上使用 SGNS 訓練。表徵現有的詞表徵方法一般可分為兩種,即密集型和稀疏型的詞嵌入表徵。
  • BERT-Flow | 文本語義表示新SOTA
    NLP任務上,但在文本語義相似度計算任務上,未經微調的BERT句向量的質量常常不如GloVe句向量。「向量空間模型:」 利用預訓練BERT生成的句向量(sentence embeddings)作為文本的整體表示,比如取[CLS]對應的hidden state或對最後一層或幾層的hidden states做average pooling(後者更好),然後用句向量的cosine相似度來表示文本的語義相似度。
  • 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和...
    傳統做法常用詞袋模型(BOW, Bag Of Words)或向量空間模型(Vector Space Model),最大的不足是忽略文本上下文關係,每個詞之間彼此獨立,並且無法表徵語義信息。詞袋模型是向量空間模型的基礎,因此向量空間模型通過特徵項選擇降低維度,通過特徵權重計算增加稠密性。特徵提取:向量空間模型的文本表示方法的特徵提取對應特徵項的選擇和特徵權重計算兩部分。特徵選擇的基本思路是根據某個評價指標獨立的對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其餘的特徵項。
  • 文本匹配模型TextMatching
    個人心得:文本匹配問題可轉化為二分類問題,輸出概率則為相似度將圖像識別的思路應用於文本匹配任務中,利用卷積抽取文本特徵論文地址:https://arxiv.org/pdf/1602.06359.pdf1.
  • 詞向量學習算法 Word2Vec
    Word2Vec 是 google 在2013年提出的詞向量模型,通過 Word2Vec 可以用數值向量表示單詞,且在向量空間中可以很好地衡量兩個單詞的相似性。 1.
  • 文本分類六十年
    根據數據集的特徵,將輸入單詞向量發送到DNN中進行訓練,直到達到終止條件為止。訓練模型的性能由下遊任務驗證,例如情感分類,問題回答和事件預測。在表2中顯示了多年來的DNN,包括與相應基本模型,評估指標和實驗數據集不同的設計。如表2所示,前饋神經網絡和遞歸神經網絡是用於文本分類任務的前兩種深度學習方法,與淺層學習模型相比,它們可以提高性能。然後,將CNN,RNN和注意力機制用於文本分類。
  • 基於向量空間的知識圖譜查詢及結果解釋
    知識圖譜的目的是將以前處於非結構化的數據,中間發現的非結構化的實體和他們之間的關聯,強調的是net、實體、關係,以及描述這些實體和關係的類別,最終會把非結構化的文本變成網絡。做自然語言的深度學習,如何選擇詞項模型和訓練方式是第一項基本任務。知識圖譜的向量模型之前是通過關係資料庫或者圖資料庫,採用傳統的方式存儲。但在2015年,谷歌的工程師就思考用向量表示網絡和知識圖譜。由此產生的概念是表示學習,如果看經典機器學習的書,第一就是介紹表示學習,即通過機器學習得到數據的表示形式,以及分布式表示和連續的向量的概念。
  • 以《大秦帝國之崛起》為例,來談大數據輿情分析和文本挖掘
    本文作者將以《大秦帝國之崛起》作為分析對象,來詳細闡述在大數據時代數據分析會涉及到的全網輿情分析、微博傳播分析以及文本挖掘。了解該條微博的傳播規律,互動粉絲的畫像,以及水軍的辨識文本挖掘:通過對該劇相關非結構化文本數據的分析,了解其獲得觀眾較高認可的原因在接下來的分析中,筆者將結合分析工具(新浪微輿情、頭條媒體實驗室、Python、Gephi等)、分析思路(分析角度和分析流程)、業務知識
  • 空間?向量?——向量及其線性運算
    小編在上一篇文章中已經說過,接下來就開始向量代數與空間解析幾何的內容了。可能有些大學上學期學到微分方程前就不學了,可能是學到向量代數與空間解析幾何不學了的。所以上學期學過微分方程的同學,現在也可以和小編從現在開始複習。
  • 數據挖掘:基於機器學習方法的POI品類推薦算法
    空間向量模型需要一個「字典」,這個字典可以在樣本中產生,也可以從外部導入。我們對已校準的POI,先利用Lucene的中文分詞工具SmartCn[2]對POI名稱做預分詞處理,提取特徵詞,作為原始粗糙字典集合。有了字典後便可以量化地表示出某個文本。先定義一個與字典長度相同的向量,向量中的每個位置對應字典中的相應位置的單詞。
  • 高中二年級上學期周末練習,空間向量訓練
    這個周的周末練習主要訓練學生熟練掌握空間向量。下面我上傳題目,並給出講解。第7題考查空間的任何一個向量都可以用空間的一組基底表示,基底是一組不共面的三個向量,可以按照首尾相接連首尾,然後利用平行四邊形法則和三角形法則處理;第8題考查向量的模,向量的模等於三個坐標的平方和,然後轉化成t的函數求解最小值;第9題考查正方體中與A1D1,EF,CD都相交的直線的條數,可根據共面不平行就相交來判斷;第10題長方體中的兩條異面直線的夾角,方法一
  • 李偉:輿情事件等級評估及基於語義理解實現文本精細化分類
    基於知識圖譜和NLP的文本精細化分類 李偉首先闡述了知識圖譜和NLP的文本精細化分類的現實需求。在當前的文本分類,一般是結合上下文的情況進行分類,在語句層面以及「詞」的層面理解都不夠到位。因此需要進一步基於知識圖譜,利用NLP技術消除詞的歧義,對文本進行語義識別實現精細化分類,從詞和語句兩個層面來解決問題。
  • 更別致的詞向量模型:simpler glove (一)
    這些討論既有其針對性,也有它的一般性,有些解釋也許可以直接遷移到對 glove 模型和 skip gram 模型的詞向量性質的詮釋中,讀者可以自行嘗試。圍繞著這些問題的討論,本文提出了一個新的類似 glove 的詞向量模型,這裡稱之為 simpler glove,並基於斯坦福的 glove 源碼進行修改,給出了本文的實現,具體代碼在 Github 上。
  • 以BBC新聞文章為例:應用XGBoost等算法進行文本分類
    圖片來源:unsplash.com/@knightwill本文將以BBC新聞文章分類為例,討論不同的文本分類技術。同時,本文將討論如何用不同向量空間模型代表文本數據。也可以這樣理解:每一個「文本」的內容都在暗示某個語境,從而決定其類別。需要進行向量空間分析,並將其應用於模型,以證實以上推斷。向量空間建模及構建管道對於任何自然語言處理問題,都有必要進行向量空間建模。以兩個最常見的向量空間模型為例:Doc2Vec和Tf-Idf。首先,把數據分成特徵和類別。