You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

NLTK工具sent_tokenize处理《哈姆雷特》文本仅返回单个列表元素的问题求助

解决NLTK sent_tokenize将《哈姆雷特》文本识别为单个句子的问题

嘿,这个问题我之前帮同学处理过,核心原因特别明确:你的文本里完全没有标准的句子边界标点(句号、问号、感叹号这类)

看你贴的示例文本,所有对话连在一起,既没有给每个句子收尾的标点,台词内部的句子也没有任何分隔——sent_tokenize本质是靠这些标点和训练好的规则来判断句子结束的,它没法凭空猜出哪里是句子边界,自然会把整段文本当成一个大句子返回。

给你一套实用的解决方案,分步骤来:

步骤1:先给文本补充必要的标点

我们需要先预处理文本,补上句子结尾的标点,同时拆分台词内部的句子。这里针对你给出的对话格式(开头是大写角色名,后面是台词),写了一段预处理代码:

import nltk
import re

# 先下载punkt分词模型(第一次运行需要)
nltk.download('punkt')

# 你的原始哈姆雷特文本片段
hamlet_raw = """FRANCISCO For this relief much thanks tis bitter cold And I am sick at heart
BERNARDO Have you had quiet guard
FRANCISCO Not a mouse stirring
BERNARDO Well good night If you do meet Horatio and Marcellus The rivals of my watch bid them make haste
FRANCISCO I think I hear them Stand ho Who s there"""

# 1. 按行拆分每一段对话
dialogue_lines = hamlet_raw.split('\n')
processed_text = []

for line in dialogue_lines:
    line = line.strip()
    if not line:
        continue
    
    # 拆分角色名和台词(假设角色名是开头的大写单词)
    speaker, line_content = line.split(' ', 1)
    
    # 2. 给台词结尾加标点:判断是否是问句
    if line_content.strip().startswith(('Have you', 'Who', 'What')):
        line_content = line_content.strip() + '?'
    else:
        line_content = line_content.strip() + '.'
    
    # 3. 拆分台词内部的句子:在大写单词前(非开头)加句号+空格
    # 比如"And I am sick at heart"会被处理成". And I am sick at heart"
    line_content = re.sub(r'(?<=[a-z]) ([A-Z])', r'. \1', line_content)
    
    # 把处理后的对话加回列表
    processed_text.append(f"{speaker} {line_content}")

# 合并成完整的预处理文本
hamlet_processed = ' '.join(processed_text)

# 现在用sent_tokenize处理
sentence_tokens = nltk.sent_tokenize(hamlet_processed)

# 输出结果
print(f"识别到的句子数量:{len(sentence_tokens)}")
print("\n分割后的句子列表:")
for idx, sent in enumerate(sentence_tokens, 1):
    print(f"{idx}. {sent}")

代码效果说明

运行这段代码后,你会得到正确分割的句子:

  • 原台词"For this relief much thanks tis bitter cold And I am sick at heart"会被拆成两个句子:FRANCISCO For this relief much thanks tis bitter cold.And I am sick at heart.
  • 问句"Have you had quiet guard"会被加上问号,被识别为单独的句子

针对完整《哈姆雷特》文本的优化建议

如果是整部戏剧的文本,你可能需要:

  • 先清理掉页眉、页脚、场景说明等无关内容
  • 更精准地识别对话的角色和台词边界
  • 可以用更复杂的规则(比如训练一个简单的标点预测模型)来补充标点,但对于课程项目来说,上面的规则已经足够用了

内容的提问来源于stack exchange,提问作者Guilherme Lucena

火山引擎 最新活动