1. jieba中文处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1. jieba中文处理相关的知识,希望对你有一定的参考价值。
参考技术A jieba是一个在中文自然语言处理中用的最多的工具包之一,它以分词起家,目前已经能够实现包括分词、词性标注以及命名实体识别等多种功能。既然Jieba是以分词起家,我们自然要首先学习Jieba的中文分词功能。Jieba提供了三种分词模式:在jieba分词中,最常用的分词函数有两个,分别是 cut 和 cut_for_search ,分别对应于“精确模式/全模式”和“搜索引擎模式”。
当然,两者的输入参数也不一样,cut函数的输入主要有三个,分别是:
cut_for_search 函数主要有两个参数:
需要注意的是, cut 和 cut_for_search 返回的都是generator,如果想直接返回列表,需要使用 lcut 和 lcut_for_search
如果在一些特定场景中,需要使用一些特殊词汇进行分词,就需要加载自定义的分词词典:
其中,用户字典的格式为:
每一行表示一个单词,每行最多由三部分组成
如果只是少量词汇,可以使用
需要注意的是,如果没有给出词频和词性信息,在后续的处理中可能会造成一定的影响。
jieba提供了两种关键词提取算法,分别是TF-IDF以及TextRank
关于TF-IDF的原理,可以参考吴军老师的《数学之美》,里面给出了很详细的说明。本文只介绍利用TF-IDF算法提取关键词。
其中:
TextRank的用法与extract_tags的函数定义完全一致
词性标注主要是在分词的基础上,对词的词性进行判别,在jieba中可以使用如下方式进行:
在jieba中采用将目标文档按行分割,对每一行采用一个Python进程进行分词处理,然后将结果归并到一起(有点类似于MapReduce)。据说目前尚不支持Windows,仅支持Linux和MacOS。
启动并行分词使用如下命令:
关闭并行分词使用如下命令:
使用tokenize函数后,会获得一个词语信息的元组,元组中的第一个元素是分词得到的结果,第二个元素是词的起始位置,第三个元素是词的终止位置。
除了本文介绍的jieba分词工具包以外,还有很多好用的中文分词工具,比如
通过filter过滤器进行中文处理
一、使用servlet处理的局限性
可以通过:
request.setCharacterEncoding("UTF-8");
正确获取UTF-8编码的中文,但是如果有很多servlet都需要获取中文,那么就必须在每个Servlet中增加这段代码。
有一个简便的办法,那就是通过Filter过滤器进行中文处理 ,那么所有的Servlet都不需要单独处理了。
二、使用Filter处理
创建一个EncodingFilter,设置如下代码:
1 package filter; 2 3 import java.io.IOException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 import javax.servlet.Filter; 8 import javax.servlet.FilterChain; 9 import javax.servlet.FilterConfig; 10 import javax.servlet.ServletException; 11 import javax.servlet.ServletRequest; 12 import javax.servlet.ServletResponse; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 16 public class EncodingFilter implements Filter { 17 18 @Override 19 public void destroy() { 20 21 } 22 23 @Override 24 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 25 throws IOException, ServletException { 26 HttpServletRequest request = (HttpServletRequest) req; 27 HttpServletResponse response = (HttpServletResponse) res; 28 29 request.setCharacterEncoding("UTF-8"); 30 31 chain.doFilter(request, response); 32 } 33 34 @Override 35 public void init(FilterConfig arg0) throws ServletException { 36 37 } 38 39 }
doFilter方法的第一个参数req,是ServletRequest 类型的,不支持setCharacterEncoding,所以要先强制转换为HttpServletRequest
三、配置web.xml
1 <filter> 2 <filter-name>EncodingFilter</filter-name> 3 <filter-class>filter.EncodingFilter</filter-class> 4 </filter> 5 6 <filter-mapping> 7 <filter-name>EncodingFilter</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping>
在SpringMVC中,web.xml配置与上面类似:
1 <filter> 2 <filter-name>CharacterEncodingFilter</filter-name> 3 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name> 6 <param-value>utf-8</param-value> 7 </init-param> 8 </filter> 9 <filter-mapping> 10 <filter-name>CharacterEncodingFilter</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping>
以上是关于1. jieba中文处理的主要内容,如果未能解决你的问题,请参考以下文章