使用NLTK时出现Unicode问题

时间:2013-11-26 20:09:14

标签: python regex unicode nltk

我有一个从互联网上删除的文本(我认为这是一个用“latin-1”编码的西班牙文本,并在刮取时解码为unicode)。文字是这样的:

730\u20ac.\r\n\nropa nueva 2012 ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac,

之后我对文本进行了一些替换以规范化一些单词(即使用正则表达式替换€符号(\ u20ac)为“欧元”(r'\ u20ac',r'euros'))。

这里我的问题似乎开始......如果我在应用正则表达式之前不将每个字符串编码为“UTF-8”,则正则表达式不会发现任何事件(尽管确实存在很多事件)...

无论如何,在将其编码为UTF-8后,正则表达式(r'\ u20ac',r'euros')可以正常工作。

之后我将所有字符串标记并标记。当我尝试使用regexparser时,我得到了

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 1: ordinal not in range(128)

我的问题是,如果我已将其编码为UTF-8,我现在怎么办?你试图避免它的建议是什么?

有没有办法一劳永逸地进行编码过程,如下所示?如果是这样我该怎么办第二部分(无论如何编码/解码)?

Get text -> encode/ decode it anyway... -> Work on the text without any issue

提前感谢您的帮助!!我是编程的新手,它正在杀了我......

代码明细:

正则表达式功能

replacement_patterns = [(ur' \\u20ac', ur'  euros'),(ur' \xe2\x82\xac', r'  euros'),(ur' \b[eE]?[uU]?[rR]\b', r'  euros'), (ur' \b([0-9]+)[eE][uU]?[rR]?[oO]?[sS]?\b',ur' \1 euros')]

class RegexpReplacer(object):
    def __init__(self, patterns=replacement_patterns):
        self.patterns = [(re.compile(regex, re.IGNORECASE), repl) for (regex, repl) in patterns]

    def replace(self, text):
        s = text
        for (pattern, repl) in self.patterns:
            (s, count) = re.subn(pattern, repl, s)
        return s

2 个答案:

答案 0 :(得分:1)

您似乎误解了r'\u20ac'

的含义

r表示原始字符串。不是unicode字符串,标准字符串。因此,在模式中使用unicode转义只会得到一个字面反斜杠:

>>> p = re.compile(r'\u20ac')
>>> p.pattern
'\\u20ac'
>>> print p.pattern
\u20ac

如果您想使用原始字符串 unicode转义符,则必须使用原始unicode 字符串,由ur表示,而不仅仅是{{ 1}}:

r

答案 1 :(得分:0)

您使用的是解码和放大器吗?编码功能正确吗?

from nltk import ne_chunk,pos_tag
from nltk.tokenize.punkt import PunktSentenceTokenizer
from nltk.tokenize.treebank import TreebankWordTokenizer


text = "€"
text = text.decode('utf-8')
sentences = PunktTokenizer.tokenize(text)
tokens = [TreeBankTokenizer.tokenize(sentence) for sentence in sentences]
tagged = [pos_tag(token) for token in tokens]

如果需要,请尝试使用:

print your_string.encode("utf-8")

我目前没有问题。唯一的问题是50美元,说:

  

字:$含义:美元字:50意思是:数字,基数

这是对的。 50欧元,说:

  

字:€50意思是:-NONE -

这是不正确的。

在€符号和数字之间留一个空格,它说:

  

字:€含义:名词,普通,单数或大众字:50意思是:   数字,红衣主教

哪个更正确。