Spark+ansjはビッグデータ量の中国語を分詞する
2795 ワード
現在の分詞器の大部分は,単機サーバで分詞するか,hadoop mapreduceを用いてhdfsに格納された大量のデータテキストを分詞する.mapreduceの速度が遅いため,sparkに比べてコード書き込みが煩雑である.本稿では,hdfsに格納された中国語テキストデータをspark+ansjを用いて分詞する.
まず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にアップロードし,直接ダウンロードして使用することができる.
例は次のとおりです.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
まず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にアップロードし,直接ダウンロードして使用することができる.
例は次のとおりです.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.Arrays
object 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
0
,filter.size())) yield filter.get(i).getName
word.mkString(
"\t"
)
}
text.saveAsTextFile(
"/pathr/to/TokenFile"
)
}