IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 结巴(jieba)分词 java 实现 -> 正文阅读

[Java知识库]结巴(jieba)分词 java 实现

前言

最近因为需要学习新闻推荐相关的知识,所以学习分词相关的知识

1引入 pom 依赖

<dependency>
   	<groupId>com.huaban</groupId>
    <artifactId>jieba-analysis</artifactId>
     <version>1.0.2</version>
 </dependency>

普通分词实现代码

import com.huaban.analysis.jieba.JiebaSegmenter;
import data.recomend.util.TextDealutil;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

public class SplitWord {

    private static String basePath = "C:\\project\\idea4\\dataRecommend\\src\\main\\resources\\data\\";
    public static void main(String[] args) throws IOException {
        String content = "《开端》《镜双城》《淘金》三部热播剧均有她,你发现了吗?";
        content = TextDealutil.specialCharacters(content);
        List<String> stop_words = FileUtils.readLines(new File(basePath + "files\\stop_words.txt"));
        JiebaSegmenter segmenter = new JiebaSegmenter();
        List<String> result = segmenter.sentenceProcess(content);
        System.out.println("没有过滤停用词======" + result);
        result = result.stream().map(o -> o.trim()).filter(o -> !stop_words.contains(o)).collect(Collectors.toList());
        System.out.println("过滤停用词=========" + result);
    }
}

结果展示:
在这里插入图片描述
stop_words.txt 停用词类似于一些符号,或者语气词之类的,通过以上的测试结果可以看出来

!
"
#
$
%
&
'
(
)
*
+

TextDealutil,自定义的去除文本的特殊字符,可以不需要这个类,或者自己重写对特殊字符进行替换也行

2 加载自定义词典

2.1 情况

对于某些分词,应该是分成一个词,但是分出来确实多个词的情况,比如说
在这里插入图片描述
比如一些专业名词,还有一些人名之类的,“周冬雨”,我们希望分词之后的是“周冬雨”,而不是“周”、“冬雨”这样的。

其实结巴分词默认的是时候,会加载包下的一个默认dict.txt
在这里插入图片描述

每一个关键词一行,每一列分别表示:关键字,词频,词性,用空格分隔开的

所以我们在自定义词典的时候,也需要按照这个格式,然后加载到环境中

2.2自定义 词典 dict.txt

周冬雨 3 n
郭艾伦 3 n
张雨霏 3 nr
林郑月 3 nr

2.3 加载自定义词典

也就是通过 WordDictionary加载自定义的词典

		// 加载自定义的词典
        Path path = FileSystems.getDefault().getPath(basePath+"/files", "dict.txt");
        WordDictionary.getInstance().loadUserDict(path);
        JiebaSegmenter jiebaSegmenter = new JiebaSegmenter();
        List<String> strings = jiebaSegmenter.sentenceProcess("周杰伦周冬雨");
        strings.stream().forEach(System.out::println);

结果

main dict load finished, time elapsed 578 ms
user dict C:\project\idea4\dataRecommend\src\main\resources\data\files\dict.txt load finished, tot words:4, time elapsed:0ms
model load finished, time elapsed 43 ms.
周杰伦
周冬雨

打印的结果包含加载项目路劲下自定义的词典和解析结果

3关于词性的问题

3.1 python 中关于词性的使用方式

jieba.analyse.extract_tags(
                    self.content,
                    topK=10,
                    withWeight=False,
                    allowPOS=('ns', 'n', 'vn', 'v')
                )
     ##   以下为注释
    Extract keywords from sentence using TF-IDF algorithm.
    Parameter:
        - topK: return how many top keywords. `None` for all possible words.
        - withWeight: if True, return a list of (word, weight);
                      if False, return a list of words.
        - allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v','nr'].
                    if the POS of w is not in this list,it will be filtered.
        - withFlag: only work with allowPOS is not empty.
                    if True, return a list of pair(word, weight) like posseg.cut
                    if False, return a list of words

其中 allowPOS,表示分词结果之后,保留什么词性的分词,
topK表示根据排序之后的结果,取前 TopK个结果

        if allowPOS:
            allowPOS = frozenset(allowPOS)
            words = self.postokenizer.cut(sentence)
        else:
            words = self.tokenizer.cut(sentence)
        freq = {}
        for w in words:
        	## 获取指定词性的分词结果
            if allowPOS:
                if w.flag not in allowPOS:
                    continue
                elif not withFlag:
                    w = w.word
            wc = w.word if allowPOS and withFlag else w
            ## 停用词过滤的地方
            if len(wc.strip()) < 2 or wc.lower() in self.stop_words:
                continue
            freq[w] = freq.get(w, 0.0) + 1.0
        total = sum(freq.values())
        for k in freq:
            kw = k.word if allowPOS and withFlag else k
            freq[k] *= self.idf_freq.get(kw, self.median_idf) / total
		# 排序
        if withWeight:
            tags = sorted(freq.items(), key=itemgetter(1), reverse=True)
        else:
            tags = sorted(freq, key=freq.__getitem__, reverse=True)
         # 取排序好的TopK个结果
        if topK:
            return tags[:topK]
        else:
            return tags

3.2 java 中当前版本不支持词性

huaban 的 github 地址中

https://github.com/huaban/jieba-analysis

有关于介绍,也就是说当前这个版本没有不支持词性分词
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 17:56:45  更:2022-06-25 18:01:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:33:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码