如何将文本解析成句子

时间:2010-12-07 05:13:18

标签: java text-parsing

我正试图将一个段落分解成句子。到目前为止,这是我的代码:

import java.util.*;

public class StringSplit {
 public static void main(String args[]) throws Exception{
     String testString = "The outcome of the negotiations is vital, because the current tax levels signed into law by President George W. Bush expire on Dec. 31. Unless Congress acts, tax rates on virtually all Americans who pay income taxes will rise on Jan. 1. That could affect economic growth and even holiday sales.";
     String[] sentences = testString.split("[\\.\\!\\?]");
     for (int i=0;i<sentences.length;i++){  
         System.out.println(i);
      System.out.println(sentences[i]);  
     }  
 }
}

发现了两个问题:

  1. 代码在句点(“。”)符号的任何时候分割,即使它实际上是一个句子。我该如何阻止这种情况?
  2. 每个分割的句子都以空格开头。如何删除冗余空间?

7 个答案:

答案 0 :(得分:14)

您提到的问题是NLP(自然语言处理)问题。编写原始规则引擎很好,但它可能无法扩展以支持完整的英文文本。

要获得更深入的见解和java库,请查看此链接http://nlp.stanford.edu/software/lex-parser.shtmlhttp://nlp.stanford.edu:8080/parser/index.jsp以及ruby语言How do you parse a paragraph of text into sentences? (perferrably in Ruby)的类似问题

例如: 文字 -

  

谈判的结果是   至关重要,因为目前的税收水平   乔治·W总统签署成为法律   布什将于12月31日到期   国会采取行动,虚拟税率   所有缴纳所得税的美国人   将在1月1日上升。这可能会影响   经济增长甚至假期   销售。

标记后

变为:

  

/ DT的/ DT结果/ / IN   谈判/ NNS是/ VBZ vital / JJ,/,   因为/ IN / DT当前/ JJ税/ NN   级别/ NNS签署/ VBN进/ IN法/ NN   / IN总统/ NNP George / NNP W./NNP   布什/ NNP到期/ VBP on / RP Dec./NNP   31 / CD ./。除非/ IN国会/ NNP   行为/ VBZ,/,税/ NN费率/ NNS on / IN   虚拟/ RB全部/ RB美国人/ NNPS   谁/ WP支付/ VBP收入/ NN税/ NNS   将/ MD上升/ VB上/ IN 1月/ NNP 1 / CD   ./。 / DT可以/ MD影响/ VB   经济/ JJ增长/ NN和/ CC均/ RB   假日/ NN销售/ NNS ./。解析

检查它如何区分句号(。)和12月31日之后的句号......

答案 1 :(得分:2)

第一个问题是要做得很好,因为你必须实施句子检测。我建议你不要这样做,只需在标点符号后用两个空行分隔句子。例如:

"The outcome of the negotiations is vital, because the current tax levels signed into law by President George W. Bush expire on Dec. 31.  Unless Congress acts, tax rates on virtually all Americans who pay income taxes will rise on Jan. 1.  That could affect economic growth and even holiday sales."

第二个可以使用String.trim()来解决。

示例:

String one = "   and now...    ";
String two = one.trim();
System.out.println(two);          // output: "and now..."

答案 2 :(得分:2)

您可以尝试使用java.text.BreakIterator类来解析句子。例如:

BreakIterator border = BreakIterator.getSentenceInstance(Locale.US);
border.setText(text);
int start = border.first();
//iterate, creating sentences out of all the Strings between the given boundaries
for (int end = border.next(); end != BreakIterator.DONE; start = end, end = border.next()) {
    System.out.println(text.substring(start,end));
}

答案 3 :(得分:0)

Trim它......

答案 4 :(得分:0)

鉴于目前的输入格式,很难分成句子。除了句点之外,您还必须施加一些规则附加规则来识别句子的结尾。例如,这条规则可能是“句子应以句号(。)和两个空格结尾”。 (这是UNIX工具grep识别句子的方式。

答案 5 :(得分:0)

您可以使用此开源库here提供的类SentenceSplitter

SentenceSplitter sp = new SentenceSplitter("filename");
String str = null;
while((str = sp.next().toString()) != null)
{
    //Your code here.
}

答案 6 :(得分:-1)

首先修剪()你的字符串......并使用此链接

http://www.java-examples.com/java-string-split-example&amp; http://www.rgagnon.com/javadetails/java-0438.html

你也可以使用StringBuffer Class ...只需使用这个链接我希望它能帮到你