字符和字母对的出现频率(python)

时间:2018-09-06 14:52:33

标签: python-3.x

我需要获取要提取和清除的文件中字符和字母对的频率。

当前代码提取文件,清理文本并删除所有空格。代码的后半部分输出字符的频率,但是输出在multiDimension_list中,这不是所需的输出。

我一直无法弄清楚如何获得字母对。

例如:我的文字中的项目按顺序包含多个字母。
aa aaaa oooo zzz ssss等。我需要获得这些组合。

预先感谢您提出解决这些问题的建议和帮助。

from collections import Counter

new_words = []
with open ('words.txt', 'r') as infile:
lines = [line for line in infile.readlines() if line.strip()]
for line in lines:
    clean_line = re.sub(r'(\b(section\s[\d]{1,2})\b)', '', line)
    clean_line_2 = re.sub(r'([()])', '', clean_line)
    new_words.append(clean_line_2.lower().replace('.', '').replace(';', '').replace('\n', '').replace('-', ' ').replace(" ", ""))


if len(new_words) > 0:
for item in new_words:
    print (Counter(item))


**outout:**

Counter({'a': 8, 'l': 3, 'i': 2, 'h': 2, 'z': 1, 'j': 1, 'n': 1, 's': 1, 'r': 1, 'u': 1, 'w': 1, 'f': 1, 't': 1})
Counter({'a': 14, 'n': 4, 'e': 4, 'i': 3, 'h': 3, 'l': 3, 'w': 2, 'd': 2, 'o': 2, 'f': 2, 'r': 1, 't': 1, 's': 1, 'y': 1, 'k': 1, 'u': 1, 'j': 1})
Counter({'a': 15, 'b': 6, 'i': 6, 'h': 4, 'w': 3, 'n': 3, 'f': 2, 's': 2, 'r': 2, 'k': 2, 't': 2, 'm': 1, 'd': 1, 'g': 1, ',': 1, 'u': 1})

2 个答案:

答案 0 :(得分:1)

如果我正确地理解了这个问题,则所有字符都需要一个计数器,而对字符则需要另一个计数器。

import re
from collections import Counter


new_words = []
with open('words.txt', 'r') as infile:
    lines = [line for line in infile.readlines() if line.strip()]

for line in lines:
    clean_line = re.sub(r'(\b(section\s[\d]{1,2})\b)', '', line)
    clean_line_2 = re.sub(r'([()])', '', clean_line)
    new_words.append(clean_line_2.lower().replace('.', '').replace(';', '').replace('\n', '').replace('-', ' ').replace(" ", ""))

加入所有行以计算文件中的总频率:

new_words_unit = ''.join(new_words)

if len(new_words_unit) > 0:
    print (Counter(new_words_unit))

Out:  # smth like this 
Counter({'a': 8, 'l': 3, 'i': 2, 'h': 2, 'z': 1, 'j': 1, ...})

现在定义chunk函数可以将字符分为几对并对其进行计数:

def chunk(iterable, size=2):
    length = len(iterable) - 1  # stop before reaching last character
    result = []
    for i in range(length):
        result.append(iterable[i:i+size])
    return result

size = 2
new_words_pairs = chunk(new_words_unit, size)  # chunk string
new_words_pairs = [''.join(i) for i in new_words_pairs if len(i) == size]  # filter single chars

print(Counter(new_words_pairs))

Out:  
Counter({'aa': 'ao': 1, 'dd': 2, 'df': 1, 'dr': 1, ...})

注意:所有这些对都相互交织。即'abcc' -> 'ab', 'bc', 'cc'

答案 1 :(得分:0)

第二部分:

from itertools import groupby
my_counts=[(key, len(list(group))) for key, group in groupby(new_words)]

这应该让您为列表中的每个唯一项计数