Spark:使用jieba分词的工程搭建

1、IDEA开发环境中project structure的设置

配置项目的JDK:

File > Project Structure > Project Settings > Project > Project SDK

在复选框中选择项目使用的JDK,如果之前没有设置,点击旁边的new按钮从本地目录导入自己下载好的JDK。

2、Maven配置文件的设置

IDEA Maven仓库:

Maven 仓库有三种类型:

  • 本地(local):通常maven的本地仓库在自己的用户目录下 .m2/respository。Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从中央仓库下载构件至本地仓库,然后再使用本地仓库的构件。如果中央仓库没有,如果设置了远程仓库,则尝试从远程仓库获取构件。
  • 中央(central):Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。一般来说,简单的Java项目依赖的构件都可以在这里下载到。需要通过网络才能访问。
  • 远程(remote):如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。

IDEA 项目的Maven本地仓库也是在用户主目录/.m2/respository,不过.m2文件是隐藏的,如果想要看到隐藏文件,在文件查看器页面使用ctrl+h即可看到隐藏文件了。

 在.m2/repository/org/apache/spark下就能找到我们引入的一系列org.apache.spark模块下的包。

配置jieba需要的包jieba-anaylsis.jar:

在工程下创建的pom.xml文件中加入以下代码引入jieba-anaylsis依赖:

# <dependencies>标签内加入:
        <dependency>
            <groupId>com.huaban</groupId>
            <artifactId>jieba-analysis</artifactId>
            <version>1.0.2</version>
        </dependency>

加入代码后Maven会自动帮你从中央仓库/远程仓库中拉取jar到本地仓库,使用时import即可。

3、程序中import语句导入分类词库

import org.apache.spark.sql.{DataFrame, SparkSession}//spark入口,DataFrame操作需要用到的包
import java.nio.file.{Path, Paths}//加入自定义词库时路径需要的包
 
import com.huaban.analysis.jieba.{JiebaSegmenter, WordDictionary}//jieba分词需要用到的包,其中WordDictionary为加入自定义词库需要
import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}//特征向量提取需要用到的包
 
import scala.collection.mutable//java.util.List转换成scala Aarray需要用到的包

4、分词词库(包括自定义词库)的存放与引用

默认词库:

同样的,在Maven本地库.m2/repository里在com/huaban文件夹里可以找到jieba-analysis.jar。

打开jieba-analysis.jar,dict.txt即为jieba的默认词库。

自定义词库:

jieba自定义词库的格式需要.txt文本文件,且每一行格式为:词 词频 词性。(注意三个部分是由空格隔开的,除了“词”其余两项允许是缺失的,但是如果想要自定义词库的优先级比默认词库高,就需要有词频(词频为多少任意,哪怕为1尚可))。

加入自定义词库:

import java.nio.file.{Path, Paths}
import com.huaban.analysis.jieba.{JiebaSegmenter, WordDictionary}
val path = Paths.get("/home/maples/phy.txt")
WordDictionary.getInstance().loadUserDict(path)

【注意】

Path.get()里要为自定义词库的绝对路径,如果要转换为相对路径的写法,可以使用getCanonicalPath()函数或getAbsolutePath()函数将相对路径转换为绝对路径,不过这两个函数的区别在于:

  • 对于getCanonicalPath()函数,“."就表示当前的文件夹,而”..“则表示当前文件夹的上一级文件夹。
  • 对于getAbsolutePath()函数,则不管”.”、“..”,返回当前的路径加上你在new File()时设定的路径。

详细解读可以参考:https://blog.csdn.net/u010261322/article/details/44219781

例如我写的,new File()相对文件路径是从工程文件夹根目录开始的(WordCount文件夹):

val path = Paths.get(new File("phy.txt").getCanonicalPath())

然后再正常分词(如果不加入自定义词库,直接使用以下代码即可):

val jieba = new JiebaSegmenter()
val res:String = jieba.sentenceProcess(text).toString()//text是待分词的文本字符串

 

5、jieba分词的关键API调用

jieba分词要首先初始化一个JiebaSegmenter对象:

val jieba = new JiebaSegmenter()

JiebaSegmenter对象下有两个方法:process()sentenceProcess()

在这里插入图片描述

在这里插入图片描述

从IDEA上给出的函数参数可以看出,process()需要两个参数(要进行分词的String类型的文本(段落),切分模式mode(INDEX或SEARCH));要使用SegMode参数需要引入:import com.huaban.analysis.jieba.JiebaSegmenter.SegMode。

sentenceProcess()只需要一个参数(要进行分词的String类型的文本(句子))。
我上面使用的是sentenceProcess,结果是对的。那么使用前者输出结果会是什么样的呢?有什么作用呢?下面就来测试一下:

val str:String = "我来到北京清华大学。"

var jieba0:String = new JiebaSegmenter().sentenceProcess(str).toString()
println(jieba0)
var jieba2:String = new JiebaSegmenter().process(str,SegMode.INDEX).toString()
println(jieba2)
var jieba3 = new JiebaSegmenter().process(str,SegMode.SEARCH).toString()
println(jieba3)

在这里插入图片描述

在此可以发现:使用process()结果是列表套列表,里面的每个小列表中元素依次是
[分好的词, 分好的词的第一个字符在文本字符数组的索引, 分好的词的最后一个字符在文本字符数组的索引的下一个索引]

INDEX:精准的切开,用于对用户查询词分词;
SEARCH:长词再切分,提高召回率。

(对这两个模式的解释翻遍全网,这个还算靠谱)

6、基于jieba分词的特征向量提取

https://blog.csdn.net/LOG_IN_ME/article/details/103047796

 

 

 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值