我目前正在一个自然处理语言项目中工作,我从网上删除了几个文本。我从这个网站的一些代码片段中找到了解决方法。
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每一次真正的人民革命 b资产阶级革命展示了xexxcbrilliantxexxdn
如何摆脱这些不需要的字符,例如" b"在开始时," n"在最后还是xexxc ... xexxd?
答案 0 :(得分:1)
首先,这个问题与NLTK无关。您发布的代码甚至没有显示任何NLTK的使用。
主要问题是你是以二进制模式('rb')打开输入文件而不是文本模式('rt','r',或者只是跳过它,因为'r'和't'都是默认)。以二进制模式打开文件会为您提供字节 - 但您需要文本,因此需要文本模式。
让我们看一个例子:一个包含单行文本的文件:
这是
所以4个字符(加上最后一个换行符)。请注意,thrid字符不是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()
时,您将获得一个表示字符串,其中所有“特殊”都被转义,例如。换行符:
>>> str(bytes_)
"b'It\\xe2\\x80\\x99s\\n'"
然后你除了ASCII字母a到z和空白之外的一切都删除了,这意味着你删除了反斜杠和数字:
>>> re.sub(r'[^a-zA-Z\s]', '', str(bytes_))
'bItxexxsn'
这正是您在ur1.ca上发布的片段的第60行所发生的事情。
长话短说:阅读文字时使用文字模式。