SilverCrow 发表于 2020-12-28 23:59:15

python字符串分割

n元文法(n-gram)在自然语言处理中是指文本中连续出现的n个元素。例如以字符为单位文本数据的n元文法是如下的形式(空格以下划线表示):
文本数据:…to_be_or_not_to_be…
一元文法(1-gram):…, t, o, _, b, e, _, o, r, _, n, o, t, _, t, o, _, b, e, …
二元文法(2-gram):…, to, o_, _b, be, e_, _o, or, r_, _n, no, ot, t_, _t, to, o_, _b, be, …
三元文法(3-gram):…, to_, o_b, _be, be_, e_o, _or, or_, r_n, _no, not, ot_, t_t, _to, to_, o_b, _be, …
请编写一个函数,返回所给文本以字符为单位的n元文法短语。文本字符串以及n值由函数的参数输入。使用列表容器返回的各短语,重复短语只出现一次,列表按升序排序。
例:
函数定义:def ngram(a_str, n),
计算返回值:ngram('to_be_or_not_to_be', 6)
['_be_or', '_not_t', '_or_no', '_to_be', 'be_or_', 'e_or_n', 'not_to', 'o_be_o', 'or_not', 'ot_to_', 'r_not_', 't_to_b', 'to_be_']

jtxs0000 发表于 2020-12-29 09:13:34

本帖最后由 jtxs0000 于 2020-12-29 11:11 编辑

基础不扎实,我暂时只能想到这个
def ngram(a_str, n):
    a_str = list(a_str)
    res = []
    while a_str:
      if len(a_str) <= n:
            res.append("".join(a_str))
            del a_str[:]
      else:
            res.append("".join(a_str[:n]))
            del a_str
    return sorted(set(res))

jtxs0000 发表于 2020-12-29 09:14:04

本帖最后由 jtxs0000 于 2020-12-29 11:32 编辑

既然发重复了,我就来个一行试试:


def ngram(a_str, n):

    return sorted(set(a_str for i in range(len(a_str)-n+1)))
      
print(ngram('to_be_or_not_to_be', 6))
页: [1]
查看完整版本: python字符串分割