【问题标题】:Word Count only for certain sections仅针对某些部分的字数
【发布时间】:2019-03-12 03:45:04
【问题描述】:

我正在尝试从文本文件中获取字数。那部分相对容易。我的困难是,该文件是一个成绩单,其中每个发言者可能会说不同数量的行,我只想获取发言者 1 的字数。幸运的是,每次新发言者开始时,我们都有他们的名字和冒号。示例如下:

演讲者 1:Lorem ipsum dolor sit amet,consectetur adipiscing elit。现行有效。 Nulla ac ipsum id est cursus venenatis eget nec velit。 Nulla sollicitudin sed nulla et aliquet。在 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。在 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。 演讲者 2:aliquam nibh 的 Sed。 Nunc laoreet orci risus, vitae ornare elit tempus eget。 演讲者 1:roin massa ante、condimentum ornare justo nec、vehicula gravida diam。 Ut nibh metus, aliquam sit amet consequat at, vulputate a magna。

我正在尝试仅统计发言人 1 的字数。如您所见,每个发言人可能只说 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)

【问题讨论】:

    标签: python-3.x


    【解决方案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 = get_word_count(a, 'JEFF:')
    

    【讨论】:

    • 嗨,mamun - 我认为这个解决方案起初有效,但它没有:(如果我实施不正确,我很抱歉。它给了我列表中每个项目的计数,无论如何不管它是由演讲者 1:还是演讲者 2:另外,这完全是我的错,而不是你的错,我的实际成绩单有名字 JIM: 和 JEFF: 以及其他 30 位演讲者。有没有办法得到那些名字不显示?抱歉,我一开始以为这行得通。
    • 再次感谢 mamun;这确实成功了。感谢您的耐心和专业知识!
    【解决方案2】:

    例如,如果您只想按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')
    

    【讨论】:

    • 这样更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2019-04-08
    • 1970-01-01
    相关资源
    最近更新 更多