Spark + ansj 對大數據量中文進行分詞
????目前的分詞器大部分都是單機服務器進行分詞,或者使用hadoop mapreduce對存儲在hdfs中大量的數據文本進行分詞。由于mapreduce的速度較慢,相對spark來說代碼書寫較繁瑣。本文使用 spark + ansj對存儲在hdfs中的中文文本數據進行分詞。
首先下載ansj源碼文件,下載地址為https://github.com/NLPchina/ansj_seg,同時需要下載nlp-lang.jar包,下載地址上述網站中可以看到。由于spark傳輸數據必須進行序列化,而ansj中的屬性類都沒有實現序列化,需要將ansj_seg-master/src/main/java/org/ansj/domain中的屬性類AnsjItem、Nature、 NewWord、NumNatureAttr、PersonNatureAttr、Term、TermNature、TermNatures分別實現 Serializable接口。然后使用maven的mvn install生成ansj_seg-2.0.8.jar包,將編譯的ansj_seg-2.0.8.jar包 和之前下載的nlp-lang-0.3.jar包加入到spark依賴中,spark便可對hdfs中的文本進行分詞。另外,將序列化后編譯的jar上傳至csdn,可以直接下載使用。
實例如下:
import org.apache.spark.SparkContext import org.ansj.domain.Term import org.ansj.splitWord.analysis.ToAnalysis import org.ansj.util.FilterModifWord import org.ansj.library.UserDefineLibrary import java.util.Arraysobject TokenTest extends App { val sc = new SparkContext val numpatitions = 100 val text = sc.textFile("/path/to/ChineseFile", numpatitions).map { x => val temp = ToAnalysis.parse(x) //加入停用詞 FilterModifWord.insertStopWords(Arrays.asList("r","n")) //加入停用詞性
FilterModifWord.insertStopNatures("w",null,"ns","r","u","e") val filter = FilterModifWord.modifResult(temp) //此步驟將會只取分詞,不附帶詞性 val word = for(i<-Range(0,filter.size())) yield filter.get(i).getName word.mkString("\t") } text.saveAsTextFile("/pathr/to/TokenFile") }</pre>