#parsing #unicode #module #python-2.7 #mecab
#синтаксический анализ #юникод #модуль #python-2.7 #mecab
Вопрос:
Код:
import MeCab
m = MeCab.Tagger("-O wakati")
text = raw_input("Enter Japanese here: ")
print m.parse(text)
Проблема в том, что после ввода строки в raw_input она выдает ошибку в режиме ожидания:
Traceback (most recent call last):
File "C:Users---Desktop---Pythonjapanesetest.py", line 5, in <module>
print m.parse(text)
File "C:Users---Desktop---Pythonlibsite-packagesMeCab.py", line 220...
def parse(self, *args): return _MeCab.Tagger_parse(self, *args)
TypeError: in method 'Tagger_parse', argument 2 of type 'char const *'
Однако, если я это сделаю:
import MeCab
m = MeCab.Tagger("-O wakati")
print m.parse('なるほど、マルコフ辞書のキーはタプルにしたほうがスッキリしますね。')
Я получаю правильный результат:
なるほど 、 マルコフ 辞書 の キー は タプル に し た ほう が スッキリ し ます ね 。
Вещи, которые я пробовал, — это теги unicode в начале, запись в текстовый файл в unicode и синтаксический анализ текста, а также несколько других миллионов вещей. Я использую Python 2.7 и MeCab 0.98. Если это не может быть ответом, даже небольшой свет, пролитый на ошибку, будет оценен.
Ответ №1:
Я могу успешно запустить ваш фрагмент, используя Python 2.7 и MeCab 0.98 как в командной строке IDLE, так и в командной строке IPython.
import MeCab
m = MeCab.Tagger("-O wakati")
text = raw_input("Enter Japanese here: ")
Enter Japanese here: 私の車はとても高いです。
print m.parse(text)
私 の 車 は とても 高い です 。
Однако при чтении из файла UTF я получаю ошибки при попытке разобрать текст. Для этих случаев я явно кодирую текст в shift-jis. Вы можете попробовать этот метод. Ниже приведен пример.
rawtext = open("UTF.file", "rb").read()
tagger = MeCab.Tagger()
encoded_text = rawtext.encode('shift-jis', errors='ignore')
print tagger.parse(encoded_text).decode('shift-jis', errors='ignore')
Комментарии:
1. Это блестяще, спасибо. Это помогло мне исправить проблему с кодировкой графического интерфейса, с которой я также столкнулся.
Ответ №2:
Это мой текущий обходной путь, и он должен помочь людям, столкнувшимся с той же проблемой:
import MeCab
import codecs
write_to = codecs.open("pholder.txt", "w", "utf-8")
text = raw_input("Please insert Japanese text here: ")
write_to.write(text)
write_to.close()
read_from = open('pholder.txt').read()
mecab = MeCab.Tagger("-Owakati")
print mecab.parse(read_from)
Здесь решающим фактором является добавление .read() в open func . Почему? Может быть, вы можете мне сказать. :/