跳轉到主要內容
工程的博客

一個實驗管道使用PySpark從文本數據中提取主題的

2021年7月29日 工程的博客

分享這篇文章

這篇文章是係列文章的一部分主題建模。主題建模是一個過程,從一組文本文檔中提取主題。這是有用的對於理解或總結大型文本文檔的集合。一個文檔可以一行文本,一個段落或一本書中的一個章節。文檔的抽象是指一個獨立的單位我們操作的文本。文檔的集合稱為一個語料庫,和多個語料庫語料。

在這項工作中,我們將從語料庫中提取主題的文檔使用開源Pyspark毫升庫和可視化中的詞的相關性提取使用Plot.ly主題。在理想情況下,一個想要一些數據工程和模型開發過程,有時數據科學家可能想實驗模型建立與一個特定的數據集。因此,它可能會浪費整個ETL管道運行時的目的是實驗模型。在這個博客中,我們將展示如何單獨的數據的ETL過程科學實驗步驟使用磚特色商店保存提取的特征,這樣他們可以重用為實驗。這使它更容易嚐試使用各種話題如LDA和執行hyperparameter優化建模算法。這也使得實驗更加係統化、可再生的特性存儲允許版本控製

過程的概述

在這項工作中,我們從各種政治人物和存儲下載微博以JSON格式。工作流從這些tweet中提取主題由以下步驟組成

  1. 讀取JSON數據
  2. 清潔和轉換數據生成文本功能
  3. 創建存儲數據庫的特性
  4. 寫功能存儲生成的功能
  5. 負載特性的特性存儲和執行主題建模

特性是什麼商店?

存儲功能背後的大意是,它作為一個中央存儲庫來存儲不同模型的特性。的磚特色商店允許你做同樣的事情而被集成到磚統一平台。Beplay体育安卓版本功能存儲鼓勵特性發現,共享和血統追蹤。功能都是建立在商店三角洲表火花帶來ACID事務和其他處理引擎,

加載和轉換數據

我們首先加載數據使用Apache Pyspark™和提取所需的必要的字段提取主題。重複的微博被刪除,然後推標記並清洗去除stopwords。雖然不做進一步處理這項工作,強烈建議刪除鏈接和表情符號。

fs = feature_store.FeatureStoreClient ()df = spark.read。格式(“json”).load (“/ FileStore / * . txt”)pub_extracted = df.rdd。地圖(λx: (x [“用戶”][“screen_name”],x [“id”],x [“full_text”))).toDF ([“名字”,“tweet_id”,“文本”])pub_sentences_unique = pub_extracted.dropDuplicates ([“tweet_id”])記號賦予器=記號賦予器(inputCol =“文本”outputCol =“單詞”)wordsData = tokenizer.transform (pub_sentences_unique)劑= StopWordsRemover (inputCol =“單詞”outputCol =“過濾”)過濾= remover.transform (wordsData)

語料庫中的詞由字數矢量化,然後計算逆文檔頻率(IDF)。這些提取的特征在這個模型可以保存並在模型建立過程中重用。由於功能rawFeatures商店IDF的值,它是一個稀疏向量類型和特色商店不支持存儲數組,我們這一列轉換成一個字符串,這樣就可以將保存在存儲特性。我們把這個帶回一個向量從特性存儲在閱讀它,因為我們知道模式的特性,我們可以使用它在我們的模型中。

簡曆=CountVectorizer (inputCol=“過濾”,outputCol=”vocabSize rawFeatures”=5000年,minDF=10.0)cvmodel=cv.fit(過濾)詞彙=cvmodel.vocabularyfeaturizedData=cvmodel.transform(過濾)以色列國防軍=IDF (inputCol=”outputCol rawFeatures”=“特性”)idfModel=idf.fit (featurizedData)rescaledData=idfModel.transform (featurizedData)rescaledData=rescaledData.withColumn (“stringFeatures”,rescaledData.rawFeatures。(StringType ()))rescaledData=rescaledData.withColumn (“coltext”concat_ws (”、“,“過濾”))

特色商店

保存功能

我們首先創建一個數據庫來保存功能表。功能存儲客戶端對象創建與此功能進行交互。我們至少創建特性存儲通過指定商店的名字,鑰匙和列得救。在下麵的例子中,我們把四列從上麵生成的數據幀。特色商店三角洲表以來,功能可以被重寫,和特征值僅僅是版本控製,這樣他們就可以被檢索後,允許可再生的實驗。

創建如果數據庫存在lda_example2;fs=feature_store.FeatureStoreClient ()fs.create_feature_table(名稱=“lda_example2。rescaled_features”鍵=(“tweet_id”,“文本”,“coltext”,“stringFeatures”),features_df=rescaledData.select (“tweet_id”,“文本”,“coltext”,“stringFeatures”))

負載特性存儲

一旦功能被保存,不需要重新運行ETL管道下次數據科學家想要嚐試一種不同的模式,節省了大量的時間和計算資源。的功能可以使用fs隻是從表中加載。read_table通過表名,如果需要,時間戳來檢索一個特定版本的特性。

自從轉換IDF值被存儲為一個字符串,我們需要提取的值,把它變成一個稀疏向量格式。如下所示的轉換和數據幀df_new創建,將美聯儲的話題建模算法。

fs = feature_store.FeatureStoreClient ()昨天= datetime.date.today () + datetime.timedelta(秒=36000年)#讀取特性值lda_features_df = fs.read_table (name =“lda_example2.rescaled_features”,# as_of_delta_timestamp = str(昨天))df_new = lda_features_df.withColumn (“s”expr (“分裂(substr (stringFeatures 2長度(stringFeatures) 2),“\ \ \ \ s * (? = \ \ \ \ [)”)))\.selectExpr (”“”concat (/ *類型= 0 SparseVector DenseVector * /和類型= 1“[{“類型”:0,“大小”:”,s [0],”、“指數”:”[1],”、“價值觀”:”[2],'})')作為vec_json”“”)\.withColumn (“特性”from_json (“vec_json”ArrayType (VectorUDT ()))0])

構建主題模型

一旦我們建立的數據幀中提取特征,提取的主題可以使用潛在狄利克雷分配(LDA)算法從PySpark毫升庫。LDA是定義如以下:

潛在狄利克雷分配(LDA)是一個生成,概率模型文件的集合,表示為混合物的潛在的主題,每個主題的特征是一個分布的話。”

簡單來說,這意味著每個文檔是由一係列的話題,和文檔之間的這些主題的比例有所不同。話題本身表示為單詞的組合,與分布在代表它們與主題的相關性。有兩個hyperparameters確定主題的混合的程度。名為“beta”的主題集中參數和文檔集中參數稱為“α”用來顯示分別主題和文檔之間的相似程度。高α值將導致文件有類似的主題和較低的值將導致文件較少但不同的主題。在很大的值α,α趨於無窮時,所有文件將包含相同的主題。同樣,更高的β值將導致類似的主題在一個較小的值將導致主題有更少的字,因此是不同的。

因為LDA是一個無監督算法,沒有“地麵實況”建立模型的準確性。主題的數量khyperparameter,通常可以通過指標調整或優化模型等困惑。α和βhyperparameters可以設置使用參數setDocConcentrationsetTopicConcentration,分別。

一旦模型適合於提取的特征,我們可以創建一個主題使用Plot.ly可視化。

lda_model = LDA (k =10麥克斯特=20.)# learning_offset -大值downweight早期的迭代使用setDocConcentration # DocConcentration -優化,例如setDocConcentration ([0.1, 0.2])使用setTopicConcentration # TopicConcentration -設置。例如setTopicConcentration (0.5)模型= lda_model.fit (df_new)lda_data = model.transform (df_new)你= model.logLikelihood (lda_data)lp = model.logPerplexity (lda_data)vocab_read = spark.read。格式(“δ”).load (“/ tmp / cvvocab”)vocab_read_list = vocab_read.toPandas () (“詞彙”). valuesvocab_broadcast = sc.broadcast (vocab_read_list)主題= model.describeTopics ()defmap_termID_to_Word(termIndices):話說= []termIDtermIndices:words.append (vocab_broadcast.value [termID])返回單詞
              udf_map_termID_to_Word = udf (map_termID_to_Word ArrayType (StringType ()))ldatopics_mapped = topics.withColumn (“topic_desc”udf_map_termID_to_Word (topics.termIndices))topics_df = ldatopics_mapped.select(坳(“termweights”)、坳(“topic_desc”).toPandas ()顯示器(topics_df)

下麵的圖展示了主題分布的條形圖,其中每一行對應一個主題。酒吧在一行顯示與一個主題相關的各種詞彙和它們的相對重要性的話題。正如上麵提到的,主題是一個需要域級的專業技能或hyperparameter hyperparameter調優。

條形圖的單詞每個主題,每一行表示一個主題,酒吧的高度表示每個詞的重量
條形圖的單詞每個主題,每一行表示一個主題,酒吧的高度表示每個詞的重量

結論

我們已經看到如何加載JSON文件的集合的tweet並獲得相對幹淨的文本數據。文本是矢量化,然後它可以利用機器學習算法之一NLP)。矢量化數據被保存為功能使用磚特性存儲,以便它可以使重用數據科學家和實驗。主題被美聯儲PySpark LDA算法和提取的主題然後使用Plot.ly可視化。我鼓勵你去嚐試這種管道的筆記本和實驗通過調整hyperparameters,如數量的話題,看它如何為你工作!

試著筆記本

免費試著磚

相關的帖子

看到所有工程的博客的帖子
Baidu
map