首页 > 解决方案 > NLTK punkt 句子标记器在数字项目符号上拆分

问题描述

我正在使用 nltk PunktSentenceTokenizer 将段落分成句子。我有如下段落:

段落=“1.候选人数学很差。2.人际交往能力很好。3.对社会工作非常热心”

输出: ['1.', '应聘者数学很差', '2.', '人际交往能力很好', '3.', '对社会工作很热心']

我尝试使用下面的代码添加发送的启动器,但这甚至没有成功。

from nltk.tokenize.punkt import PunktSentenceTokenizer
tokenizer = PunktSentenceTokenizer()
tokenizer._params.sent_starters.add('1.')

如果有人能把我推向正确的方向,我真的很感激

提前致谢 :)

标签: pythonnlpnltk

解决方案


使用正则表达式可以为此类问题提供解决方案,如下面的代码所示:

paragraphs = "1. Candidate is very poor in mathematics. 2. Interpersonal skills are good. 3. Very enthusiastic about social work" 

import re
reSentenceEnd = re.compile("\.|$")
reAtLeastTwoLetters = re.compile("[a-zA-Z]{2}")

previousMatch = 0
sentenceStart = 0
end = len(paragraphs)
while(True):
    candidateSentenceEnd = reSentenceEnd.search(paragraphs, previousMatch)

    # A sentence must contain at least two consecutive letters:
    if reAtLeastTwoLetters.search(paragraphs[sentenceStart:candidateSentenceEnd.end()]) :
        print(paragraphs[sentenceStart:candidateSentenceEnd.end()])
        sentenceStart = candidateSentenceEnd.end()

    if candidateSentenceEnd.end() == end:
        break
    previousMatch=candidateSentenceEnd.start() + 1



输出是:

  1. 候选人的数学很差。
  2. 人际交往能力很好。
  3. 非常热衷于社会工作

包括(nltk 和 Spacy)在内的许多分词器都可以处理正则表达式。不过,将此代码适应他们的框架可能并非易事。


推荐阅读