Spark中文分词案例
  ILwIY8Berufg 2023年11月02日 35 0

这里介绍一下用spark对中文文本中的关键字提取,这里使用IK分词实现

Spark中文分词案例_Word

Maven依赖

<dependencies>
	<dependency>
		<groupId>org.apache.hadoop</groupId>
		<artifactId>hadoop-common</artifactId>
		<version>2.7.6</version>
	</dependency>
	<dependency>
		<groupId>org.apache.spark</groupId>
		<artifactId>spark-core_2.11</artifactId>
		<version>${spark.version}</version>
	</dependency>
	<dependency>
		<groupId>org.apache.spark</groupId>
		<artifactId>spark-mllib_2.11</artifactId>
		<version>${spark.version}</version>
	</dependency>
	<dependency>
		<groupId>com.janeluo</groupId>
		<artifactId>ikanalyzer</artifactId>
		<version>2012_u6</version>
	</dependency>
	<dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-core</artifactId>
		<version>3.6.0</version>
	</dependency>
</dependencies>

斗罗大陆.txt

唐门外门弟子唐三,因偷学内门绝学为唐门所不容,跳崖明志时却来到了另一个世界,一个属于武魂的世界。名叫斗罗大陆。

  这里没有魔法,没有斗气,没有武术,却有神奇的武魂。这里的每个人,在自己六岁的时候,都会在武魂殿中令武魂觉醒。武魂有动物,有植物,有器物,它们可以辅助人们的日常生活。而其中一些特别出色的武魂却可以用来修炼,这个职业,是斗罗大陆上最为强大也是最重要的职业,——魂师。

  当唐门暗器来到斗罗大陆,当唐三武魂觉醒,他能否在这片武魂的世界重塑唐门辉煌?

  职业等级:魂士、魂师、大魂师、魂尊、魂宗、魂王、魂帝、魂圣、斗罗、封号斗罗。

SplitWord.java

package util;


import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author Daniel
 * @Description IK中文分词
 **/
public class SplitWord {
    public static void main(String[] args) {
        List<String> splitWord = getSplitWord("唐门外门弟子唐三,因偷学内门绝学为唐门所不容,跳崖明志时却来到了另一个世界,一个属于武魂的世界。名叫斗罗大陆。", 2);
        System.out.println(splitWord);
    }

    public static List<String> getSplitWord(String line, int wordLength) {
        List<String> words = new ArrayList<>();
        // 过滤掉控制
        if (line == null || line.trim().length() == 0) {
            return words;
        }

        try {
            // 这里使用IK中封装好的类IKSegmenter来进行分词
            IKSegmenter seg = new IKSegmenter(new InputStreamReader(new ByteArrayInputStream(line.getBytes(StandardCharsets.UTF_8))), false);
            // 获取下一个词元
            Lexeme lex = seg.next();

            while (lex != null) {
                // 获取词元内容
                String word = lex.getLexemeText();
                if (wordLength == 0 || word.length() == wordLength) {
                    // 将分词结果放到集合中
                    words.add(word);
                }
                // 迭代
                lex = seg.next();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return words;
    }


}

ExtractChineseKeyWord.scala

package util

import java.io.{BufferedWriter, File, FileWriter}

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

import collection.JavaConverters._
import org.apache.spark.rdd.RDD

/**
  * @Author Daniel
  * @Description Spark中文关键词提取
  **/

object ExtractChineseKeyWord {

  def main(args: Array[String]) {
    // (输入文件或文件夹,选择N字词,取出topN)
    getKeyWords("斗罗大陆.txt", 2, 0)
  }


  def getKeyWords(doc: String, wordLength: Int, topN: Int) {
    val conf = new SparkConf()
    conf.setAppName("Spark中文关键字提取工具")
    conf.setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd: RDD[(String, Int)] = sc.textFile(doc)
      // 指定分词方式为IK分词
      .flatMap { line => SplitWord.getSplitWord(line, wordLength).asScala }
      // wordcount
      .map { word => (word, 1) }
      .reduceByKey(_ + _)
      // 排序
      .sortBy(x => x._2, ascending = false)
    var result = ""
    // 如果topN等于0则取出所有分词结果
    if (topN == 0) {
      result = rdd.collect().mkString("\n")
    } else {
      result = rdd.take(topN).mkString("\n")
    }

    sc.stop()
    writeFile("wordcount.txt", result)

  }

  // 报错为文件
  def writeFile(output: String, context: String) {
    val bw = new BufferedWriter(new FileWriter(new File(output)))
    bw.write(context)
    bw.close()
  }

}

wordcount.txt

(武魂,8)
(唐门,4)
(世界,3)
(职业,3)
(没有,3)
(大陆,3)
(一个,2)
(可以,2)
(来到,2)
(这里,2)
(觉醒,2)
(属于,1)
(到了,1)
(修炼,1)
(等级,1)
(个人,1)
(门外,1)
(也是,1)
(封号,1)
(重要,1)
(辅助,1)
(名叫,1)
(外门,1)
(另一,1)
(人们,1)
(特别,1)
(会在,1)
(最为,1)
(六岁,1)
(陆上,1)
(这片,1)
(而其,1)
(重塑,1)
(植物,1)
(生活,1)
(不容,1)
(出色,1)
(一些,1)
(有神,1)
(内门,1)
(门弟,1)
(别出,1)
(暗器,1)
(能否,1)
(它们,1)
(都会,1)
(助人,1)
(魔法,1)
(最重,1)
(每个,1)
(在这,1)
(却可,1)
(武术,1)
(日常,1)
(这个,1)
(中一,1)
(其中,1)
(明志,1)
(动物,1)
(斗气,1)
(绝学,1)
(弟子,1)
(器物,1)
(强大,1)
(偷学,1)
(却有,1)
(用来,1)
(辉煌,1)
(神奇,1)
(时候,1)
(自己,1)
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  F36IaJwrKLcw   2023年12月23日   42   0   0 idesparkidesparkDataData
ILwIY8Berufg
最新推荐 更多

2024-05-31