我有一个csv文件,其中包含一些文本。我想将此文本标记化(分解为单词列表),并且在pd.read_csv
如何解释转义字符方面遇到问题。
我的csv文件如下:
text, number
one line\nother line, 12
,代码如下:
df = pd.read_csv('test.csv')
word_tokenize(df.iloc[0,0])
输出为:
['one', 'line\\nother', 'line']
我想要的是:
['one', 'line', 'other', 'line']
问题是pd.read_csv()
不会将\n
解释为换行符,而是解释为两个字符(\
和n
)。
我尝试将escapechar
参数设置为'\'
和'\\'
,但是两者都只是从字符串中删除斜杠而不对换行符做任何解释,即字符串变成on one linenon other line
。
如果我显式设置df.iloc[0,0] = 'one line\nother line'
,则word_tokenize
可以正常工作,因为这次\n
实际上被解释为换行符。
理想情况下,我只需要更改pd.read_csv()
解释文件的方式即可,但是其他解决方案也可以。
答案 0 :(得分:0)
在这种情况下,只需使用:
data = pd.read_csv('test.csv', sep='\\,', names=['c1', 'c2', 'c3', 'c4'], engine='python')
答案 1 :(得分:0)
这个问题措辞有点差。我猜想pandas
在字符串中转义\
会使nltk.word_tokenize
感到困惑。 pandas.read_csv
只能使用一个分隔符(或正则表达式,但我怀疑您想要这样做),因此它将始终将文本列读取为"one line\nother line"
,并转义反斜杠以保留它。如果要进一步解析和格式化它,可以使用转换器。这是一个示例:
import pandas as pd
import re
df = pd.read_csv(
"file.csv", converters={"text":lambda s: re.split("\\\\n| ", s)}
)
以上结果为:
text number
0 [one, line, other, line] 12
编辑::如果需要使用nltk
进行拆分(例如,拆分取决于语言模型),则需要先对字符串进行转义,然后再传递给{ {1}};尝试这样的事情:
word_tokenize
注意:查询中的匹配列表非常棘手,因此您可能希望通过像这样更改lambda将它们转换为元组:
lambda s: word_tokenize(s.encode('utf-8').decode('unicode_escape')
答案 2 :(得分:0)
您可以简单地尝试一下
import pandas as pd
df = pd.read_csv("test.csv", header=None)
df = df.apply(lambda x: x.str.replace('\\', " "))
print(df.iloc[1, 0])
# output: one line other line