如何将文本转换为嵌套列表

时间:2017-03-24 01:18:11

标签: python recursion nested-lists

我正在尝试将文本输入转换为保留其结构的嵌套列表。目前我有一个函数,它接受一个文本和一个所需的“深度”,并输出一个这个深度的嵌套列表,打破每个换行符,句子或单词的文本。

def text_split(text, depth):
    depth_list = [' ', '.', '\n']
    if isinstance(text, str):
        text = text.strip('. ')
        text = text.split(depth_list[depth])
    if depth >= 0:
        depth -= 1
        for ix, item in enumerate(text):
                item = item.strip('. ')
                text[ix] = text_split(item, depth)
    return text

这需要诸如

之类的文本
text1 = """acabei de ler um livro. um diário.
mas a liberdade sempre chamou fountaine mais forte.
a cada viagem fountaine ía mais longe. aprendeu a andar de bicicleta e viajou o sul da frança.

esse é o tipo de pergunta feita na última edição do prêmio Loebner, em que participantes precisam responder à algumas questões feitas pelo júri.

o que tem de especial nessa competição é que ela não é para humanos, mas sim para robôs. o prêmio Loebner é uma implementação do teste de Turing.

"""

[   [[['acabei'], ['de'], ['ler'], ['um'], ['livro']], [['um'], ['diário']]],
[   [   ['mas'],
        ['a'],
        ['liberdade'],
        ['sempre'],
        ['chamou'],
        ['fountaine'],
        ['mais'],
        ['forte']]],
[   [   ['a'],
        ['cada'],
        ['viagem'],
        ['fountaine'],
        ['ía'],
        ['mais'],
        ['longe']],
    [   ['aprendeu'],
        ['a'],
        ['andar'],
        ['de'],
        ['bicicleta'],
        ['e'],
        ['viajou'],
        ['o'],
        ['sul'],
        ['da'],
        ['frança']]],
[[['']]], ... ]]]]

现在这可能不是最佳或最优雅的方式,它有一些问题,例如[[['']]]分裂后出现的\n(可以通过使用解决的问题) .splitlines(),但我找不到在递归函数中调用此方法的好方法。)

这样做的更好方法是什么?我应该使用嵌套列表吗? (我计划在之后迭代这个)。谢谢你的建议!

2 个答案:

答案 0 :(得分:1)

这是我能提出的最符合您要求的最佳方法:

text = []
for line in text1.split('\n'):
  sentences = []
  for sentence in line.split('.'):
    words = []
    for word in sentence.split(' '):
      if len(word.strip()) > 0: # make sure we are adding something
        words.append(word.strip())
    if len(words) > 0:
      sentences.append(words)
  if len(sentences) > 0:
    text.append(sentences)

使用这个,我们有一个定义良好的数组结构,我们可以确定我们没有任何空格或空数组。此外,递归在这里使用并不是一件好事,因为你有一个清晰的结构,文本应该是。你知道递归不会超过3个深度。

此外,如果您需要递归版本,则应在问题中说明并清除要求。

答案 1 :(得分:1)

您可以使用嵌套列表推导仅使用您的拆分条件:

>>> [[s.split() for s in line.split('.') if s] for line in text1.split('\n') if line]
[[['acabei', 'de', 'ler', 'um', 'livro'], ['um', 'diário']],
 [['mas', 'a', 'liberdade', 'sempre', 'chamou', 'fountaine', 'mais', 'forte']],
 [['a', 'cada', 'viagem', 'fountaine', 'ía', 'mais', 'longe'],
  ['aprendeu', 'a', 'andar', 'de', 'bicicleta', 'e', 'viajou', 'o', 'sul', 'da', 'frança']],
 ...