我遇到有关换行符和返回字符的问题。呃这对我来说很难解释,但我会尝试。
我有以列表形式存在的数据。列表中的成员中包含换行符,以便。
example_list = ["I've always loved jumping\n\n"]
为了使用NLP将这句话标记为NLTK,我需要将句子放在一个字符串中。根据我运行的一些测试以及来自nltk教程的证据,当NLTK标记化时,NLTK将忽略换行符和其他转义字符。
问题是当我尝试将example_list转换为字符串时,我得到了这个输出
str(example_list)
'["I\'ve always loved jumping\\n\\n"]'
请注意,所有换行符现在都成为转义正斜杠。尝试对此进行标记化会产生一个可怕的结果,其中NLTK认为跳跃\ n \ n是一个大词,因为它认为带有两个斜杠的换行符实际上是文本。
有没有人知道任何技巧或良好做法,以确保我的列表中永远不存在换行符,或者在转换为字符串时忽略这些换行符或不“双重转义”。
最后,有没有人对学习有关python如何处理换行符以及这些字符如何与不同数据类型进行交互的材料有任何建议,因为它太混乱了。
非常感谢!
答案 0 :(得分: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...
我希望这能为你提供一些线索!
答案 1 :(得分:1)
您正在解决错误的问题:从输出中可以清楚地看到,您在一个实际包含方括号,引号和反斜杠的文件中读取。换句话说,\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
你的错误。编写一个字符串只会输出字符串内容,但在列表中调用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)
这样做,当您读取时,您的文件将会正常运行,而无需您玩游戏。