<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          中文分詞-詞典逆向最大匹配法-JAVA實(shí)現(xiàn)

          共 4484字,需瀏覽 9分鐘

           ·

          2021-04-14 17:20

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          76套java從入門到精通實(shí)戰(zhàn)課程分享

          測(cè)試環(huán)境

          windows 10

          IDEA 2020.1

          JDK 1.8



          算法描述

          1、 首先讀取詞庫(kù),每個(gè)詞用哈希表存儲(chǔ),查找效率高


          2、 讀取待分詞句子input, 設(shè)置最大匹配長(zhǎng)度 MAX


          3、 input的長(zhǎng)度是否大于0,如果是接著下一步,否則第8步


          4、 input長(zhǎng)度是否大于 MAX, 如果是,設(shè)置嘗試匹配詞語(yǔ)token = input后MAX個(gè)字符, 否則 token = input


          5、 是否有:token的長(zhǎng)度大于1并且token并未出現(xiàn)在詞庫(kù)中?是的話接著下一步,否則轉(zhuǎn)至第7步


          6、 token去掉最左的第一個(gè)字符作為新token, 轉(zhuǎn)去第5步


          7、 分詞結(jié)果棧rs保存token,input去除token的部分作為新input,轉(zhuǎn)至第3步


          8、 輸出分詞結(jié)果rs,程序結(jié)束



          流程圖


          源程序-JAVA實(shí)現(xiàn)

          Words.java 負(fù)責(zé)讀取詞庫(kù)文件并判斷token是否存在詞庫(kù)中

          package org.example;

          import java.io.*;
          import java.nio.charset.StandardCharsets;
          import java.util.HashSet;

          public class Words {
           private HashSet<String> hashSet = new HashSet<>();

           public void loadWordsData(String fileName) throws IOException {
            BufferedReader br = null;
            InputStreamReader isr = null;
            FileInputStream fis = null;
            File file = new File(fileName);
            fis = new FileInputStream(file);
            isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
            br = new BufferedReader(isr);

            /*讀取每一行內(nèi)容即一個(gè)詞,保存在哈希表中*/
            String line = null;
            while ((line = br.readLine()) != null) {
             hashSet.add(line.replace(" """));
            }
           }


           /*詞庫(kù)中是否存在word*/
           public boolean contains(String word) {
            return hashSet.contains(word);
           }
          }


          App.java 算法主流程

          package org.example;

          import java.io.IOException;
          import java.util.ArrayDeque;
          import java.util.Deque;

          /**
           * @author: Mr.Hu
           * @create: 2021-04-07 15:52
           */
          public class App {

            public static void main(String[] args) throws IOException {
              Words words = new Words();
              words.loadWordsData("data.txt");
              Deque<String> rs = new ArrayDeque<>();
              String input = "普京跟特朗普在明天下雨之前學(xué)會(huì)加減乘除,吃完飯沒時(shí)間睡覺,睡覺后去上大學(xué)";
              String analysis = null; // 每次匹配的字符串
              int head = 0; // head~tail-1為分詞字符串
              int tail = input.length(); // 余下的字符長(zhǎng)度
              final int max_length = 4; // 最大匹配長(zhǎng)度
              while (tail > 0) {
                // 先嘗試取最大匹配長(zhǎng)度
                if (tail > max_length) head = tail - max_length;
                else head = 0; // 余下全部
                analysis = input.substring(head, tail); // 截取
                /*直到截取字符串只有一個(gè)字符或者字符串存在于詞庫(kù)中*/
                while (analysis.length() > 1 && !words.contains(analysis)) {
                  analysis = analysis.substring(1); // 去除最左字符,即嘗試匹配少一位
                  head++; // 下標(biāo)往后
                }
                rs.push(analysis); // 棧中
                tail = head; // 下一個(gè)截取字符串的尾巴是這次的頭
              }

              for (String item : rs) {
                System.out.print(item + " / "); // 詞庫(kù)中的詞沒有單字的
              }
              System.out.println();
            }
          }


          data.txt 詞庫(kù)文件

          普京
          大學(xué)
          天氣
          睡覺
          下雨
          吃飯
          時(shí)間
          特朗普
          加減乘除
          明天
          之前


          運(yùn)行結(jié)果

          普京 / 跟 / 特朗普 / 在 / 明天 / 下雨 / 之前 / 學(xué) / 會(huì) / 加減乘除 / , / 吃 / 完 / 飯 / 沒 / 時(shí)間 / 睡覺 / , / 睡覺 / 后 / 去 / 上 / 大學(xué) /



          寫在最后

          分詞算法還有很多,我這個(gè)算是比較機(jī)械、簡(jiǎn)單的了,可以自行去了解


          Github開源詞庫(kù):https://github.com/fighting41love/funNLP

          ————————————————

          版權(quán)聲明:本文為CSDN博主「優(yōu)雅的發(fā)際線」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

          原文鏈接:

          https://blog.csdn.net/HLL1234567/article/details/115515730





          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒


          感謝點(diǎn)贊支持下哈 

          瀏覽 88
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三区免费在线播放 | 国产小视频在线播放 | 久草电影男人天堂 | 国产精品高清无码在线播放 | 亚洲视频在线观看自 |