Разбор японского питона

***** РЕДАКТИРОВАНИЕ С ПОЛНЫМ КОДОМ ******

Я пытаюсь проанализировать некоторый японский код, используя Python (версия 3.5.3) и библиотеку MeCab на MacOS.

У меня есть текстовый файл со следующим текстом:

石 の 上 に 三年

Я установил свои предпочтения в 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

Заранее спасибо,

Израиль

3 ответа

Решение

Решение:

Очевидно, проблема была в MeCab, а не в самом коде Python. Эта проблема заключалась в том, что когда вы устанавливаете его с нуля, используя make, иногда он не устанавливается должным образом, но не вызывает никаких ошибок.

Я не уверен, почему, но если вы хотите копать дальше и выяснить, что именно происходит, это было бы здорово. Я только знаю, что я удалил и заново установил, используя brew, и это сработало.

Подобные вещи происходили на других компьютерах Mac из офиса. Я использую brew в OS X, поэтому я опубликую команду, которую использовал для правильной установки:

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

Надеюсь, что это поможет будущим людям пытаться пометить японские слова.

Ошибка возникает из-за того, что вы подаете что-то, что не является допустимым UTF-8, в декодер UTF-8. Это может быть вызвано разделением байтов, а не символов, или, возможно, неправильной попыткой декодировать другую кодировку, такую ​​как JIS или EUC, как если бы это была UTF-8. В Python, как правило, целесообразно придерживаться строк Unicode, и ваша система может переключиться на декодирование текстовых файлов, если что-то установило параметры локали. Даже если у вас есть правильное разбиение строк в Юникоде, это нетривиальная проблема, так как существуют коды для изменения других, например, ударения. К счастью, в японском не так много подобных вещей (если только кто-то не закодирует po как ho + ring и т. Д.).

Одна потенциальная проблема: на веб-странице Mecab говорится (согласно переводу Google): "Если не указано иное, используется euc". Если Mecab разбивает слова в предположении, что читает EUC, он будет искажать UTF-8.

При открытии файла укажите кодировку:

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

...

Кстати, при открытии файла используйте менеджер контекста, как показано в этом примере.

Другие вопросы по тегам