在nltk3中有不需要的字符?

时间:2015-12-11 18:51:38

标签: nlp python-3.3

我目前正在一个自然处理语言项目中工作,我从网上删除了几个文本。我从这个网站的一些代码片段中找到了解决方法。

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?

1 个答案:

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

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