Python 使用NLTK时的Unicode问题

Python 使用NLTK时的Unicode问题,python,regex,unicode,nltk,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, 之后,我对文本进行了一些替换,以规范化一些单词(即,使用正则表达式(r'\u20ac',r'euros')替换“euros”的欧元符号(\u20ac)) 这里我的问题似乎开始了。。。如

我从互联网上截取了一个文本(我想它是一个用“latin-1”编码的西班牙语文本,截取时解码为unicode)。文本是这样的:

730\u20ac.\r\n\nropa nueva 2012 ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac,
之后,我对文本进行了一些替换,以规范化一些单词(即,使用正则表达式(r'\u20ac',r'euros')替换“euros”的欧元符号(\u20ac))

这里我的问题似乎开始了。。。如果在应用正则表达式之前我没有将每个字符串编码为“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,那么我现在怎么会有问题呢?你有什么建议来避免它

有没有一种方法可以一劳永逸地完成编码过程,如下所示?如果是这样,我应该为第二部分做什么(无论如何编码/解码)

提前感谢您的帮助!!我是一个编程新手,它正在折磨我

代码详细信息:

正则表达式函数

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

您似乎误解了
r'\u20ac'

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

>>> p = re.compile(r'\u20ac')
>>> p.pattern
'\\u20ac'
>>> print p.pattern
\u20ac
如果要使用原始字符串和unicode转义,则必须使用原始unicode字符串,由
ur
指示,而不仅仅是
r

>>> p = re.compile(ur'\u20ac')
>>> p.pattern
u'\u20ac'
>>> print p.pattern
€

您似乎误解了
r'\u20ac'

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

>>> p = re.compile(r'\u20ac')
>>> p.pattern
'\\u20ac'
>>> print p.pattern
\u20ac
如果要使用原始字符串和unicode转义,则必须使用原始unicode字符串,由
ur
指示,而不仅仅是
r

>>> p = re.compile(ur'\u20ac')
>>> p.pattern
u'\u20ac'
>>> print p.pattern
€

您是否正确使用了解码和编码功能

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意思是:-无-

这是不正确的

欧元符号和数字之间有一个空格,上面写着:

单词:€含义:名词、普通词、单数词或群词:50含义: 基数


哪个更正确。

您是否正确使用了解码和编码功能

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意思是:-无-

这是不正确的

欧元符号和数字之间有一个空格,上面写着:

单词:€含义:名词、普通词、单数词或群词:50含义: 基数


哪一个更正确。

在您抓取的文本中,
\u20ac
是将所有文字字符分块,还是将其作为转义序列的Unicode字符串?或者换句话说,该文本块比较是否等于
u'\u20ac'
r'\u20ac'
?@F.J:文本在JSON文件中,我使用JSON.load打开它。当我尝试使用type()检查时,它显示unicode。。。此外,我在标记化之前替换了它,因此它是一个长文本字符串(一句话)。请尝试将文本保留为Unicode,而不是编码为UTF-8,并使用
re.sub(ur'\u20ac',ur'euros',text)
进行规范化。@F.J如果我这样做,正则表达式将不起作用。。。例如,它与欧元符号不匹配。。。只有在我进行strin.encode('utf-8')之后,我才得到一个匹配项……在您所抓取的文本中,
\u20ac
是将所有文字字符分块,还是将其作为转义序列的Unicode字符串?或者换句话说,该文本块比较是否等于
u'\u20ac'
r'\u20ac'
?@F.J:文本在JSON文件中,我使用JSON.load打开它。当我尝试使用type()检查时,它显示unicode。。。此外,我在标记化之前替换了它,因此它是一个长文本字符串(一句话)。请尝试将文本保留为Unicode,而不是编码为UTF-8,并使用
re.sub(ur'\u20ac',ur'euros',text)
进行规范化。@F.J如果我这样做,正则表达式将不起作用。。。例如,它与欧元符号不匹配。。。只有在我完成strin.encode('utf-8')后,我才得到一个匹配项…这是一场噩梦。。。我已经尝试在正则表达式列表的字符串开头替换r'代表ur'。但有了这个,正则表达式似乎没有任何匹配。。。我用的是pycharm,你认为这可能与它有关吗?谢谢你的帮助!!!如果使用python执行正则表达式,则需要使用
ur
。字符串应该是unicode,而不是utf-8编码的,只是普通的python unicode对象。如果我们想找出问题所在,您需要显示更多的代码,但这可能不是代码中的正则表达式部分;这是你对数据的另一种假设。真的很奇怪。。。我有一个文件中的替换模式和函数。当我在这个文件中粘贴一个字符串(从JSON文件复制)并在这个字符串上调用函数时,我得到的结果是OK(使用ur“”)。但是,当我在另一个文件中迭代JSON文件中的字典列表,并在同一个文本上调用同一个函数时,它不起作用(当我必须替换文本时,它似乎起作用,但它似乎不理解regex-ur'hi'会起作用,但ur'[hH]I'不会)。你能想象会发生什么吗?当我在代码上键入字符串并将其传递给replace函数时,该函数以str的形式接收数据,函数结果正常。当我从json文件执行此操作时,函数接收到一个unicode,结果很糟糕。难道不是相反吗?与联通公司合作