科學知識圖譜繪製的大數據挖掘方法-3

新興學科科學知識圖譜繪製的大數據挖掘方法和實現 -3

金刀客html

6 抓取數據預處理

對於數據預處理須要使用天然語言處理理論、方法和工具。java

6.1 天然語言處理簡介

天然語言處理(簡稱NLP)是計算機科學領域與人工智能領域中的一個重要方向。它研究能實現人與計算機之間用天然語言進行有效通訊的各類理論和方法。天然語言處理是一門融語言學、計算機科學、數學於一體的科學。所以,這一領域的研究將涉及天然語言,即人們平常使用的語言,因此它與語言學的研究有着密切的聯繫,但又有重要的區別。天然語言處理並非通常地研究天然語言,而在於研製能有效地實現天然語言通訊的計算機系統,特別是其中的軟件系統。於是它是計算機科學的一部分。天然語言處理總體技術體系以下圖所示:python

最先的天然語言理解方面的研究工做是機器翻譯。1949年,美國人威弗首先提出了機器翻譯設計方案。20世紀60年代,國外對機器翻譯曾有大規模的研究工做,耗費了鉅額費用,但人們當時顯然是低估了天然語言的複雜性,語言處理的理論和技術均不成熱,因此進展不大。主要的作法是存儲兩種語言的單詞、短語對應譯法的大辭典,翻譯時一一對應,技術上只是調整語言的同條順序。但平常生活中語言的翻譯遠不是如此簡單,不少時候還要參考某句話先後的意思。
大約90年代開始,天然語言處理領域發生了巨大的變化。這種變化的兩個明顯的特徵是:
(1)對系統輸入,要求研製的天然語言處理系統能處理大規模的真實文本,而不是如之前的研究性系統那樣,只能處理不多的詞條和典型句子。只有這樣,研製的系統纔有真正的實用價值。
(2)對系統的輸出,鑑於真實地理解天然語言是十分困難的,對系統並不要求能對天然語言文本進行深層的理解,但要能從中抽取有用的信息。例如,對天然語言文本進行自動地提取索引詞,過濾,檢索,自動提取重要信息,進行自動摘要等等。mysql

同時,因爲強調了「大規模」,強調了「真實文本」,下面兩方面的基礎性工做也獲得了重視和增強。
(1)大規模真實語料庫的研製。大規模的通過不一樣深度加工的真實文本的語料庫,是研究天然語言統計性質的基礎。沒有它們,統計方法只能是無源之水。
(2)大規模、信息豐富的詞典的編制工做。規模爲幾萬,十幾萬,甚至幾十萬詞,含有豐富的信息(如包含詞的搭配信息)的計算機可用詞典對天然語言處理的重要性是很明顯的。
經常使用的天然語言處理框架有:git

名稱 模塊 語言
Stanford NLP 最著名的NLP框架。包括多種語言的各方面NLP模塊:英文詞根化、中文分詞、詞性標註、名詞識別、語法分析等等 Java、Python
NLTP 使用普遍的開源NLP框架。包括衆多NLP模塊、多種語料庫:英文詞根化、詞性標註、名詞識別和語法分析等對於中文分詞須要調用Standford NLP實現 Python
哈工大Ltp3 中文領域最著名對的NLP框架,包括全面的NLP模塊:中文分詞、詞性標註、名詞識別、句法分析、語義角色標註等等 C++
Fudan NLP 復旦大學的NLP處理框架中文分詞和句法分析等 Java
HanLP 開源NLP處理框架中文分詞、句法分析等 Java

6.2 數據預處理方法和技術

數據預處理主要包括中文和英文預處理兩部分。github

6.2.1 中文數據預處理

數據預處理具體使用的天然語言處理中的包括中文分詞、英文詞根化、去停用詞和特殊字符等方法。其中最難處理的是中文分詞,下面對其進行簡介。
漢語天然語言處理有別於英文天然語言處理的重要部分就是中文分詞(Chinese Word Segmentation)。中文分詞經常使用的方法分爲兩大類:web

  • (1)基於條件隨機場(CRF)的中文分詞算法,如Standford NLP和哈工大分詞系統
  • (2)基於中科院的張華平教授的NShort中文分詞算法,如中科院ICTCLAS分詞系統
分詞方法 規模 編程語言
ICTCLAS分詞系統 大規模中文分詞系統 C++
結巴分詞 小規模 Python
Ltp 中等規模 C++、python
Stanford NLP 大規模 Java

本書使用Spark調用Stanford NLP中的分詞方法,進行中文分詞。安裝JDK開發環境,下載Stanford NLP工具包 Stanford CoreNLP 3.6版,及下載包括中文在內的所有語言包,就能夠在spark項目中添加stanfoud-chinese-corenlp-model.jar,使用Stanford NLP工具包進行分詞。
下面使用HanLP說明一下分詞原理,它和ICTCLAS分詞原理基本相似。
ICTCLAS分詞算法源於隱馬爾科夫模型(HMM)。其中核心代碼爲NShortSegment類的segSentence方法:算法

@override
public List<Term> segSentence(char[] sentence){
  WordNet wordNetOptimum = new WordNet(sentence);
  WordNet wordNetAll = new WordNet(sentence);
  //1.粗分
  List<List<Vertex>> coarseResult = BigSegment(sentence, 2, wordNetOptimum, wordNetAll);
  boolean NERexists = false;
  for(List<Vertex> vertexList : coarseResult){
  if(HanLP.Config.DEBUG){
  System.out.println("粗分結果" + convert(vertexList, false));
  }


  //2. 實體名識別
  if(config.ner){
  wordNetOptimum.addAll(vertexList);
  int preSize = wordNetOptimum.size();
  if(config.nameRecognize){
  PersonRecognition.Recognition(vertexList, wordNetOptimum, wordNetAll);
  }
  if(config.translatedNameRecongnize){
  translatedPersonRecogniztion.Recognition(vertexList, wordNetOptimum, wordNetAll);
  }
  if(config.japaneseNameRecognize){
  JapanesePersonRecognition.Recognition(vertexList, wordNetOptimum, wordNetAll);
  }
  if(config.placeRecognize){
  PlaceRecongnition.Recognition(vertexList, wordNetOptimum, wordNetAll);
  }
  if(config.organizationRecognize){
  vertexList = Dijkstra.compute(GenerateBiGraph(wordNetOptimum));
  wordNetOptimum.addAll(vertexList);
  organizationRecognition.Recognition(vertexList, wordNetOptimum, wordNetOptimum);
  }
  if(!NERexists && preSize != wordNetOptimum.size()){
  NERexists = true;
  }
  }
  }

  //3.細分階段
  List<Vertex> vertexList = coarseResult.get(0);
  if(NERexists){
  Graph graph = GenerateBiGraph(wordNetOptimum);
  vertexList = Dijkstra.compute(graph);
  if(HanLP.Config.DEBUG){
  System.out.printf("細分詞網:\n%s\n", wordNetOptimum);
  System.out.printf("細分詞圖: %s\n", graph.printByTo());
  }
  }
  //識別數字
  if(config.numberQunantifierRecognize){
  mergeNumberQuantifier(vertexList, wordNetAll, config);
  }
  //若是是索引模式則所有切分
  if(config.indexMode){
  return decorateResultForIndexMode(vertexList, wordNetAll);
  }
  //4. 詞性標準階段
  if(config.speechTagging){
  speechTagging(vertexList);
  }
  return convert(vertexList, config.offset);
}

6.2.2 英文數據預處理

英文數據預處理主要包括:提取詞元(token)、詞根化(stemming),保留表情、標籤等特殊符號,去停用詞,咱們是NLTK來完成這一過程。完整的英文數據預處理過程如圖4.5所示。sql

english_data_preprocessing

圖4.5 英文數據預處理過程shell

7 預處理後數據的存儲

7.1 數據常規存儲

7.1.1 保存爲JSON文件

JSON是一種在網絡上特別是JavaScript常用的一種數據存儲格式,屬於輕量級數據交換格式。

JSON與XML對好比下圖所示:
JSON_VS_XML1

JSON_VS_XML_2

7.1.2 保存在MySQL數據庫

使用Python的pymysql模塊對Scrapy爬蟲爬取的數據保存到MySQL數據庫中,病進行數據庫操做。將Scrapy爬取的數據存入MySQL中須要修改pipelines.py,修改代碼以下所示:

import pymysql

class MysqlPipeline(object):
  def __init__(self):
    # 連接MySQL數據庫
    self.conn = pymysql.connect(
    host="127.0.0.1", user="root", passwd="pass", db="mysqldb")

  def process_item(self, item, spider):
    # 獲取到的name和keywd分別賦給變量name和變量key
    name = item["name"][0]
    key = item["keywd"][0]
    # 構造對應的SQL語句
    sql = "insert into mytb(title, keywd) VALUES ('" + name + "', '" + key + "')"
    # 經過query實現執行對應的sql語句
    self.conn.query(sql)
     return item

  def close_spider(self, spider):
    self.conn.close()
    
  ITEM_PIPELINES = {
    'mysqlpjt.pipelines.MysqlpjtPipeline': 300,
    }

修改亂碼問題,在c:\Python3.5\Lib\site-packages\pymysql目錄下找到名爲connections.py。而後將文件中「charset=」,改成對應的編碼「utf8」,即:Charset=’utf8’。

7.2 數據海量存儲

本書項目獲得的數據是海量的沒法用傳統的方式進行存取,所以須要對大數據的有效的存儲方法。對於大非結構化數據能夠存儲在Hadoop的HDFS系統中;如使用如HBase的分佈式數據庫來存儲。既提升了存儲效率,也爲後期使用Hadoop平臺進行大數據計算作好了準備。
HBase是一個分佈式、面向列的開源數據庫,利用HBase技術能夠在廉價的PC服務器上搭建大規模結構化存儲集羣。HBase思想來源於Google的BigTable思想HBase利用Hadoop_MapReduce來處理海量數據,利用Zookeeper做爲其系統服務。

HBase具備如下特色:

  • (1) 線性和模塊化可擴展性
  • (2) 嚴格一致的讀寫
  • (3) 表的自動配置和分片
  • (4) 支持區域服務器集羣之間的自動故障轉移
  • (5) 方面的基類支持如MapReduce做業
  • (6) 易於使用Java API的客戶端訪問
  • (7) 塊緩存和布魯姆過濾器實時查詢
  • (8) Thrift網關和RESTful web 服務支持
  • (9) 可擴展的基於JRuby的腳本
  • (10) 支持監控信息經過Hadoop子系統導出達到文件

    此外,Pig和Hive爲HBase提供了高層的語言支持,使得HBase上進行數據統計處理變得很是簡單。Sqoop則爲Hbase提供了方便的RDBMS數據導入功能,使得傳統數據庫數據向HBase遷移很是方便。
    HBase設計的初衷是針對大數據進行隨機地、實時讀寫操做。隨着互聯網的發展,不少企業的數據也

7.3 Spark SQL讀取HBase

Hive本質上是一種關係型抽象,是將SQL查詢轉換爲MapRedcue做業。Spark_SQL使用來代替之前的Shark的,其中支持Hive的部分封裝爲一個稱謂HiveContext的新包中。

Spark_SQL支持標準的SQL和HiveQL來讀寫數據。HiveContext提供更好的HiveQL解析能力、UDF藉口和從Hive表中讀取數據的能力。

要啓動Hive的所有功能,首先要確保每一個worker節點上都要啓動集成Hive的jar包(Phive)並將hive-site.xml複製到spark安裝目錄下的conf文件夾下。默認狀況下,Spark_SQL建立的全部表格都是由Hive管理。也就是說,Hive擁有該表的整個生命週期的控制權,包括刪除權。注意Spark1.6支持Hive0.13。

具體實現步驟:

  • (1)打開spark-shell
  • $ spark-shell –driver-memory 1g
  • (2)建立HiveContext實例
  • Scala> val hc = new org.apache.spark.sql.hive.HiveContext(sc)
  • (3)建立一張person表,列名爲first_name、last_name和age
  • Scala> hc.sql(「create table if not exists person( first_name string, last_name string, age int) row format delimited fields terminated by ‘,’ 」)
  • (4)將本地數據導入到Person表中
  • Scala> hc.sql(「load data local inpath 」/home/dhuser/person」 into table person」)
  • (5)或從HDFS中導入數據
  • Scala> hc.sql(「load data inpath 」/home/dhuser/person」 into table person」)
  • (6)經過HiveSQL查詢Person表
  • Scala> val persons = hc.sql(」from person select first_name, last_name, age」)
  • Scala>persons.collect.foreach(println)
  • (7)直接進行表與表的複製
  • Scala> hc.sql(「create table person2 like person localtion ‘/user/hive/warehouse/person’ 」)

本書項目中,是在Hive中建立了包括論文(papers)、做者(authors)、出版社(publisher)和關鍵詞(keywords)在內的四張大表,並將Scrapy抓取的結果經過Spark SQL寫入Hive的表中。其中論文表包括:題目、做者、關鍵字、摘要、參考文獻和出版社六個字段。

8 大數據分析

8.1 特徵提取

8.1.1 向量空間模型

向量空間模型(VSM:Vector_Space_Model)由Salton等人於20世紀70年代提出,併成功地應用於著名的SMART文本檢索系統。VSM概念簡單,把對文本內容的處理簡化爲向量空間中的向量運算,而且它以空間上的類似度表達語義的類似度,直觀易懂。當文檔被表示爲文檔空間的向量,就能夠經過計算向量之間的類似性來度量文檔間的類似性。文本處理中最經常使用的類似性度量方式是餘弦距離。

VSM1
VSM2

向量空間模型 (或詞組向量模型)是一個應用於信息過濾,信息擷取,索引以及評估相關性的代數模型。SMART是首個使用這個模型的信息檢索系統。文件(語料)被視爲索引詞(關鍵詞)造成的屢次元向量空間,索引詞的集合一般爲文件中至少出現過一次的詞組。搜尋時,輸入的檢索詞也被轉換成相似於文件的向量,這個模型假設,文件和搜尋詞的相關程度,能夠經由比較每一個文件(向量)和檢索詞(向量)的夾角誤差程度而得知。

實際上,計算夾角向量之間的餘弦比直接計算夾角容易:餘弦爲零表示檢索詞向量垂直於文件向量,即沒有符合,也就是說該文件不含此檢索詞。經過上述的向量空間模型,文本數據就轉換成了計算機能夠處理的結構化數據,兩個文檔之間的類似性問題轉變成了兩個向量之間的類似性問題。

8.1.2 TF-IDF提取特徵

詞頻逆文本頻率(簡稱TF-IDF)是一種從文本文檔中生成特徵向量的方法。它爲文檔中每個詞計算兩個統計值:詞頻(TF)即每一個詞語在文檔中出現的次數,另外一個逆文本頻率(IDF)用來衡量一個詞語在整個文檔語料庫中出現的逆頻繁程度。二者的積即TF*IDF表示一個詞語特定文檔的相關程度。

MLlib中有兩種算法能夠計算TF-IDF:HashingTF和IDF,它們都在mllib.feature包內。HashingTF從一個文檔中計算給定大小的詞頻向量,爲了將詞與向量順序對應起來,它使用Hash方法。但在相似英語這種語言裏,有數十萬的單詞,所以對於單詞映射到向量中的一個獨立維度上須要付出很大代價。而HashTF使用每一個單詞對所需向量長度S取模得出的哈希值,把全部單詞映射到一個0到S-1的數字上。由此咱們保證生成一個S維的向量。在實踐中推薦獎S設置爲218到220之間。

HashingTF能夠一次只運行一個文檔中,也能夠運行於整個RDD中。它要求每一個文檔都是用響亮的可迭代序列來表示如python中的list。在進行TF計算以前先要進行數據預處理如單詞小寫、去標點、詞根化。實踐中,咱們在map()中調用NLTK進行英文處理調用Stanford NLP進行中文處理。
當構建好詞頻向量後,就可使用IDF來計算逆文檔頻率,而後當它們乘以詞頻來計算TF-IDF。首先,對IDF對象調用fit()方法獲取一個IDFmodel,它表明語料庫中的逆文本頻率。接下來,對模型調用transform()方法來把TF向量轉換爲IDF向量。計算代碼以下:

#!/usr/bin/python
from pyspark.mllib.feature import HashingFT, IDF

rdd = sc.wholeTextFiles(「data」).map(lambda(name,text): text.split())
tf = HashingTF()
tfVectors = tf.transform(rdd).cache()

idf=IDF()
idfModel=idf.fit(tfVectors)
tfIdfVectors = idfModel.transform(tfVectors)

代碼中咱們調用cache()方法,由於它被兩次調用(一次訓練IDF模型,一次用IDF乘以TF向量)

8.1.3 Word2Vec提取特徵

Word2Vec是google提出的一種基於神經網絡的文本特徵化計算方法。Spark在mllib.feature.Word2Vec引入了該方法的實現。
要訓練Word2Vec須要給它一個String類(每一個單詞用一個)的Iterable表示的語料庫。當模型訓練好後(經過Word2Vec.fit(rdd)),會獲得Word2VecModel,它能夠用來將每一個單詞經過transform()轉化爲一個向量。注意,Word2Vec算法規模大小等於你的詞庫中單詞數乘以向量大小(默認爲100),通常比較合適的詞庫大小爲100000個單詞。

8.1.4 優化處理

  1. 縮放處理

構建好特徵向量後,須要使用MLlib中的StandardScaler類進行縮放,同時控制均值和標準差。你須要建立一個StandardScalar類,對數據集調用fit()函數來獲取一個StandardScalerModel,也就是爲每一列計算平均值和標準差。而後使用模型對象的transform()方法來伸縮特徵向量集,示例代碼以下:

#!/usr/bin/python
from pysparkmllib.feature import StandardScaler

vector = [Vectors.dense(-2.0, 5.0, 1.0), Vectors.dense(2.0, 0.0, 1.0)]
dataset = sc.parallelize(vectors)
scaler = StandardScaler(withMean=true, withStd=True)
model = scaler.fit(dataset)
result = model.transform(dataset)
  1. 正則化處理

在某些狀況下,在準備輸入數據時,把向量正規化爲長度1也是有用的,可使用Normalizer類來實現,只要使用Normalizer.transform(rdd)就能夠了。默認狀況下,Normalizer使用歐氏距離,也能夠經過P值傳遞其餘距離計算方法。

8.2 聚類方法分析

8.2.1 聚類方法簡介

聚類分析是無監督學習任務。是在沒有給定劃分類別的狀況下,根據數據類似度進行樣本分組的數據挖掘方法。與分類模型須要使用有類標記樣本構成的訓練數據不一樣,聚類模型能夠創建在無類標記的數據上,是一種非監督學習算法。聚類根據數據自身的距離和類似度將它們劃分爲若干組,劃分的原則是組內樣本距離最小化而組間距離最大化。該算法主要用於數據探索或者異常點檢測(識別與任意聚類都比較遠的點)

聚類方法如表1所示,基於劃分的聚類方法如表2所示

類別 主要算法
基於劃分的方法 K-Means(K均值)、K-Medoids(K中心)、CLARANS(基於選擇)
基於密度的方法 BIRCH、CURE、CHAMELEON
基於密度的方法 DBSCAN、DENCLUE、OPTICS
基於網格的方法 STING、CLIOUE、WAVE-CLUSTER
基於模型的方法 統計學方法、神經網絡方法
算法 算法描述
K-Means K均值聚類又稱爲快速聚類,在最下化偏差函數的基礎上,將數據劃分爲預約的類數K。該算法原理簡單,並且便於處理大量數據。
K-Medoids K均值算法對孤立點有較強的敏感性。而K中心點算法不用簇中對象的平均值做爲簇中心,而選擇簇中心平均值最近的對象做爲簇中心。
系統聚類 系統聚類又稱爲多層次聚類,分類的單位由高到低呈樹形結構,且所處的位置越低,其包含的對象就越少,但這些對象間的共同特徵越多。該聚類方法只適用於小數據量,大數據量速度會很是慢

8.2.2 Spark MLlib

MLlib中包含經典的聚類算法K-Means,該方法如圖所示。以及一個叫作K-meansII(使用Bahmani的scalable K-means++的初始化過程)的變種,能夠爲並行環境提供更好的初始化策略。
K-means方法中最重要的參數是生成的聚類中心的目標數量K。事實上,你幾乎不可能提早知道聚類的真是數量,因此最佳實踐是嘗試幾個不一樣的K值,知道聚類內部平均距離不在顯著降低爲止。MLlib的K-means方法還接受方法:

  • (1)initializationMode:用於初始化聚類中心的方法能夠是K-meansII或者random,通常K-meansII會帶來更好的結果但開銷比較大。
  • (2)maxIterations:運行最大迭代次數(默認100)
  • (3)run:併發運行次數。
    當調用K-means算法時,你須要創建mllib.cluster.KMeans對象(Scala或Java)或KMeans.train(在python中)。它接受一個Vector組成的RDD做爲參數。K-means返回一個KMeansModel對象,該對象容許你訪問其clusterCenters屬性或者調用predict()來對新的向量返回它所屬於類別。Predict()總會返回和改點距離最近的聚類中心,即便與全部的類都離得很遠。

8.2.3 學科流派分析

咱們使用MLlib的聚類分析方法分析學科流派,具體就是經過聚類,將文獻聚成幾個大的類別,每一個大類別中在劃分出小的類別。這樣就將各個類別看作是該學科的各類流派,大的類別爲大流派,小的爲小流派。文獻對應的核心做者爲該流派的核心做者,該流派的關鍵字做爲該流派的核心觀點。

8.3 圖分析方法分析學者之間關係

8.3.1 小世界網絡

隨着萬維網、Facebook和twitter等社交網絡的興起。這些數據描述了真實世界中的網絡結構和形態,而不是科學家和圖論中的理性網絡模型。最先論文真是網絡屬性的是Duncan_Watts發表的*Collective_dynamics_of_‘small_world’_network*論文。該論文第一次爲具備」小世界」屬性的圖提出了數學生成模型,其特性:

  • (1)網絡中大部分節點的度都不高,它們和其餘節點造成了相對稠密的簇,即一個節點的鄰接節點大多數也是相連的
  • (2)雖然圖中的大部分節點的度都不高並且相對稠密的簇,但只需通過少數幾條邊可能從一個網絡節點快速到達另外一個節點

8.3.2 Spark GraphX和圖分析

8.3.3 分析伴生關係和構建伴生網絡

8.3.4 理解網絡結構

9 數據分析結果的可視化

數據可視化是數據挖掘的一個重要的部分。數據可視化藉助圖形化手段,清晰有效的傳達與溝通訊息。數據可視化與信息圖形、信息可視化、科學可視化以及統計圖形等有密切關係。數據可視化爲人類洞察數據的內涵、理解數據蘊藏的規律提供了重要的手段。

9.1 R語言簡介

R是用於統計分析、繪圖的語言和操做環境。R是屬於GNU系統的一個自由、免費、源代碼開放的軟件,它是一個用於統計計算和統計製圖的優秀工具。R做爲一種統計分析軟件,是集統計分析與圖形顯示於一體的。它能夠運行於UNIX,Windows和Macintosh的操做系統上,並且嵌入了一個很是方便實用的幫助系統,相比於其餘統計分析軟件,R還有如下特色:

  • (1)R是自由軟件。這意味着它是徹底免費,開放源代碼的。能夠在它的網站及其鏡像中下載任何有關的安裝程序、源代碼、程序包及其源代碼、文檔資料。標準的安裝文件身自身就帶有許多模塊和內嵌統計函數,安裝好後能夠直接實現許多經常使用的統計功能。[2]
  • (2)R是一種可編程的語言。做爲一個開放的統計編程環境,語法通俗易懂,很容易學會和掌握語言的語法。並且學會以後,咱們能夠編制本身的函數來擴展示有的語言。這也就是爲何它的更新速度比通常統計軟件,如,SPSS,SAS等快得多。大多數最新的統計方法和技術均可以在R中直接獲得。[2]
  • (3)全部R的函數和數據集是保存在程序包裏面的。只有當一個包被載入時,它的內容才能夠被訪問。一些經常使用、基本的程序包已經被收入了標準安裝文件中,隨着新的統計分析方法的出現,標準安裝文件中所包含的程序包也隨着版本的更新而不斷變化。在另外版安裝文件中,已經包含的程序包有:base一R的基礎模塊、mle一極大似然估計模塊、ts一時間序列分析模塊、mva一多元統計分析模塊、survival一輩子存分析模塊等等.[2]
  • (4)R具備很強的互動性。除了圖形輸出是在另外的窗口處,它的輸入輸出窗口都是在同一個窗口進行的,輸入語法中若是出現錯誤會立刻在窗口口中獲得提示,對之前輸入過的命令有記憶功能,能夠隨時再現、編輯修改以知足用戶的須要。輸出的圖形能夠直接保存爲JPG,BMP,PNG等圖片格式,還能夠直接保存爲PDF文件。另外,和其餘編程語言和數據庫之間有很好的接口。[2]
  • (5)若是加入R的幫助郵件列表一,天天均可能會收到幾十份關於R的郵件資訊。能夠和全球一流的統計計算方面的專家討論各類問題,能夠說是全世界最大、最前沿的統計學家思惟的彙集地.[2]

R是基於S語言的一個GNU項目,因此也能夠看成S語言的一種實現,一般用S語言編寫的代碼均可以不做修改的在R環境下運行。 R的語法是來自Scheme。R的使用與S-PLUS有不少相似之處,這兩種語言有必定的兼容性。S-PLUS的使用手冊,只要稍加修改就可做爲R的使用手冊。因此有人說:R,是S-PLUS的一個「克隆」。

9.2 用R可視化Spark

Spark自己並無可視化工具,但咱們能夠經過HDFS數據導出到R中,使用R進行可視化。R能夠繪製二維或三維空間中的點,但經過Spark計算獲取的結果一般維度很高,這就須要咱們將數據集投影到不超過三維空間上。另外一方面R不大適合處理大型數據集,所以須要對數據進行採樣,這樣才能使用R進行可視化。
下面代碼咱們從HDFS上讀取CSV數據,用sample方法來抽樣造成比較小的子集使其能夠放到R中進行計算。咱們用主成分分析或奇異值分解方法(這兩種方法的spark實如今前面已經介紹)將高緯度數據將維到二維或三維空間中,咱們使用直接的投影方式。代碼以下:

Val sample = data.map(datum =>
Model.predict(datum) + 「,」 + datum.toArray.mkString(「,」))
.sample(false, 0.05)
Sample.saveAsTextFile(「/user/ds/sample」)

3D交互可視化R代碼以下所示:

Install.package(「rgl」)
Library(rgl)
Clusters_data<-read.csv(pipe(「hadoop fs –cat /user/ds/sample/*」))
clusters<-clusters_data[1]
data<-data.mtrix(clusters_data[-c(1)])
rm(clusters_data)

random_projection<-matrix(data=rnorm(3*ncol(data)), ncol=3)
random_projection_normal<-
random_project /
sqrt(rowSums(random_projection*random_projection))

projected_data<-data.frame(data%*%random_projection_norm)

num_clusters<-nrow(unique(clusters))
palette<-rainbow(num_clusters)
colors = sapply(clusters, functions(c), palette[c])
plot3d(projected_data, col = colors, size=10)

9.3 數據可視化Web顯示

使用Flask將分析結果可視化。分爲如下兩步:

9.3.1 flask簡介

Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 受權。
Flask也被稱爲 「microframework」 ,由於它使用簡單的核心,用 extension 增長其餘功能。Flask沒有默認使用的數據庫、窗體驗證工具。
Flask簡單易學,下面是Flask版的hello world(hello.py)代碼:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
  return "Hello World!"

if __name__ == "__main__":
  app.run()

安裝Flask:

> pip install Flask

運行hello world程序

> python hello.py
hello.py* Running on http://localhost:5000/

9.3.2 結合R可視化數據

在Flask項目中定義Result_template.html用於顯示R可視化結果

# result_template.html
@app.route(‘/make/a/map’)
def make_map:
#讀取mySQL數據庫中的結果
    Data = get_data()
    C = Counter
    For each in data:
        C[「AGE」] = 1
        Return render_template(‘result_tempate.html’, json=R_json)

在result_template.html中嵌入JS代碼,將可視化結果展現出來。

10 部署

10.1生產環境簡介

生產環境列表

Hadoop生產環境 Cloudera 5.12
OS CentOS 7
Hadoop 2.6.3
Hive 1.2
Spark 1.6
Scala 2.11
Java 1.8
Python 3.6
R 1.4.8
Flask 0.12.2
Scrapy 1.5

本項目推薦部署環境爲兩種:一種是讀者的Hadoop大數據集羣可使用基於Yarn的部署方式,若是還要提升性能能夠考慮加入Tachyon內存管理存儲層;另外一種是讀者但願在公有云上部署,咱們爲您介紹基於Amazon的EC2解決方案,基於阿里雲的解決方案其步驟也差不準多。

10.2 基於Yarn的部署

10.2.1 部署原理

Yarn是基於HDFS的一種分佈式資源協調框架,是Hadoop的主要組成部分。Yarn聽從主從架構。主守護進程被稱爲資源管理器(ResourceManager),從守護進程被稱爲節點管理器(NodeManager)。除此以外,生命週期由ApplicationMaser負責,它能夠被派生到任何從節點上並能夠生存一個應用的生命週期時長。Spark若是運行在yarn上,資源管理器充當Spark Master,節點管理器充當執行節點。若是使用Yarn運行Spark,每一個Spark執行程序以Yarn容器的形式運行。
部署在Yarn上的Spark應用有兩種模式:
(1) yarn-client:Spark驅動運行在Yarn集羣以外的客戶端進程上,而且ApplicationMaster僅用於協調安排資源管理器的資源。架構圖如圖所示。
(2) yarn-cluster:Spark驅動運行於由從節點的節點管理器派生的ApplicationMaster上。架構圖如圖所示。
前一種方式適用於開發和調試,後一種方式適用於生產環境部署。不須要特別指定哪一個模式,由於它油Hadoop的配置決定,master的參數是yarn-client爲前一種方式,而yarn-cluster爲後一種方式。
Yarn模式下,可配置的參數包括:

  • num-executors:配置可分配執行程序數
  • executor-memory:每一個執行程序可以使用的內存
  • executor-cores:每一個執行程序可以使用的CPU內核數

10.2.2 具體實施步驟

  1. 配置參數
    編輯spark-env.sh文件(/opt/spark/conf)
    添加:
export HADOOP_CONF_DIR=/opt/hadoop/etc/Hadoop
expprt YARN_CONF_DIR=/opt/hadoop/etc/Hadoop
  1. 以yarn-client模式啓動Yarn Spark
$ spark-submit --class path-to-your-class --master yarn-client [option] <app jar> [app options]

如:

$ spark-submit --class com.bigdata --master yarn-client --num-executors 3 --driver-memory 4g --executor-memory 2g --executor-cores 1 target/sparkio.jar 10
  1. 以Spark-shell方式啓動yarn-client:
$ spark-shell --master yarn-client
  1. 以yarn-cluster模式啓動Yarn Spark
$ spark-submit --class path-to-your-class --master yarn-cluster [options] <app jar> [app options]

如:

$ spark-submit --class com.bigdata class --master yarn-cluster --num-executors 3 --driver-memory 4g --executor-memory 2g --executor-cores target/sparkio.jar 10

10.3 基於Tachyon內存存儲層的Spark集羣部署

Tachyon是一個高性能、高容錯、基於內存的開源分佈式存儲系統[1],並具備類Java的文件API、插件式的底層文件系統、兼容Hadoop_MapReduceApache_Spark等特徵。Tachyon可以爲集羣框架(如Spark、MapReduce等)提供內存級速度的跨集羣文件共享服務。Tachyon充分使用內存和文件對象之間的世代(Lineage)信息,所以速度很快,官方號稱最高比HDFS吞吐量高300倍。目前,不少公司(如Pivotal、EMC、紅帽等)已經在使用Tachyon,而且來自20個組織或公司(如雅虎、英特、紅帽等)的60多個貢獻者都在爲其貢獻代碼。Tachyon是於UC_Berkeley數據分析棧(BDAS)的存儲層,它仍是Fedroa操做系統自帶應用。

Spark平臺以分佈式內存計算的模式達到更高的計算性能,在最近引發了業界的普遍關注,其開源社區也十分活躍。以百度爲例,在百度內部計算平臺已經搭建並運行了千臺規模的Spark計算集羣,百度也經過其BMR的開放雲平臺對外提供Spark計算平臺服務。然而,分佈式內存計算的模式也是一柄雙刃劍,在提升性能的同時不得不面對分佈式數據存儲所產生的問題,具體問題主要有如下幾個:

    1. 當兩個Spark做業須要共享數據時,必須經過寫磁盤操做。好比:做業1要先把生成的數據寫入HDFS,而後做業2再從HDFS把數據讀出來。在此,磁盤的讀寫可能形成性能瓶頸。
    1. 因爲Spark會利用自身的JVM對數據進行緩存,當Spark程序崩潰時,JVM進程退出,所緩存數據也隨之丟失,所以在工做重啓時又須要從HDFS把數據再次讀出。
    1. 當兩個Spark做業需操做相同的數據時,每一個做業的JVM都須要緩存一份數據,不但形成資源浪費,也極易引起頻繁的垃圾收集,形成性能的下降。
  • 仔細分析這些問題後,能夠確認問題的根源來自於數據存儲,因爲計算平臺嘗試自行進行存儲管理,以致於Spark不能專一於計算自己,形成總體執行效率的下降。Tachyon的提出就是爲了解決這些問題:本質上,Tachyon是個分佈式的內存文件系統,它在減輕Spark內存壓力的同時賦予了Spark內存快速大量數據讀寫的能力。Tachyon把存儲與數據讀寫的功能從Spark中分離,使得Spark更專一在計算的自己,以求經過更細的分工達到更高的執行效率。[2]

Tachyon架構
圖1: Tachyon的部署

圖1顯示了Tachyon的部署結構。Tachyon被部署在計算平臺(Spark,MR)之下以及存儲平臺(HDFS, S3)之上,經過全局地隔離計算平臺與存儲平臺, Tachyon能夠有效地解決上文列
舉的幾個問題,:
• 當兩個Spark做業須要共享數據時,無需再經過寫磁盤,而是藉助Tachyon進行內存讀寫,從而提升計算效率。
• 在使用Tachyon對數據進行緩存後,即使在Spark程序崩潰JVM進程退出後,所緩存數據也不會丟失。這樣,Spark工做重啓時能夠直接從Tachyon內存讀取數據了。
• 當兩個Spark做業須要操做相同的數據時,它們能夠直接從Tachyon獲取,並不須要各自緩存一份數據,從而下降JVM內存壓力,減小垃圾收集發生的頻率。

10.4 在Amazon EC2上部署Spark

Amazon彈性計算雲(EC2)是一個可以提供可變大小的雲計算實例的網絡服務,已經有不少機構經過使用它節省了大量的人力和物力資源。EC2包括如下特性:

  • (1) 經過互聯網按需提供IT資源
  • (2) 提供足夠多的實例
  • (3) 像支付水電費同樣,按時按需付費
  • (4) 沒有配置成本,無需開銷,無需大量運維
  • (5) 當不須要時,能夠當即關閉甚至終止其生命週期
  • (6) 支持多種經常使用的包括Windows和Linux在的操做系統
  • (7) EC2提供不一樣類型的實例,以知足不一樣的計算需求,如通用實例、微實例、內存優化實例和存儲優化實例等,其中微實例提供免費試用

10.4.1 準備工做

Spark有綁定的Spark-ec2腳本使得在Amazon EC2上安裝、管理和關閉Spark集羣變得十分容易。
開始前須要完成如下工做:

  • (1) 登陸你的Amazon AWS帳號(http://aws.amazon.com/cn)
  • (2) 點擊右上角的個人帳戶的下拉菜單的安全證書
  • (3) 點擊訪問祕鑰並建立訪問祕鑰
  • (4) 記下訪問祕鑰ID(Access Key )和私有訪問祕鑰(Secret Access Key)
  • (5) 點擊進入EC2
  • (6) 點擊左側菜單網絡安全下面的密鑰對
  • (7) 點擊建立祕鑰對(Create Key Pair),輸入kp-spark做爲祕鑰對名稱
  • (8) 下載私鑰文件並複製到/home/hduser/keypairs文件夾下
  • (9) 設置文件權限許600
  • (10) 將公鑰ID和私鑰ID的設置到環境變量中如:
> echo 「export AWS_ACCESS_KEY_ID=\」AAJFJAOFJAOFAJ\」」 >> /home/hduser/.bashrc
> echo 「export AWS_ACCESS_KEY=\」+XrsagsgasgagaeeerCfsf\」」 >>
/home/hduser/.bashrc
> echo 「export PATH=$PATH:/opt/spark/ec2」 >> /home/hduser/.bashrc

10.4.2 具體實施步驟

  1. Spark綁定在EC2上的安裝腳本spark-ec2,使用下面命令部署集羣:
$ cd /home/hduser
$ spark-ec2 –k <key-pair> -i <key-file> -s <num-slaves> launch <cluser-name>
  1. 如下列數值爲例部署集羣
$ spark-ec2 –k kp-spark –i /home/hduser/keypairs/kp-spark.pem –hadoop-major-version 2 –s 3 launch spark-cluster
  1. 當缺省值不可用時,須要從新發送請求並定製特定的可用區域
$ spark-ec2 –k kp-spark –i /home/hduser/keypairs/kp-spark.pem –z us-east-1b –hadoop-major-version 2 –s 3 launch spark-cluster
  1. 如你的應用須要實例關閉後保留數據,就須要增長一個EBS卷(如10G空間)
$ spark-ec2 –k kp-spark –i /home/hduser/keypairs/kp-spark.pem –z us-east-1b –hadoop-major-version 2 –ebs-vol-size –s 3 launch spark-cluster
  1. 若是使用的時Amazon Spot實例
$ spark-ec2 –k kp-spark –i /home/hduser/keypairs/kp-spark.pem –z us-east-1b –spot-price=0.15 hadoop-major-version 2 –s 3 launch spark-cluster
  1. 一切部署完畢後,打開網頁或命令行查看集羣狀態

  2. 在EC2上使用Spark集羣,使用SSH登陸到主節點

$ spark-ec2 –k kp-spark –i /home/hduser/kp/kp-spark.pem login spark-cluster
  1. 檢查主節點的目錄並查看其用途
目錄 用途
Ephemeral-hdfs 存儲臨時數據,當重啓或關閉機器會被刪掉
Persisten-hdfs 每一個節點都有一個很小量的永久空間(約3G)。若是使用的話,數據會被保存在這個目錄下
Hadoop-native 用於支持Hadoop的原生庫如Snappy壓縮庫
Scala Scala安裝目錄
Shark Shark安裝目錄
Spark Spark安裝目錄
Spark-ec2 支持該集羣部署的文件
Tachyon Tachyon安裝目錄
  1. 檢查臨時實例的HDFS版本
$ ephemermral-hdfs/bin/hadoop version
  1. 更改日誌配置
> cd spark/conf
> mv log4j.properties.template log4j.properties
> vi log4j.properties
Log4j.rootCategory=INFO, console
改成:log4j.rootCategory=ERROR, console
  1. 修改後將全部的配置複製到全部從節點
$ spark-ec2/copydir spark/conf
  1. 使用完畢後銷燬Spark集羣
$ spark-ec2 destroy spark-cluster

11 總結

本書主要介紹和分析了基於大數據分析的學科知識圖譜的繪製方法。相比較傳統的科學知識圖譜的繪製方法,它有很明顯的優點,但也存在了一些不足。將兩種方法比較以下圖所示:

學科知識圖譜 傳統繪製方法 大數據處理繪製方法
典型軟件 CiteSpace或VOSviewer Hadoop、Spark、Scripy
方式 單機 分佈式
數據量 少許 海量
數據採集 手工採集期刊數據庫(如CNKI和WOS)的論文題錄 使用Scrapy自動爬取期刊數據庫(如CNKI)題錄信息
存儲方式 文本或MySQL數據庫 HDFS和Hive分佈式數據庫
計算方式 單機天然語言處理或機器學習工具包NLTK或sciki-learn 分佈式機器學習工具包如spark和深度學習工具TansorFlow
應用使用方式 單機應用Java GUI Web應用 Flask
可視化方法 基於Java的可視化Process R工具包
成熟度 十分紅熟 不十分紅熟

參考文獻

  • [1]. Russell M A. Mining the Social Web: Data Mining Facebook, Twitter, LinkedIn, Google+, GitHub, and More[M]. " O'Reilly Media, Inc.", 2013.
  • [2]. Choy M, Cheong M, Laik M N, et al. Us presidential election 2012 prediction using census corrected twitter model[J]. arXiv preprint arXiv:1211.0938, 2012.
  • [3]. Tumasjan A, Sprenger T O, Sandner P G, et al. Predicting Elections with Twitter: What 140 Characters Reveal about Political Sentiment[J]. ICWSM, 2010, 10: 178-185.
  • [4]. Kwak H, Lee C, Park H, et al. What is Twitter, a social network or a news media?[C]//Proceedings of the 19th international conference on World wide web. ACM, 2010: 591-600.
  • [5]. Java A, Song X, Finin T, et al. Why we twitter: understanding microblogging usage and communities[C]//Proceedings of the 9th WebKDD and 1st SNA-KDD 2007 workshop on Web mining and social network analysis. ACM, 2007: 56-65.
  • [6]. Sakaki T, Okazaki M, Matsuo Y. Earthquake shakes Twitter users: real-time event detection by social sensors[C]//Proceedings of the 19th international conference on World wide web. ACM, 2010: 851-860.
  • [7]. Cha M, Haddadi H, Benevenuto F, et al. Measuring User Influence in Twitter: The Million Follower Fallacy[J]. ICWSM, 2010, 10(10-17): 30.
  • [8]. Go A, Bhayani R, Huang L. Twitter sentiment classification using distant supervision[J]. CS224N Project Report, Stanford, 2009, 1: 12.
  • [9]. Kumar S, Morstatter F, Liu H. Twitter data analytics[M]. New York: Springer, 2014.
  • [10].Twitter development document. https://dev.twitter.com/overview/documentation[W]
  • [11]. flask: a microframework for python. http://flask.pocoo.org/ [W]
  • [12]. Tweepy: an easy-to-use python library for accessing the twitter api. http://www.tweepy.org/ [W]
  • [13]. "Twitter's API - HowStuffWorks." HowStuffWorks. N.p., n.d. Web. 24 Oct. 2014.
  • [14]. Grinberg M. Flask Web Development: Developing Web Applications with Python[M]. " O'Reilly Media, Inc.", 2014.
  • [15]. Ediger D, Jiang K, Riedy J, et al. Massive social network analysis: Mining twitter for social good[C]//2010 39th International Conference on Parallel Processing. IEEE, 2010: 583-593.
  • [16]. Jürgens P, Jungherr A. A Tutorial for Using Twitter Data in the Social Sciences: Data Collection, Preparation, and Analysis[J]. Preparation, and Analysis (January 5, 2016), 2016.
  • [17].李敏. 互聯網輿情監控系統設計與實現 [D]. Diss. 復旦大學, 2009.
  • [18]. 曾潤喜. "網絡輿情管控工做機制研究." 圖書情報工做 53.18 (2009): 79-82. [19]. 祝華新, 單學剛, 胡江春. 2011 年中國互聯網輿情分析報告[J]. 社會藍皮書: Z01Z, 2011.
  • [20]. Wei W, Xin X. 基於聚類的網絡輿情熱點發現及分析[J]. 現代圖書情報技術, 2009, 3(3): 74-79.
  • [21]. 曾潤喜, 徐曉林. 網絡輿情突發事件預警系統, 指標與機制[J]. 情報雜誌, 2009, 28(11): 52-54.
  • [22]. Gemsim: topic modelling for humans. https://radimrehurek.com/gensim/ [W]
  • [23]. McKinney W. Python for data analysis: Data wrangling with Pandas, NumPy, and IPython[M]. " O'Reilly Media, Inc.", 2012.
  • [24]. Pedregosa F, Varoquaux G, Gramfort A, et al. Scikit-learn: Machine learning in Python[J]. Journal of Machine Learning Research, 2011, 12(Oct): 2825-2830.
  • [25]. Demšar J, Curk T, Erjavec A, et al. Orange: data mining toolbox in Python[J]. Journal of Machine Learning Research, 2013, 14(1): 2349-2353.
  • [26]. Chaurasia S, McDonnell T. Synonymy and Antonymy Detection in Distributional Models[J]. 2016.
  • [27]. Hutto C J, Gilbert E. Vader: A parsimonious rule-based model for sentiment analysis of social media text[C]//Eighth International AAAI Conference on Weblogs and Social Media. 2014.
  • [28]. Word-clouds. https://amueller.github.io/word_cloud/ [W]
  • [29]. Lutz M. Learning python[M]. " O'Reilly Media, Inc.", 2013.
  • [30]. Aggarwal C C, Zhai C X. Mining text data[M]. Springer Science & Business Media, 2012.
  • [31]. Witten I H, Frank E. Data Mining: Practical machine learning tools and techniques[M]. Morgan Kaufmann, 2005.
  • [32]. Han J, Pei J, Kamber M. Data mining: concepts and techniques[M]. Elsevier, 2011.
相關文章
相關標籤/搜索