Java分布式中文分词组件 - word分词

/ 技术 / 无站内评论 / 493浏览

什么是word分词?

word分词是一个Java实现的分布式的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。能通过自定义配置文件来改变组件行为,能自定义用户词库、自动检测词库变化、支持大规模分布式环境,能灵活指定多种分词算法,能使用refine功能灵活控制分词结果,还能使用词频统计、词性标注、同义标注、反义标注、拼音标注等功能。提供了10种分词算法,还提供了10种文本相似度算法,同时还无缝和Lucene、Solr、ElasticSearch、Luke集成。注意:word1.3需要JDK1.8

Github地址

https://github.com/ysc/word

依赖

<dependency>
<groupId>org.apdplat</groupId>
<artifactId>word</artifactId>
<version>1.3</version>
</dependency>

PS:下载请耐心等待~ jar包在24.5M左右


快速上门

注意~首次分词加载的配置文件有点久~大概在一分钟左右。。。

 对文本进行分词

移除停用词:
List<Word> words = WordSegmenter.seg("杨尚川是APDPlat应用级产品开发平台的作者");
保留停用词: List<Word> words = WordSegmenter.segWithStopWords("杨尚川是APDPlat应用级产品开发平台的作者"); 输出: 移除停用词:[杨尚川, apdplat, 应用级, 产品, 开发平台, 作者] 保留停用词:[杨尚川, 是, apdplat, 应用级, 产品, 开发平台, 的, 作者]

对文件进行分词

String input = "d:/text.txt";
String output = "d:/word.txt";
移除停用词:
WordSegmenter.seg(new File(input), new File(output));
保留停用词:
WordSegmenter.segWithStopWords(new File(input), new File(output));

显式指定分词算法

对文本进行分词时,可显式指定特定的分词算法,如:
WordSegmenter.seg("APDPlat应用级产品开发平台", SegmentationAlgorithm.BidirectionalMaximumMatching);

SegmentationAlgorithm的可选类型为: 正向最大匹配算法:MaximumMatching 逆向最大匹配算法:ReverseMaximumMatching 正向最小匹配算法:MinimumMatching 逆向最小匹配算法:ReverseMinimumMatching 双向最大匹配算法:BidirectionalMaximumMatching 双向最小匹配算法:BidirectionalMinimumMatching 双向最大最小匹配算法:BidirectionalMaximumMinimumMatching 全切分算法:FullSegmentation 最少词数算法:MinimalWordCount 最大Ngram分值算法:MaxNgramScore

以上基本够我们日常使用了,如果想了解更多到Github上看文档,国人的作品,中文文档~

https://github.com/ysc/word

测试

@RestController
public class WordController {


@GetMapping("/word")
public String word(@RequestParam String str){
return String.valueOf(WordSegmenter.seg(str));
}
}

结果

效果还是挺不错的~


整合Gecco爬虫

我们在爬虫的时候有个场景,比如说输入的字段是一句话,这句话中可能存在多个关键字,如果我们把整句话去爬取,可能搜索不到结果,因此我们爬取前需要对整句话进行分词;把分词结果再进行爬虫~


主代码

List<Word> words = WordSegmenter.segWithStopWords("Java多线程");
//分词结果List
for (Word w : words) {
System.out.println(w.getText());
//我们先访问搜索接口,得到搜索结果,第二个参数:是否对URL编码,默认false。(如果URL中带中文,否则可能搜索不到数据)
String body = HttpRequest.get("https://sanii.cn/search/" + w.getText(),true, "UTF-8")).body();
//解析结果页面
Document document = Jsoup.parse(body);
Elements elementsByClass = document.getElementsByClass("item-title");
//遍历每个文章的URL,进行爬取
for (Element e : elementsByClass) {
Elements select = e.select("div > a");
String href = select.attr("href");
GeccoEngine.create()
//工程的包路径
.classpath("me.liao.gecco.liaowo")
//开始抓取的页面地址
.start(href)
.run();
}
}

http-request

在此推荐一个简单易用的HTTPClient类库,真的比原生的HTTPClient太简介!!!强烈推荐!!!

依赖

<dependency>
<groupId>com.github.kevinsawicki</groupId>
<artifactId>http-request</artifactId>
<version>5.6</version>
</dependency>

Github地址

https://github.com/kevinsawicki/http-request

中文入门手册

https://juejin.im/entry/596dd24af265da6c3559cc6d


解决业务中Word分词加载过慢

通过实现ApplicationContextInitializer接口,在SpringBoot启动时初始化Word分词

public class WordInit implements ApplicationContextInitializer {


@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
List<Word> seg = WordSegmenter.seg("启动成功");
System.out.println("分词启动-" + seg);
}
}

即可。


爬虫结果

代码下载

点我下载


召唤蕾姆
琼ICP备18000156号

鄂公网安备 42011502000211号