Hanlp分詞1.7版本在Spark中分散式使用記錄

adnb34g發表於2019-03-11


新發布 1.7.0版本的hanlp自然語言處理工具包差不多已經有半年時間了,最近也是一直在整理這個新版本hanlp分詞工具的相關內容。不過按照當前的整理進度,還需要一段時間再給大家詳細分享整理的內容。昨天正好看到的這篇關於關於1.7.0版本hanlp分詞在spark中的使用介紹的文章,順便分享給大家一起學習一下!

 

以下為分享的文章內容:

HanLP分詞,如README中所說,如果沒有特殊需求,可以透過maven配置,如果要新增自定義詞典,需要下載“依賴jar包和使用者字典".

直接 "java xf hanlp-1.6.8-sources.jar" 解壓原始碼,把原始碼加入工程(依賴本地jar包,有些麻煩,有時候到伺服器有找不到jar包的情況)

按照文件操作,在 Spark中分詞,預設找的是本地目錄,所以如果是在driver中分詞是沒有問題的。但是如果要分散式分詞,是要把詞典目錄放在HDFS上面,因為這樣每臺機器才可以訪問到 【參考程式碼】

最好把新增詞典放在首位 第一次使用時 ,HanLP會把新增txt檔案,生成bin檔案,這個過程比較慢。但是隻需要跑一次,它會把bin檔案寫到HDFS路徑上面,第二次以後速度就快一些了。

注意到 issue中說,只可以在mapPartition中使用

 

參考 scala程式碼

 

class HadoopFileIoAdapter extends IIOAdapter {

 

  override def create(path: String): java.io.OutputStream = {

    val conf: Configuration = new Configuration()

    val fs: FileSystem = FileSystem.get(URI.create(path), conf)

    fs.create(new Path(path))

  }

 

  override def open(path: String): java.io.InputStream = {

    val conf: Configuration = new Configuration()

    val fs: FileSystem = FileSystem.get(URI.create(path), conf)

    fs.open(new Path(path))

  }

}

 

def myfuncPerPartition_ ( iter : Iterator [String] ) : Iterator[(Int, mutable.Buffer[String])]  = {

      println("run in partition")

      val keyWordNum = 6

      HanLP.Config.IOAdapter = new HadoopFileIoAdapter

      val ret = iter.filter(_.split(",",2).length==2)

        .map(line=>(line.split(",",2)(1).trim.hashCode, HanLP.extractKeyword(line.split(",",2)(0),keyWordNum)

          .map(str=>str.filterNot(stopChar.contains(_))).filter(w=>(w.length>1 || ( w.length==1 && white_single_word.contains(w(0))) ))

          .filterNot(stopWords.contains(_)).take(keyWordNum).distinct))

      ret

    }

 

//呼叫

raw_data.repartition(100).mapPartitions(myfuncPerPartition_)

---------------------


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2638053/,如需轉載,請註明出處,否則將追究法律責任。

相關文章