【问题标题】:Sentence annotation in text without punctuation没有标点符号的文本中的句子注释
【发布时间】:2015-01-06 21:18:10
【问题描述】:

我很难让 CoreNLP 系统在诗歌语料库中正确找到一个句子的结尾和另一个句子的开头。

苦苦挣扎的原因:

  • 有些诗在整个长度上都没有标点符号(有时甚至没有大小写)
  • 有些诗的句子从一段到另一段
  • 有些诗在每行开头都有大写

This is a particularly tricky one (系统认为第一句以第二节开头的“.”结尾)

鉴于缺少大写和标点符号,我想我会尝试使用 -tokenizeNLs 看看是否可以改善它,但它太过分了,并切断了任何介于两者之间的句子空行(有几个)

这些句子通常在行尾结束,但并非总是如此,所以如果系统可以将行尾视为潜在的断句候选者,并且可能权衡这些句子的可能性端点,但我不知道如何实现。

有没有一种优雅的方法来做到这一点?还是另一种选择?

提前致谢!

(预期句子输出here

【问题讨论】:

  • 您能否提供您在问题中所期望的输出? (那首诗的句子数组。)
  • 最后我们需要解析树的字符串(该项目是一个句法分析,查看嵌入子句等常见模式,以及出现换行符的位置)。但是,如果您只需要句子列表,那么您现在可以在我的问题底部找到它。
  • 这可能有用/有趣:ptk.jonathanchin.com

标签: java nlp stanford-nlp


【解决方案1】:

我构建了一个句子分割器,它也可以很好地处理不带标点或部分标点的文本。您可以在https://github.com/bedapudi6788/deepsegment 找到它。

该模型基于命名实体识别可用于句子边界(即:句子开头或句子结尾)的想法。我利用来自 tatoeba 的数据生成训练数据,并为此任务训练了一个带有手套嵌入和字符级别的 BiLSTM+CRF 模型。

虽然这是在 Python 中构建的,但您将能够使用 flask 设置一个简单的 rest api,并将其与您的 Java 代码一起使用。

【讨论】:

    【解决方案2】:

    这将是一个很好的项目!我认为目前我们小组中没有任何人正在研究它,但我认为如果你制作一个补丁,我们没有理由不整合它。我看到的最大挑战是我们的句子拆分器目前完全基于规则,因此这些“软”决策相对难以整合。

    对于您的情况,一个可能的解决方案是使用语言模型“句末”概率(三个选项,无特定顺序:https://kheafield.com/code/kenlm/https://code.google.com/p/berkeleylm/http://www.speech.sri.com/projects/srilm/)。然后,具有足够高的句子结尾概率的行结尾可以被拆分为新句子。

    【讨论】:

    • 看来分句规则只围绕标点,根本没有考虑pos或者它们的相互关系。
    【解决方案3】:

    我推荐 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2019-04-07
      • 1970-01-01
      相关资源
      最近更新 更多