当前位置:   article > 正文

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

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依赖:

  1. # <dependencies>标签内加入:
  2. <dependency>
  3. <groupId>com.huaban</groupId>
  4. <artifactId>jieba-analysis</artifactId>
  5. <version>1.0.2</version>
  6. </dependency>

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

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

  1. import org.apache.spark.sql.{DataFrame, SparkSession}//spark入口,DataFrame操作需要用到的包
  2. import java.nio.file.{Path, Paths}//加入自定义词库时路径需要的包
  3. import com.huaban.analysis.jieba.{JiebaSegmenter, WordDictionary}//jieba分词需要用到的包,其中WordDictionary为加入自定义词库需要
  4. import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}//特征向量提取需要用到的包
  5. 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尚可))。

加入自定义词库:

  1. import java.nio.file.{Path, Paths}
  2. import com.huaban.analysis.jieba.{JiebaSegmenter, WordDictionary}
  1. val path = Paths.get("/home/maples/phy.txt")
  2. 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())

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

  1. val jieba = new JiebaSegmenter()
  2. 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,结果是对的。那么使用前者输出结果会是什么样的呢?有什么作用呢?下面就来测试一下:

  1. val str:String = "我来到北京清华大学。"
  2. var jieba0:String = new JiebaSegmenter().sentenceProcess(str).toString()
  3. println(jieba0)
  4. var jieba2:String = new JiebaSegmenter().process(str,SegMode.INDEX).toString()
  5. println(jieba2)
  6. var jieba3 = new JiebaSegmenter().process(str,SegMode.SEARCH).toString()
  7. println(jieba3)

在这里插入图片描述

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

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

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

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

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

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/564700
推荐阅读
相关标签
  

闽ICP备14008679号