所以,我发现并且目前正在使用Stanford Parser,它可以很好地分割句子。我们的大多数句子来自AP,因此它可以很好地完成这项任务。
以下是问题:
为此,我已经编写了多个补丁来补偿我真正不应该做的事情。
基本上,它一直被用作开始分裂句子的问题。
我的其他选择是什么?任何其他NLP类型的框架可能会有所帮助吗?
我最初的问题是能够以高概率检测句子边缘。
答案 0 :(得分:5)
如果您想尝试坚持使用Stanford Tokenizer / Parser,请查看documentation page for the tokenizer。
如果您只想分割句子,则不需要正确调用解析器,因此您应该能够通过直接使用DocumentPreprocessor来获取少量内存(一兆字节或两兆字节)。
虽然可用的标记器自定义有限,但可以更改引号处理。您可能想尝试以下之一:
unicodeQuotes=false,latexQuotes=false,asciiQuotes=false
unicodeQuotes=true
第一个将意味着没有任何类型的引用映射,第二个将根据其最佳能力将单引号或双引号ascii引号(如果有)更改为左引号和右引号。
虽然tokenizer以各种方式分割单词以匹配Penn Treebank约定,但您应该能够从返回的标记中精确构造原始文本(请参阅CoreLabel中的各种其他字段)。否则这是一个错误。
答案 1 :(得分:1)
有很多可用的句子分割器,性能将取决于您的具体应用程序。
开始使用Perl和Python版本非常容易。斯坦福分析器版本我过去发现很麻烦;我最终使用了特定领域的分割器(Genia)。我还运行了一个基于正则表达式的清理工具来查找错误分割的句子并重新组装它们。
答案 2 :(得分:1)
你有一种方法可以使用斯坦福NLP从一个文本中分割句子而不用任何字符替换为奇怪的字符(例如括号或撇号):
PTBTokenizer ptbt = new PTBTokenizer(
new StringReader(text), new CoreLabelTokenFactory(), "ptb3Escaping=false");
List<List<CoreLabel>> sents = (new WordToSentenceProcessor()).process(ptbt.tokenize());
Vector<String> sentences = new Vector<String>();
for (List<CoreLabel> sent : sents) {
StringBuilder sb = new StringBuilder("");
for (CoreLabel w : sent) sb.append(w + " ");
sentences.add(sb.toString());
}
}
使用DocumentPreprocessor的标准方法会使原始文本失效。
答案 3 :(得分:0)
您可以使用NLTK(尤其是nltk.tokenize
包):
import nltk
sentence_detector = nltk.data.load('tokenizers/punkt/english.pickle')
text = "This is a test. Let's try this sentence boundary detector."
text_output = sentence_detector.tokenize(text)
print('text_output: {0}'.format(text_output))
输出:
text_output: ['This is a test.', "Let's try this sentence boundary detector."]