nltk3 中不需要的字符?
Unwanted characters in in nltk3?
我目前在一个自然处理语言项目中工作,我从网上删除了一些文本。我已经从这个网站的一些代码片段中算出来了。
f = open(new_file, "w") #arquivo para escrita do texto processado
with open(txt_file, 'rb') as in_file:
for line in in_file:
line = line.lower() # troca tudo para minusculas
if re.search('\S', str(line)):
line2=line
phrases_list = re.split('[!?.,;:&()]+', str(line2)) #separa as linhas pelos pontos
for phrase in phrases_list:
word_list = []
# testa para ver se esta na lista de stopwords
for word in phrase.split(): #separa as linhas em palavras
if word in contractions:
new_word =contractions[word]
if new_word not in stopset:
word_list.append(new_word)
else:
if word not in stopset:
word_list.append(word)
new_phrase = ' '.join(word_list) # converte a lista em uma string
# limpa o texto e salva cada frase linha por linha
clean_phrase = re.sub("[^a-zA-Z\s]+", '', new_phrase).strip()
if clean_phrase !='':
f.write("%s\n" % clean_phrase)
f.close()
process_text(file_name, caminho+"textoprocessado3.txt")`
在 textoprocessado3.txt 中出现如下内容:
b xexxceuropeanxexxd
b every real peoples revolution
b bourgeois revolution displayed xexxcbrilliantxexxdn
如何去掉这些不需要的字符,例如开头的 "b",结尾的 "n" 或 xexxc...xexxd?
首先,这个问题与NLTK无关。您发布的代码甚至没有显示任何 NLTK 的使用。
主要问题是您以二进制模式 ('rb') 而不是文本模式 ('rt'、'r' 打开输入文件,或者只是跳过它,因为两者'r' 和 't' 是默认值)。以二进制模式打开文件给你字节——但你想要文本,所以你需要文本模式。
让我们看一个例子:一个只有一行文本的文件:
It’s
所以 4 个字符(加上最后一个换行符)。请注意,第三个字符不是 ASCII 撇号,而是印刷引号(Unicode 字符 U+2019)。该文件以 UTF-8 编码。
如果您以文本模式阅读本文,一切都很好:
>>> with open('example.txt', 'rt', encoding='UTF8') as f:
... text = f.read()
...
>>> text
'It’s\n'
拥有正确的编码至关重要,因为默认编码可能不正确。总是先尝试 UTF-8 是一个很好的猜测,因为如果它不是正确的编码,它会导致解码错误。
但是,如果您以字节为单位读取,则会得到以下结果:
>>> with open('example.txt', 'rb') as f:
... bytes_ = f.read()
...
>>> bytes_
b'It\xe2\x80\x99s\n'
这就是编码文本写入磁盘的方式,使用 3 个字节作为印刷引号字符。当您对此调用 str()
时,您会得到一个表示字符串,其中所有 "special" 都被转义,例如。换行符:
>>> str(bytes_)
"b'It\xe2\x80\x99s\n'"
然后您删除除 ASCII 字母 a 到 z 和空格之外的所有内容,这意味着您删除反斜杠和数字:
>>> re.sub(r'[^a-zA-Z\s]', '', str(bytes_))
'bItxexxsn'
这正是您在 ur1.ca 上发布的片段的第 60 行发生的事情。
长话短说:阅读文本时使用文本模式。
我目前在一个自然处理语言项目中工作,我从网上删除了一些文本。我已经从这个网站的一些代码片段中算出来了。
f = open(new_file, "w") #arquivo para escrita do texto processado
with open(txt_file, 'rb') as in_file:
for line in in_file:
line = line.lower() # troca tudo para minusculas
if re.search('\S', str(line)):
line2=line
phrases_list = re.split('[!?.,;:&()]+', str(line2)) #separa as linhas pelos pontos
for phrase in phrases_list:
word_list = []
# testa para ver se esta na lista de stopwords
for word in phrase.split(): #separa as linhas em palavras
if word in contractions:
new_word =contractions[word]
if new_word not in stopset:
word_list.append(new_word)
else:
if word not in stopset:
word_list.append(word)
new_phrase = ' '.join(word_list) # converte a lista em uma string
# limpa o texto e salva cada frase linha por linha
clean_phrase = re.sub("[^a-zA-Z\s]+", '', new_phrase).strip()
if clean_phrase !='':
f.write("%s\n" % clean_phrase)
f.close()
process_text(file_name, caminho+"textoprocessado3.txt")`
在 textoprocessado3.txt 中出现如下内容:
b xexxceuropeanxexxd
b every real peoples revolution
b bourgeois revolution displayed xexxcbrilliantxexxdn
如何去掉这些不需要的字符,例如开头的 "b",结尾的 "n" 或 xexxc...xexxd?
首先,这个问题与NLTK无关。您发布的代码甚至没有显示任何 NLTK 的使用。
主要问题是您以二进制模式 ('rb') 而不是文本模式 ('rt'、'r' 打开输入文件,或者只是跳过它,因为两者'r' 和 't' 是默认值)。以二进制模式打开文件给你字节——但你想要文本,所以你需要文本模式。
让我们看一个例子:一个只有一行文本的文件:
It’s
所以 4 个字符(加上最后一个换行符)。请注意,第三个字符不是 ASCII 撇号,而是印刷引号(Unicode 字符 U+2019)。该文件以 UTF-8 编码。
如果您以文本模式阅读本文,一切都很好:
>>> with open('example.txt', 'rt', encoding='UTF8') as f:
... text = f.read()
...
>>> text
'It’s\n'
拥有正确的编码至关重要,因为默认编码可能不正确。总是先尝试 UTF-8 是一个很好的猜测,因为如果它不是正确的编码,它会导致解码错误。
但是,如果您以字节为单位读取,则会得到以下结果:
>>> with open('example.txt', 'rb') as f:
... bytes_ = f.read()
...
>>> bytes_
b'It\xe2\x80\x99s\n'
这就是编码文本写入磁盘的方式,使用 3 个字节作为印刷引号字符。当您对此调用 str()
时,您会得到一个表示字符串,其中所有 "special" 都被转义,例如。换行符:
>>> str(bytes_)
"b'It\xe2\x80\x99s\n'"
然后您删除除 ASCII 字母 a 到 z 和空格之外的所有内容,这意味着您删除反斜杠和数字:
>>> re.sub(r'[^a-zA-Z\s]', '', str(bytes_))
'bItxexxsn'
这正是您在 ur1.ca 上发布的片段的第 60 行发生的事情。
长话短说:阅读文本时使用文本模式。