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 行发生的事情。

长话短说:阅读文本时使用文本模式。