簡體   English   中英

Java簡單句子解析器

[英]Java simple sentence parser

有沒有簡單的方法在普通Java中創建句子解析器而不添加任何lib和jar。

解析器不應該只關注單詞之間的空白,而應該更加智能和解析:。 ?,識別句子何時結束等

解析后,只有真正的單詞可以全部存儲在db或文件中,而不是任何特殊的字符。

非常感謝你提前:)

您可能希望從查看BreakIterator類開始。

來自JavaDoc。

BreakIterator類實現了在文本中查找邊界位置的方法。 BreakIterator的實例維護當前位置並掃描文本,返回出現邊界的字符索引。 在內部,BreakIterator使用CharacterIterator掃描文本,因此能夠掃描實現該協議的任何對象所持有的文本。 StringCharacterIterator用於掃描傳遞給setText的String對象。

您可以使用此類提供的工廠方法來創建各種類型的break迭代器的實例。 特別是,使用getWordIterator,getLineIterator,getSentenceIterator和getCharacterIterator來創建分別執行單詞,行,句子和字符邊界分析的BreakIterator。 單個BreakIterator只能在一個單元(單詞,行,句子等)上工作。 必須為要執行的每個單元邊界分析使用不同的迭代器。

行邊界分析確定換行時文本字符串可以斷開的位置。 該機制正確處理標點符號和帶連字符的單詞。

句子邊界分析允許選擇正確解釋數字和縮寫中的句點,以及跟蹤標點符號,如引號和括號。

字邊界分析由搜索和替換功能以及文本編輯應用程序使用,允許用戶通過雙擊選擇單詞。 單詞選擇可以正確解釋單詞內和單詞后面的標點符號。 不屬於單詞的字符(例如符號或標點符號)在兩側都有單詞分隔符。

字符邊界分析允許用戶按照他們期望的方式與字符交互,例如,當通過文本字符串移動光標時。 無論字符的存儲方式如何,字符邊界分析都能提供正確的字符串導航。 例如,重音字符可以存儲為基本字符和變音符號。 用戶認為角色的用語可能因語言而異。

BreakIterator僅適用於自然語言。 不要使用此類來標記編程語言。

請參閱演示BreakIteratorDemo.java

根據@Jarrod Roberson的回答 ,我創建了一個使用BreakIterator並返回句子列表的util方法。

public static List<String> tokenize(String text, String language, String country){
    List<String> sentences = new ArrayList<String>();
    Locale currentLocale = new Locale(language, country);
    BreakIterator sentenceIterator = BreakIterator.getSentenceInstance(currentLocale);      
    sentenceIterator.setText(text);
    int boundary = sentenceIterator.first();
    int lastBoundary = 0;
    while (boundary != BreakIterator.DONE) {
        boundary = sentenceIterator.next();         
        if(boundary != BreakIterator.DONE){
            sentences.add(text.substring(lastBoundary, boundary));
        }
        lastBoundary = boundary;            
    }
    return sentences;
}

只需使用正則表達式( \\s+ - 它將應用於一個或多個空格(空格,制表符等))將String拆分為數組。

然后你可以遍歷那個數組並檢查單詞是否結束.?! String.endsWith()查找句子的結尾。

在保存任何單詞之前,再次使用正則表達式刪除每個非字母數字字符。

當然,使用StringTokenizer

import java.util.StringTokenizer;

public class Token {
    public static void main(String[] args) {

        String sentence = "Java! simple ?sentence parser.";
        String separator = "!?.";

        StringTokenizer st = new StringTokenizer( sentence, separator, true );

        while ( st.hasMoreTokens() ) {
            String token = st.nextToken();
            if ( token.length() == 1 && separator.indexOf( token.charAt( 0 ) ) >= 0 ) {
                System.out.println( "special char:" + token );
            }
            else {
                System.out.println( "word :" + token );
            }

        }
    }
}

字符串標記符

掃描器

防爆。

StringTokenizer tokenizer = new StringTokenizer(input, " !?.");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM