Press "Enter" to skip to content

停止词过滤原理及实现

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

指语言中一类没有多少意义的词语,比如 “的”
“甚至”
“不仅”
“吧”
……

 

一个句子去掉了停用词并不影响理解,停用词视具体的任务不同而不同。停用词过滤是一个常见的预处理过程

 

2.实现思路

加载中止词
:IO加载中止词( 中止词下载地址
,复制粘贴保存为txt文本)


:使用HanLP进行分词

停用词过滤
:从分词结果中去除中止词

3.加载中止词

 

这里最简单的做法是把中止词直接加入List中,但当词过多时,会浪费大量空间和查询时间,考虑到中文词大部分较短,这里使用 双数组字典树(DATrie)
构建,不熟悉双数组字典树的可以看 这里
,下面是构建代码:

 

/**
 *  @author: Ragty
 *  @Date: 2020/4/11 12:37
 *  @Description: 加载字典到DATrie
 */
public static DATrie loadStopword(String path) throws IOException {
    BufferedReader bufferedReader = new BufferedReader(new FileReader(stopWordsPath));
    List<String> stopWords = new ArrayList<String>();
    String temp = null;
    while ((temp = bufferedReader.readLine()) != null) {
        stopWords.add(temp.trim());
    }
    DATrie daTrie = new DATrie();
    daTrie.build(stopWords);
    return daTrie;
}

 

4.分词

 

这里分词我们使用 HanLP
进行分词,不熟悉的可参考 配置
,下面是分词代码:

 

/**
 *  @author: Ragty
 *  @Date: 2020/4/11 12:41
 *  @Description: HanLP分词
 */
private static List<Term> segment(String text) {
    List<Term> list = HanLP.segment(text);
    return list;
}

 

5.停止词过滤

 

这里直接从构建好的 DATrie
上查询,匹配到就停止词,就去掉,下面是实现代码:

 

/**
 *  @author: Ragty
 *  @Date: 2020/4/11 13:17
 *  @Description: 停用词过滤
 */
public static List<Term> removeStopWords(String text, DATrie daTrie) {
    List<Term> list = segment(text);
    ListIterator<Term> listIterator = list.listIterator();
    while(listIterator.hasNext()) {
        if (daTrie.containsKey(listIterator.next().word)) {
            listIterator.remove();
        }
    }
    return list;
}

 

6.测试用例

 

public static void main(String[] args) throws IOException {
    String text = "原来的路已经看不到了,只剩远方模糊的身影";
    DATrie daTrie = loadStopword(text);
    System.out.println("源文本:"+ text);
    System.out.println("分词结果:"+ segment(text));
    System.out.println("停用词过滤:" + removeStopWords(text,daTrie));
}

 

7.测试结果

 

源文本:原来的路已经看不到了,只剩远方模糊的身影
分词结果:[原来/d, 的/ude1, 路/n, 已经/d, 看不到/v, 了/ule, ,/w, /v, 远方/s, 模糊/a, 的/ude1, 身影/n]
停用词过滤:[路/n, ,/w, 模糊/a, 身影/n]

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注