はじめに
準備
使用するライブラリをインストールし、importします。
!pip install spacy
!pip install janome # for JP
!pip install nltk # for EN
import pandas as pd
from spacy import displacy
# for EN
import nltk
from nltk.tokenize import TreebankWordTokenizer as twt
# for JP
from janome.tokenizer import Tokenizer
コード
【English】nltkで形態素解析する
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('universal_tagset')
text = 'Sentense Colorization with nltk Tokenizer'
tokens = nltk.word_tokenize(text)
print(tokens)
['Sentense', 'Colorization', 'with', 'nltk', 'Tokenizer']
nltk.pos_tag
で単語と品詞をtupleで受け取ることが出来ます。
tags = nltk.pos_tag(tokens)
print(tags)
[('Sentense', 'JJ'), ('Colorization', 'NN'), ('with', 'IN'), ('nltk', 'JJ'), ('Tokenizer', 'NNP')]
品詞の一覧はこのようになっています。
https://www.nltk.org/book/ch05.html
各品詞に対して色を割り当てます。
pos_tags = ["PRON", "VERB", "NOUN", "ADJ", "ADP", "ADV", "CONJ", "DET", "NUM", "PRT"]
colors = {"PRON": "blueviolet",
"VERB": "lightpink",
"NOUN": "turquoise",
"ADJ" : "lime",
"ADP" : "khaki",
"ADV" : "orange",
"CONJ" : "cornflowerblue",
"DET" : "forestgreen",
"NUM" : "salmon",
"PRT" : "yellow"}
options = {"ents": pos_tags, "colors": colors}
品詞と色の対応と、各品詞のstart, end, tagをdisplacy.render
に指定することで可視化する関数を実装します。
def visualize_pos(text):
# Tokenize text and pos tag each token
tokens = twt().tokenize(text)
tags = nltk.pos_tag(tokens, tagset = "universal")
# Get start and end index (span) for each token
span_generator = twt().span_tokenize(text)
spans = [span for span in span_generator]
# Create dictionary with start index, end index,
# pos_tag for each token
ents = []
for tag, span in zip(tags, spans):
if tag[1] in pos_tags:
ents.append({"start" : span[0],
"end" : span[1],
"label" : tag[1] })
doc = {"text" : text, "ents" : ents}
displacy.render(doc,
style = "ent",
options = options,
manual = True,
)
visualize_pos("Sentense Colorization with nltk Tokenizer")
【Japanese】janomeで形態素解析する
janome.Tokenizerを使用することで形態素解析ができます。
tokenはgeneraterで返されます。
単語はtoken.surface
、品詞はtoken.part_of_speech
でアクセスできます。
Tokenizerクラスの実装はこちら
tokenizer = Tokenizer()
text = '日本語の文章を形態素解析し、品詞を可視化します'
tokens = tokenizer.tokenize(text)
for token in tokens:
print(token)
日本語 名詞,一般,,,,,日本語,ニホンゴ,ニホンゴ
の 助詞,連体化,,,,,の,ノ,ノ
文章 名詞,一般,,,,,文章,ブンショウ,ブンショー
を 助詞,格助詞,一般,,,,を,ヲ,ヲ
形態素 名詞,一般,,,,,形態素,ケイタイソ,ケイタイソ
解析 名詞,サ変接続,,,,,解析,カイセキ,カイセキ
し 動詞,自立,,,サ変・スル,連用形,する,シ,シ
、 記号,読点,,,,,、,、,、
品詞 名詞,一般,,,,,品詞,ヒンシ,ヒンシ
を 助詞,格助詞,一般,,,,を,ヲ,ヲ
可視 名詞,一般,,,,,可視,カシ,カシ
化 名詞,接尾,サ変接続,,,,化,カ,カ
し 動詞,自立,,,サ変・スル,連用形,する,シ,シ
ます 助動詞,,,,特殊・マス,基本形,ます,マス,マス
可視化の流れは前章と同じなので説明は割愛します。
pos_tags = ["名詞", "動詞", "形容詞", "助詞", "助動詞", "接続詞", "接頭詞", "記号", "副詞", "その他"]
colors = {"形容詞": "blueviolet",
"動詞": "lightpink",
"助詞": "turquoise",
"名詞" : "lime",
"助動詞" : "khaki",
"接続詞" : "orange",
"接頭詞" : "cornflowerblue",
"その他" : "forestgreen",
"副詞" : "salmon",
"記号" : "yellow"}
options = {"ents": pos_tags, "colors": colors}
def get_pos_tag(token):
return token.part_of_speech.split(',')[0]
def visualize_pos(text):
# Tokenize text and pos tag each token
tokens = tokenizer.tokenize(text)
ents = []
start_index = 0
for token in tokens:
ents.append({
"start": start_index,
"end": start_index + len(token.surface),
"label": get_pos_tag(token)}
)
start_index += len(token.surface)
doc = {"text" : text, "ents" : ents}
displacy.render(doc,
style = "ent",
options = options,
manual = True,
)
visualize_pos(text)