揭开电影剧本的对话以计算角色所说的话

Uncover a dialogue of a movie script to count the words spoken by characters

我正在做一个关于电影中女性意义的项目。 因此,我正在分析电影剧本以获得主要男性 character/main 女性角色的口语比例。

我在过滤 NAMES 和 指导说明。

我考虑过正则表达式,但我不喜欢它。

例如:

Mia works, photos of Hollywood icons on the wall behind her, as --

                        CUSTOMER #1
           This doesn't taste like almond milk.

                        MIA
           Don't worry, it is. I know sometimes it --

                        CUSTOMER #1
           Can I see the carton?

 Mia hands it over. The Customer looks.

                        CUSTOMER #1 (CONT'D)
           I'll have a black coffee.

我不知道如何处理语音文本后的空白新行。 有什么想法可以将完整的电影剧本缩减为仅有的对话剧本,以便我可以计算字数并处理数据吗?

from nltk.tokenize import word_tokenize

f = open("/...//La_la_land_script.txt", "r")
script = f.read()

我正在将电影脚本加载到 python

def deletebraces (str):
    klammerauf = str.find('(')
    klammerzu = str.find(')')

    while (klammerauf != -1 and klammerzu != -1):

            if (klammerauf<klammerzu):
                str = str[:klammerauf] + str[klammerzu+1:]

            klammerauf = str.find('(')
            klammerzu = str.find(')')
    return str

此函数删除所有括号

def removing(list):
    for i in list:
        if i == '?':
            list.remove('?')
        if i == '!':
            list.remove('!')
        if i == '.':
            list.remove('.')
        if i == ',':
            list.remove(',')
        if i == '...':
            list.remove('...')
    return list

此函数删除所有其他符号

def countingwords(list):
    woerter = 0
    for i in list:
        woerter = woerter + 1
    return woerter;

这个函数统计字数

script = deletebraces(script)

def wordsspoken(script, name):

    a = 0
    e = 0
    all = -len(name)-1

    if script.find(name)==-1:
        print("This character does not speak")

检查是否存在名字为

的角色
    else:
        while(a != -1 and e != -1):

            a = script.find(name+'\n            ') + len(name)
            print(a)
            temp = script[a:]
            t = temp.split("\n")

            text = t[1]

            print(text)
            textlist = word_tokenize(text)

            removing(textlist)                

            more = countingwords(textlist)

            all = all + more

            script = script[a+e:]
            a = script.find(name +'\n           ')
            temp = script[a:]
            e = temp.find(' \n')

这里我尝试揭开,但根本不起作用

    print(name + " sagt " + str(all) + " Wörter.")

f.close()


name = input("Enter name:")
wordsspoken(script, name)
name1 = input("Enter another name:")
wordsspoken(script, name1)

在脚本格式中,缩进承载了大部分信息。标记化可能会减少白色 space,导致您需要的信息丢失。

在标记化之前,我会使用缩进将舞台方向与对话分开。如果该行从第一列开始,则为舞台方向。如果它从一行的中间开始并且全部大写,那么它就是即将说话的角色的名字。角色名称后缩进的行(但没有角色名称那么多)是对话。

对话有时会嵌入一些次要的舞台指示(例如,指示角色是在窃窃私语还是大喊大叫)。这些通常比对话本身缩进得更深,并用括号括起来。

Post-制作脚本(例如编辑器、声音编辑器、出版等)通常对这些规则非常严格,因此缩进会非常可靠。早期的草稿和规格脚本也经常有错误,但好莱坞在一个脚本软件包上非常标准化,所以我希望任何现代的东西仍然非常可靠。请注意,半小时的情景喜剧剧本通常是双 spaced,但在其他方面遵循与电视剧和电影相同的格式规则。

正如@AdrianMcCarthy 指出的那样,您文件中的空白包含解析语音所需的所有信息。这是 Python 中完成任务的一种方法:

import codecs

# script.txt contains the sample text you posted
with codecs.open('script.txt', 'r', 'utf8') as f:

  # read the file content
  f = f.read()

  # store all the clean text that's accumulated
  spoken_text = ''

  # split the file into a list of strings, with each line a member in the list
  for line in f.split('\n'):

    # split the line into a list of words in the line
    words = line.split()

    # if there are no words, do nothing
    if not words:
      continue

    # if this line is a person identifier, do nothing
    if len(words[0]) > 1 and all([i.isupper() for i in words[0]]):
      continue

    # if there's a good amount of whitespace to the left, this is a spoken line
    if len(line) - len(line.lstrip()) > 4:
      spoken_text += line.strip() + ' '

print(spoken_text)