You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python解析含对话与描述的文本并分离为两个独立字符串?

批量提取文本中的对话与场景描述(Python实现)

嘿,我懂你现在需要批量处理一堆混合了对话和场景描述的文本,把人物说的话提取成字符串x,把所有场景相关的内容提取成y。结合你给的示例文本,我整理了一个实用的Python解决方案,应该能帮你搞定!

先理清楚文本结构

从你的例子来看,场景描述分两类:

  • 被**中文全角括号()**包裹的动作/状态细节,比如(快速装上最后几颗子弹)
  • 纯叙述性的场景内容,比如出租车在大型立交桥的最高层高速公路路肩上急刹停下。多平德停下计价器,递给死侍他的名片。
    而对话就是人物直接说的内容,比如没时间。就今天不行。十、十一、十二…不成功便成仁。就在这儿!

实现思路

我用正则表达式来处理括号内容,再通过简单的规则区分对话和场景叙述,步骤如下:

  1. 先把所有括号里的场景内容提取出来,同时把原文本里的括号内容删掉
  2. 把剩下的文本按中文标点分句,方便逐个判断是对话还是场景
  3. 用自定义规则区分对话和场景叙述(比如带感叹号/问号、数字计数的句子大概率是对话)
  4. 把所有对话合并成x,所有场景内容(括号里的+场景叙述)合并成y
  5. 写个批量处理函数,搞定文件里的所有文本实例

完整代码示例

import re
from typing import Tuple

def extract_dialogue_and_scene(text: str) -> Tuple[str, str]:
    # 提取所有中文括号内的场景内容,兼容换行
    bracket_pattern = re.compile(r'((.*?))', re.DOTALL)
    scene_from_brackets = bracket_pattern.findall(text)
    # 移除原文本中的括号内容,得到干净的纯文本
    clean_text = bracket_pattern.sub('', text).strip()
    
    # 按中文句号、感叹号、问号分割句子,保证每个句子完整
    sentence_splitter = re.compile(r'([。!?]+)')
    text_parts = sentence_splitter.split(clean_text)
    sentences = []
    # 把分割后的内容重新组合成完整句子
    for i in range(0, len(text_parts)-1, 2):
        full_sentence = text_parts[i] + text_parts[i+1]
        if full_sentence.strip():
            sentences.append(full_sentence.strip())
    
    # 区分对话和场景叙述,这里的规则可以根据你的文本调整!
    dialogue_lines = []
    scene_narratives = []
    for sent in sentences:
        # 规则:带感叹号/问号、数字计数的句子视为对话,其余为场景叙述
        if '!' in sent or '?' in sent or re.search(r'[零一二三四五六七八九十]+、', sent):
            dialogue_lines.append(sent)
        else:
            scene_narratives.append(sent)
    
    # 合并最终结果
    x = ' '.join(dialogue_lines)
    y = ';'.join(scene_from_brackets + scene_narratives)
    
    return x, y

# 测试你的示例文本
sample_text = "没时间。就今天不行。(快速装上最后几颗子弹)十、十一、十二…不成功便成仁。(给每把枪都上膛,抬头)就在这儿!出租车在大型立交桥的最高层高速公路路肩上急刹停下。多平德停下计价器,递给死侍他的名片。"
dialogue_x, scene_y = extract_dialogue_and_scene(sample_text)
print("提取的对话x:", dialogue_x)
print("提取的场景描述y:", scene_y)

# 批量处理文件中的文本实例(假设每行一个文本实例)
def batch_process(input_file: str, output_file: str = 'processed_results.txt'):
    with open(input_file, 'r', encoding='utf-8') as f:
        all_texts = [line.strip() for line in f if line.strip()]
    
    processed_results = []
    for idx, text in enumerate(all_texts, 1):
        x, y = extract_dialogue_and_scene(text)
        processed_results.append(f"实例{idx}:\n对话:{x}\n场景描述:{y}\n")
    
    # 把结果写入输出文件
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write('\n'.join(processed_results))
    print(f"批量处理完成!结果已保存到 {output_file}")

# 调用批量处理(替换成你的输入文件路径)
# batch_process('your_text_file.txt')

一些可以优化的点

  • 如果你的文本里有半角括号(),可以把正则里的()改成[()()]来兼容
  • 如果对话有明确的说话人标记(比如“死侍:”“多平德说:”),可以修改规则,用正则匹配这些前缀,这样准确率会更高
  • 要是文本里有换行,re.DOTALL已经帮你处理了,不用担心括号内容跨行会匹配不到

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:37:17