我很难让CoreNLP系统正确地找到一个句子结束的位置而另一个句子从诗歌语料库中开始。
它挣扎的原因:
This is a particularly tricky one (系统认为第一句在第二节开头的“。”处结束)
鉴于缺少大写字母和标点符号,我认为我会尝试使用 -tokenizeNLs 来查看是否改进了它,但它过分了,并切断了任何一个空行(其中有几个)
这些句子通常在一行的结尾处结束,但并不总是如此,那么如果系统能够看到一条终结为句子中断的潜在候选者的行,并且可能会权衡这些句子的可能性端点,但我不知道如何实现它。
有优雅的方法吗?还是另类?
提前致谢!
(预期句子输出here)
答案 0 :(得分:2)
这将是一个整洁的项目!我现在不认为有人正在我们小组中工作,但我认为如果你制作补丁,我们没有理由不加入补丁。我看到的最大挑战是我们的句子分割器目前完全是基于规则的,因此这些类型的" soft"决定相对难以纳入。
您案件的可能解决方案可能是使用语言模型"句子结尾"概率(三个选项,无特定顺序:https://kheafield.com/code/kenlm/,https://code.google.com/p/berkeleylm/,http://www.speech.sri.com/projects/srilm/)。然后,具有足够高的句子结束概率的行结束可以被拆分为新句子。
答案 1 :(得分:0)
我构建了一个句子分割器,该句子分割器也可以很好地处理未标点符号或部分标点符号的文本。您可以在https://github.com/bedapudi6788/deepsegment上找到它。
该模型基于命名实体识别可用于句子边界(即:句子的开头或句子的结尾)的想法。我利用tatoeba的数据生成了训练数据,并为此训练了BiLSTM + CRF模型,该模型带有手套嵌入和字符级别。
尽管它是Python内置的,但您将能够使用flask设置一个简单的rest api,并将其与Java代码一起使用。
答案 2 :(得分:0)
我推荐 NNSPLIT 用于 NLP 任务,包括句子边界检测,因为它简单、快速且易于使用。您还可以在此 link 中查看以下情况的指标。
pip 安装 nnsplit
from nnsplit import NNSplit
splitter = NNSplit.load("en")
# returns `Split` objects
splits = splitter.split(["This is a test This is another test"])[0]
# a `Split` can be iterated over to yield smaller splits or stringified with `str(...)`.
for sentence in splits:
print(sentence)