仅某些部分的字数统计

时间:2018-10-07 05:57:29

标签: python-3.x

我正在尝试从文本文件中获取字数统计。这部分相对容易。我的困难是,该文件是一个笔录,每个说话者可能讲不同的行数,而我只想获得说话者1的字数。幸运的是,每次有新的说话者开始时,我们都有他们的名字和冒号。下面的示例:

演讲者1:Lorem ipsum dolor坐下来,奉献自若。在Tincidunt Eraset中拥有盛名。否否否是否否是否Nulla sollicitudin sed nulla等。在前auau,锡切克人id lacus vel,feugiat rhoncus nisl。仙境的菜豆,智人的翼,前的性爱。紫茎泽兰的原产地。 Vivamus maximus risus是一个未成年人的妊娠严重后果。 Duis Malesuada布兰迪拷问者,sed efficitur leo porta vel。在quam mi中,前任选举主席塞格(sue)执政。 Orci varius natoque penatibus et magnis dis parturient montes,nascetur ridiculus mus。 Sed hendrerit elit ac justo rutrum sagittis。 演讲者2:Sed在Aliquam Nibh。 Nunc laoreet orci risus,vitae ornare elit tempus eget。 演讲者1:马萨·罗安(Roin Massa ante),调味品或调味品。尼布斯(Eut nibh metus),阿里夸姆(Aliquam)坐不住脚,却吞下了巨大的魔芋。

我正试图只为说话者1算一个字。如您所见,每个说话者只能说一句话,也可以说几句话。这是我用来获取字数的代码。我只对超过3个字母的单词感兴趣。

import string
fhand = open('transcript.txt')
counts = dict()
for line in fhand:
    line = line.translate(str.maketrans('', '', string.punctuation))
    line = line.lower()
    words = line.split()
    for word in words:
        if len(word) < 4: continue
        else:
            if word not in counts:
                counts[word] = 1
            else:
                counts[word] += 1

# Sort the dictionary by value
lst = list()
for key, val in list(counts.items()):
    lst.append((val, key))

lst.sort(reverse=True)

for key, val in lst[:100]
    print(val,key)

2 个答案:

答案 0 :(得分:1)

首先将整个文件读成字符串:

with open('transcript.txt', 'r') as f:
    a = f.read()

然后只获得与说话者1相关的部分:

b = [i for i in a.split('Speaker ') if i.startswith('1:')]

从字符串中替换1 ::

c = ''.join(b).replace('1:', '')

使用Counter获取单词计数字典:

from collections import Counter
d = Counter(c.split())

它会给你这样的东西

Counter({'Duis': 1,
     'In': 2,
     'Lorem': 1,
     'Nulla': 2,
     'Orci': 1,
     'Phasellus': 1,
     'Praesent': 1,
     'Proin': 1,
     'Sed': 1, ....

对特定发言人姓名的修改: 假设您具有以下字符串:

'JIM: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent in tincidunt erat. Nulla ac ipsum id est cursus venenatis eget nec velit. Nulla sollicitudin sed nulla et aliquet. In ex augue, tincidunt id lacus vel, feugiat rhoncus nisl. Phasellus in lectus scelerisque, finibus sapien vel, ornare ex. Proin faucibus eleifend volutpat. Vivamus maximus risus a nulla vulputate gravida vitae consequat ante. Duis malesuada blandit tortor, sed efficitur leo porta vel. In quam mi, congue in auctor sed, elementum nec ex. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed hendrerit elit ac justo rutrum sagittis. JEFF: Sed at aliquam nibh. Nunc laoreet orci risus, vitae ornare elit tempus eget. JIM: roin massa ante, condimentum ornare justo nec, vehicula gravida diam. Ut nibh metus, aliquam sit amet consequat at, vulputate a magna.\n'

以下函数将字符串作为第一个参数,并将名称作为第二个参数:

def get_word_count(S, N):
    w = []
    a = False
    for i in S.split():
        if i == N:
             a = True
        if i != N and ':' in i:
             a = False
        if a:
             w += [i]
    return Counter(w)

现在,如果您想获取“ JIM”的字数,请使用

JIM = get_word_count(a, 'JIM:')

“ JEFF”:

JEFF = get_word_count(a, 'JEFF:')

答案 1 :(得分:1)

例如,如果您只想按JIM计算单词数,则可以执行以下操作:

import re
from collections import Counter
with open('transcript.txt', 'r') as fhand:
    words = Counter(re.sub(r'\w+(?<!JIM):(?:(?!JIM:).)*|JIM:','',fhand).split())

print(words)

对于其他人,只需根据需要更改名称即可。

您可以编写一个函数:

get_count = lambda x,Name: Counter(re.sub(r'\w+(?<!'+Name+'):(?:(?!'+Name+':).)*|'+Name+':','',x).split())

现在运行:

fhand = open('transcript.txt','r')

get_count(fhand,'JIM')