【问题标题】:Python Dealing with Newline Characters When Converting From List to String从列表转换为字符串时 Python 处理换行符
【发布时间】:2017-08-21 00:37:14
【问题描述】:

我遇到了关于换行符和返回字符的问题。呃,这对我来说很难解释,但我会努力的。

我有以列表形式存在的数据。列表的成员中包含换行符。

 example_list = ["I've always loved jumping\n\n"]

为了通过 NLTK 使用 NLP 标记这个句子,我需要将句子放在一个字符串中。根据我运行的一些测试和 nltk 教程中的证据,NLTK 在标记化时会忽略换行符和其他转义字符。

问题是当我尝试将 example_list 转换为字符串时,我得到了这个输出

 str(example_list)
 '["I\'ve always loved jumping\\n\\n"]'

请注意,所有换行符现在都变成了转义的正斜杠。尝试对此进行标记会产生一个糟糕的结果,NLTK 认为 jumping\n\n 是一个大词,因为它认为带有两个斜杠的换行符实际上是文本。

有没有人知道任何技巧或良好做法,以确保我的列表中永远不存在换行符,或者在转换为字符串时这些字符被忽略或“双重转义”。

最后,关于python如何处理换行符以及这些字符如何与不同数据类型交互等相关的学习材料,是否有人有任何建议,因为它太令人困惑了。

非常感谢!

【问题讨论】:

  • 可以使用strip()删除\n
  • @BhargavRao,你为什么要删除 OP 的自我回答?
  • @alexis,部分是我的错,我将其标记为不是答案,因为它只是链接。投票取消删除它。

标签: string list nlp nltk newline


【解决方案1】:

你的列表里面已经有字符串了。 将列表转换为字符串(很可能)不是您想要的:这是为了显示列表,例如。用于调试。

你想要的(我假设)是提取列表中的字符串。 这会导致换行符保持原样。 有(至少)两种方法可以做到这一点:

为了使单词标记化效果最好,最好先进行句子标记化。 您的示例仅显示了一个包含单个元素的列表,该列表恰好包含一个句子。 如果您的数据总是每个元素只有一个句子(即您已经有句子拆分文本),您可以简单地这样做:

for sentence in example_list:
    tokens = word_tokenize(sentence)
    # Do something with the tokens of this sentence...

但是,如果文本还没有被分句,你需要先这样做。 同样,您的数据有两种可能性: 列表元素要么是段落,要么是任意片段。

在段落的情况下,假设每个元素包含多个句子,但句子永远不会跨越多个元素。 在这种情况下,代码可能如下所示:

for paragraph in example_list:
    for sentence in sent_tokenize(paragraph):
        tokens = word_tokenize(sentence)
        # Do something with the tokens of this sentence...

在最后一种情况下,列表元素是任意片段,其中句子跨越多个元素,我们需要先将它们连接起来。 NLTK 的工具期望一个句子由一个连续的字符串构成,因此必须首先连接所有片段。 这样做是这样的:

text = ''.join(example_list)
for sentence in sent_tokenize(text):
    tokens = word_tokenize(sentence)
    # Do something with the tokens of this sentence...

我希望这能给你一些线索!

【讨论】:

    【解决方案2】:

    您解决了错误的问题:从您显示的输出中可以清楚地看出,您读取的文件实际上包含方括号、引号和反斜杠。换句话说,那些\n 不是换行符,它们是实际的\n 序列。这是一个(三引号,原始)字符串,可以重现您的问题:

    >>> mess = r'''["I've always loved jumping\n\n"]'''
    >>> str(mess)
    '["I\'ve always loved jumping\\n\\n"]'
    

    当然,您没有将数据放在原始字符串中;您可以通过读取您自己创建的文件来获得它:

    with open("newfile.txt", "w") as datafile:
        datafile.write(str(list_of_strings))      # <-- Not a good idea
    

    这是你的错误。写入 one 字符串只会输出字符串内容,但在列表中调用 write() 会打印出它的 repr(),因此文件中会出现引号和反斜杠。像这样正确地写出你的字符串列表:

    with open("newfile.txt", "w") as datafile:  
        datafile.writelines(list_of_strings)
    

    ...基本上是这个的缩写:

    with open("newfile.txt", "w") as datafile:
       for s in list_of_strings:
           datafile.write(s)
    

    这样做,当您读取文件时,它会正常运行,而无需您玩游戏。

    【讨论】:

    • 我不认为 OP 是这种情况——他清楚地表明数据是作为列表给出的。 repr 格式来自str(...) 调用,它基于必须将列表转换 为字符串而不是访问字符串元素的误解......
    • 你很可能是对的......当他们试图简化时,破坏他们正在处理的数据的真实格式的问题并不少见,但现在看了他的自我回答,我怀疑你的解释是正确的。
    猜你喜欢
    • 1970-01-01
    • 2015-04-14
    • 2016-11-09
    • 1970-01-01
    • 2023-03-16
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多