3

所以,我发现并且目前正在使用斯坦福解析器,它非常适合分割句子。我们的大部分句子都来自 AP,因此它非常适合该任务。

以下是问题:

  • 它消耗大量内存(600M 很多)
  • 它真的搞砸了正文的格式,我必须在以后制作很多边缘案例。(文档预处理器 API 调用不允许指定 ascii/utf8 引号——它们立即转到乳胶样式,缩略词(显然)被分成不同的单词,并且虚假的空格被放在不同的地方)

为此,我已经编写了多个补丁来弥补我真正不应该做的事情。

基本上它的使用与拆分句子的问题一样大。

我还有哪些其他选择?任何其他 NLP 类型的框架可能会有所帮助?

我最初的问题是能够以很高的概率检测句子边缘。

4

4 回答 4

5

如果您想尝试使用 Stanford Tokenizer/Parser,请查看tokenizer 的文档页面

如果您只想拆分句子,则不需要正确调用解析器,因此您应该能够通过直接使用 DocumentPreprocessor 来摆脱少量内存(一兆字节或两兆字节)。

虽然只有有限的标记器自定义可用,但您可以更改报价的处理。您可能想尝试以下之一:

unicodeQuotes=false,latexQuotes=false,asciiQuotes=false
unicodeQuotes=true

第一个将意味着没有任何类型的引号映射,第二个将根据其能力将单引号或双引号(如果有)更改为左右引号。

虽然标记器以各种方式拆分单词以匹配 Penn Treebank 约定,但您应该能够从返回的标记中精确构造原始文本(请参阅 CoreLabel 中的各种其他字段)。否则就是一个bug。

于 2011-09-21T23:41:14.010 回答
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 的标准方式会破坏您的原始文本。

于 2013-11-29T23:15:23.173 回答
1

有很多可用的句子拆分器,性能将取决于您的特定应用程序。

PerlPython版本很容易上手。过去我觉得很麻烦的斯坦福解析器版本;我最终使用了特定于域的拆分器(Genia)。我还运行了一个基于正则表达式的清理工具来查找严重拆分的句子并重新组装它们。

于 2011-09-21T22:05:40.720 回答
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."]
于 2016-07-25T17:03:59.877 回答