如何从我拥有的这个函数创建一个 n-gram 函数?

How to create a n-gram function from this function that I have?

我有以下函数可以按字符串的写入顺序计算字符串中的字符数:

def count_char(s):
    result = {}
    for i in range(len(s)):
        result[s[i]] = s.count(s[i])
    return result

例如。我们有:

count_char("practice")
{'p' : 1, 'r' : 1, 'a' : 1, 'c' : 2, 't' : 1, 'i' : 1, 'e' : 1}

如何从这个函数创建一个函数来计算每个 n-gram 在字符串中出现的次数?例如,

ngrams("tataki",n=2)
{'ta':2, 'at':1, 'ak':1, 'ki':1}

函数ngrams应该是对函数count_char的修改,但我现在不知道该怎么做...

您可以为您的函数添加一个长度参数;然后将您的切片从 1 个字符扩展到该长度:

def count_char(s, l = 1):
    result = {}
    for i in range(len(s)-l+1):
        result[s[i:i+l]] = s.count(s[i:i+l])
    return result

print(count_char("practice"))
print(count_char('tataki', 2))

输出:

{'p': 1, 'r': 1, 'a': 1, 'c': 2, 't': 1, 'i': 1, 'e': 1}
{'ta': 2, 'at': 1, 'ak': 1, 'ki': 1}

请注意,str.count 只计算非重叠次数,因此 count_char('ttt', 2) 将 return 1,而不是 2。如果你想计算重叠次数,你需要手动执行.例如:

def count_char(s, l = 1):
    result = {}
    for i in range(len(s)-l+1):
        sub = s[i:i+l]
        if sub not in result:
            result[sub] = sum(s[j:j+l] == sub for j in range(len(s)-l+1))
    return result

此函数将 return 2 调用为 count_char('ttt', 2)