赞
踩
File > Project Structure > Project Settings > Project > Project SDK
在复选框中选择项目使用的JDK,如果之前没有设置,点击旁边的new按钮从本地目录导入自己下载好的JDK。
Maven 仓库有三种类型:
IDEA 项目的Maven本地仓库也是在用户主目录/.m2/respository,不过.m2文件是隐藏的,如果想要看到隐藏文件,在文件查看器页面使用ctrl+h即可看到隐藏文件了。
在.m2/repository/org/apache/spark下就能找到我们引入的一系列org.apache.spark模块下的包。
在工程下创建的pom.xml文件中加入以下代码引入jieba-anaylsis依赖:
- # <dependencies>标签内加入:
- <dependency>
- <groupId>com.huaban</groupId>
- <artifactId>jieba-analysis</artifactId>
- <version>1.0.2</version>
- </dependency>
加入代码后Maven会自动帮你从中央仓库/远程仓库中拉取jar到本地仓库,使用时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需要用到的包
同样的,在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()函数将相对路径转换为绝对路径,不过这两个函数的区别在于:
详细解读可以参考: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是待分词的文本字符串
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:长词再切分,提高召回率。
(对这两个模式的解释翻遍全网,这个还算靠谱)
https://blog.csdn.net/LOG_IN_ME/article/details/103047796
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。