什么是word分词?
word分词是一个Java实现的分布式的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。能通过自定义配置文件来改变组件行为,能自定义用户词库、自动检测词库变化、支持大规模分布式环境,能灵活指定多种分词算法,能使用refine功能灵活控制分词结果,还能使用词频统计、词性标注、同义标注、反义标注、拼音标注等功能。提供了10种分词算法,还提供了10种文本相似度算法,同时还无缝和Lucene、Solr、ElasticSearch、Luke集成。注意:word1.3需要JDK1.8
Github地址
依赖
<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上看文档,国人的作品,中文文档~
测试
@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);
}
}
即可。
爬虫结果
代码下载
本文由 SAn 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2018/07/13 15:21