Scala:搜狗自定义词库在jieba上的实现(Java也可)

搜狗细胞词库:https://pinyin.sogou.com/dict/

 其每个小分类例如【自然科学】下的【物理】都有一个“官方推荐”和若干词库。

下载其中一个词库后,得到的是scel格式文件,需要转换成txt才能使用,可使用在线转换工具批量转换:

https://www.toolnb.com/tools/scelto.html

本次我就下载了搜狗官方推荐的物理词库,转换后命名为phy.txt。

接下来进行载入词库操作:

首先需要Maven配置依赖、导入包:

# <dependencies>标签内加入:
        <dependency>
            <groupId>com.huaban</groupId>
            <artifactId>jieba-analysis</artifactId>
            <version>1.0.2</version>
        </dependency>
import java.nio.file.{Path, Paths}
import com.huaban.analysis.jieba.{JiebaSegmenter, WordDictionary}

然后main方法里:

val path = Paths.get("/home/maples/phy.txt")
WordDictionary.getInstance().loadUserDict(path)

(之前一直报空指针异常,是因为java版jieba加入自定义词库的文章博客寥寥无几,而且全部都一个写法(估计互相抄的):val path = Paths.get(new File(getClass.getClassLoader.getResource("/home/maples/phy.txt").getPath).getAbsolutePath)这样写我后来定睛一看其实就是想把相对路径转化为绝对路径,所以我直接在Paths.get()写绝对路径就解决了,或使用另一种方法转换为绝对路径(下有介绍)。)

完成。

然后再正常分词:

val jieba = new JiebaSegmenter()
val res:String = jieba.sentenceProcess(text).toString()

jieba分词如果不会可以参考我的另一篇博客:https://blog.csdn.net/LOG_IN_ME/article/details/102685005

【注意】

1、jieba新加入词库中的词需要添加词频并且频率比默认词库里的重复词词频高,jieba才会采用自定义词库的词。(我实际上测试的时候发现只要自定义词库词频设为1即可)

2、Paths.get()里面的路径必须是绝对路径,我们可以使用getCanonicalPath()函数或getAbsolutePath()函数将相对路径转换为绝对路径,不过这两个函数的区别在于:

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

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

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

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

3、对于自定义词典格式,需要txt格式,且jieba词库内容为每一行是一个词,后面跟词频和词性分别用空格隔开(词频和词性可以没有),搜狗词库就是只有词。

像这样:

阿贝不变量 2

阿贝成象原理 2 n

阿贝尔定理

阿贝尔范畴 1

阿贝尔函数域

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scala 使用 Jackson 进行 JSON 数据的反序列化操作时,可以使用 `mapper.readValue` 方法。如果需要反序列化的 JSON 数据包含自定义的 Java 类,可以通过在 Scala 使用 Java 类的方式来实现。 具体实现方法如下: 1. 定义 Java 类 首先,在 Scala 代码使用 `mapper.readValue` 方法前,需要先定义一个 Java 类来表示需要反序列化的 JSON 数据的对象。例如,下面的代码定义了一个 `Person` 类: ```java public class Person { private String name; private int age; // getters and setters } ``` 2. 使用 Scala 调用 Java 类 在 Scala ,可以通过 `JavaConverters` 工具类来将 Java 类转换成 Scala 类。例如,下面的代码将 `Person` 类转换成了 `PersonScala` 类: ```scala import scala.collection.JavaConverters._ case class PersonScala(name: String, age: Int) val json = """{"name": "Alice", "age": 30}""" val mapper = new ObjectMapper() val person = mapper.readValue(json, classOf[Person]).asScala val personScala = PersonScala(person.name, person.age) ``` 注意,在调用 `mapper.readValue` 方法时,需要将 `classOf[Person]` 作为第二个参数传入,以告诉 Jackson 需要将 JSON 数据转换成 `Person` 类。 3. 使用 Scala 类 现在,`PersonScala` 类就可以在 Scala 代码使用了。例如,下面的代码创建了一个 `PersonScala` 对象并打印出其属性: ```scala val personScala = PersonScala("Bob", 25) println(s"Name: ${personScala.name}, Age: ${personScala.age}") ``` 输出结果为: ``` Name: Bob, Age: 25 ``` 这样,就可以在 Scala 使用 Java 自定义类了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值