0

*****使用完整代码编辑******

我正在尝试使用 Python(版本 3.5.3)和 MacOS 上的 MeCab 库解析一些日语代码。

我有一个包含以下文本的 txt 文件:

石の上に三年

我在我的 textEdit 上设置了我的偏好以使用 utf-8 保存。所以我相信系统正确地将其保存为 utf-8 格式。

我收到以下错误:

Traceback (most recent call last):   File "japanese.py", line 29, in <module>
    words = extractMetadataFromTXT(fileName)   File "japanese.py", line 14, in extractMetadataFromTXT
    md = extractWordsJP(data)   File "japanese.py", line 22, in extractWordsJP
    components.append(parsed.surface) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte

贝娄是我的完整代码。什么都没有。

import MeCab
import nltk
from nltk import *
from nltk.corpus import knbc

mt = MeCab.Tagger("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
wordsList = knbc.words()
fdist = nltk.FreqDist(w.lower() for w in wordsList)

def extractMetadataFromTXT(filePath):
    with open(filePath, 'r', encoding='utf-8') as f:
        data = f.read()
        print(data)
    md = extractWordsJP(data)
    print(md)
    return md

def extractWordsJP(wordsJP):
    components = []
    parsed = mt.parseToNode(wordsJP)
    while parsed:
        components.append(parsed.surface)
        parsed = parsed.next
    return components

if __name__ == "__main__":
    fileName = "simple_japanese.txt"
    words = extractMetadataFromTXT(fileName)
    print(words)

有人知道为什么我会收到此错误消息吗?

有趣的事实:有时它有效。:O

提前致谢,

以色列

4

3 回答 3

1

解决方案:

显然,问题出在 MeCab 上,而不是 Python 代码本身。这个问题是当你从头开始安装它时,使用make,有时它不能正确安装,但它不会引发任何错误。

我不确定为什么,但如果你想进一步挖掘并找出到底发生了什么,那就太好了。我只知道我使用 brew 再次卸载并重新安装,并且它有效。

类似的事情也发生在办公室的其他 Mac 上。我在 OS X 中使用 brew,所以我将发布我用来正确安装它的命令:

brew install mecab mecab-ipadic git curl xz

另外,要将其安装在 linux 上,请使用以下命令:

sudo apt-get install mecab libmecab-dev mecab-ipadic
sudo apt-get install mecab-ipadic-utf8
sudo apt-get install python-mecab

希望这有助于未来尝试标记日语单词的人。

于 2017-08-10T02:48:15.250 回答
1

发生错误是因为您将无效的 UTF-8 输入到 UTF-8 解码器中。这可能是由于拆分字节而不是字符造成的,或者可能是由于错误地尝试解码另一种编码(如 JIS 或 EUC),就好像它是 UTF-8 一样。在 Python 中,坚持使用 unicode 字符串通常听起来不错,如果某些设置了语言环境参数,您的系统可能会切换到解码文本文件。即使您确实有正确的 unicode 字符串拆分也是一个重要的问题,因为有代码可以修改其他代码,例如重音符号。幸运的是,日语没有太多这种东西(除非有人碰巧将 po 编码为 ho+ring 等)。

一个潜在问题:Mecab 的网页声明(根据谷歌翻译)“除非另有说明,否则使用 euc。” 如果 Mecab 在读取 EUC 的假设下进行分词,它将破坏 UTF-8。

于 2017-06-19T09:12:03.347 回答
-1

打开文件时,指定编码:

with open(file, 'r', encoding='utf-8') as f:
    data = f.read()

...

顺便说一句,打开文件时,请使用本示例中所示的上下文管理器。

于 2017-06-19T08:49:14.503 回答