質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1310閲覧

nltkで日本語を入力すると文字化けしてしまう

syen2501

総合スコア38

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/20 04:54

編集2018/06/21 05:07

<「ntlk」を用いて日本語でもn-gramを使用できるようにしたい>
pythonのnltkでn-gramを使用しようと思い、サンプルプログラムを実行しているのですが、
入力する文章が英語だとうまく実行できるのですが、日本語になると文字化けしてしまいます。

python

1import nltk 2f = open(u'context.txt',encoding = 'utf8') 3raw = f.read() 4tokens = nltk.word_tokenize(raw) #テキストをトークンに分割 5print(tokens) 6 7<実行結果> 8['�|�b�g��100���ȏ�ɂȂ�����A�ۉ����[�h�ɑJ�ڂ���']

<試したこと>
自分で調べたところ、文字化けしないようにするコードがあったのですが、
エラーが出力されてしまいます。

python

1import nltk 2from nltk.corpus.reader import * 3from nltk.corpus.reader.util import * 4from nltk.text import Text 5 6#下記の3つのコードが、日本語コーパスを取り扱うようにする 7jp_sent_tokenizer = nltk.RegexpTokenizer(u' [^「」!?。]*[!?。]') 8jp_chartype_tokenizer = nltk.RegexpTokenizer(u'([ぁ-んー]+|[ァ-ンー]+|[\u4e00-\u9FFF]+|[^ぁ-んァ-ンー\u4e00-\u9FFF]+)') 9text = PlaintextCorpusReader(r"C:\Users\nltk_data", r'text.txt',encoding='utf-8', 10para_block_reader=read_line_block,sent_tokenizer=jp_sent_tokenizer,word_tokenizer=jp_chartype_tokenizer) 11 12tokens = nltk.word_tokenize(text) #テキストをトークンに分割 13print(tokens) 14 15<実行結果> 16Traceback (most recent call last): 17 File "C:\Users\神龍\word_separate\sample.py", line 15, in <module> 18 tokens = nltk.word_tokenize(text) #テキストをトークンに分割 19 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\__init__.py", line 130, in word_tokenize 20 sentences = [text] if preserve_line else sent_tokenize(text, language) 21 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\__init__.py", line 97, in sent_tokenize 22 return tokenizer.tokenize(text) 23 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py", line 1235, in tokenize 24 return list(self.sentences_from_text(text, realign_boundaries)) 25 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py", line 1283, in sentences_from_text 26 return [text[s:e] for s, e in self.span_tokenize(text, realign_boundaries)] 27 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py", line 1274, in span_tokenize 28 return [(sl.start, sl.stop) for sl in slices] 29 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py", line 1274, in <listcomp> 30 return [(sl.start, sl.stop) for sl in slices] 31 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py", line 1314, in _realign_boundaries 32 for sl1, sl2 in _pair_iter(slices): 33 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py", line 312, in _pair_iter 34 prev = next(it) 35 File "C:\Users\Public\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py", line 1287, in _slices_from_text 36 for match in self._lang_vars.period_context_re().finditer(text): 37TypeError: expected string or bytes-like object

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

nltk.word_tokenize()というメソッドは、英文を単語に区切り、リストに入れるメソッドです。
そのため、英語であれば正常に動作しますが、日本語をそのまま入力しても上手く動きません。

単語のn-gram、下の例だと、n=2のbigramを考える場合、
下のように日本語の形態素解析した結果をリストに入れると良いと思います。
形態素解析器には、MeCabやJumanを使うと良いでしょう。

tokens = ['私','は','昨日','パン','を','食べました']
bigrams = nltk.bigrams(tokens)
fd = nltk.FreqDist(bigrams)
fd.items()

dict_items([(('私', 'は'), 1), (('は', '昨日'), 1), (('昨日', 'パン'), 1), (('パン', 'を'), 1), (('を', '食べました'), 1)])

投稿2018/06/21 08:48

b_vill_K

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syen2501

2018/06/21 16:41

ありがとうございました。 ちなみに、私は形態素解析ではJumanを使用しているのですが、 形態素解析した結果はどのようにしたら取得できますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問