[英]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 );
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.