logblog

業界経験2年目のしがないWebエンジニアのブログです。

【Python】MeCabにより形態素解析を行い名詞・動詞を抽出する

何をする

MeCabにより日本語文章を分割して特定の品詞情報を抽出する

事前準備

MeCabをインストール
いっぱい参考ページあるので検索下さい

コード

make_word_list.py

import MeCab

tagger = MeCab.Tagger("-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd")
# 初期化しないとエラーになる
tagger.parse("")

# 入力された文章を分解しリスト化する
class MakeWordList:
    def __init__(self):
        pass

    # 文字列を単語で分割しリストに格納する
    def word_tokenaize(self, doc):
        node = tagger.parseToNode(doc)

        result = []
        while node:
            hinshi = node.feature.split(",")[0]
            if hinshi == '名詞' or hinshi == '動詞':
                result.append(node.feature.split(",")[6])
            node = node.next

        return result

main.py

import MeCab
import make_word_list

str = input("文字列を入力.-> ")

# インスタンスの作成
make_words = make_word_list.MakeWordList()
# 入力文を形態素解析後、リスト化
word_list = make_words.word_tokenaize(str)
print(word_list)

結果

文字列を入力.->MeCabで形態素解析をする
['MeCab', '形態素解析', 'する']

おわり

【Java】enumでキーからメッセージを取得する

用途

DBには0, 1, 2...みたいに数値で入っているけど画面にはそれぞれの値に対応した文字列を表示したい時ってあるでしょう。
そんな時にenumを使っていい感じにキー値から対応する文字列を取得する方法を記載します。

コード

CodeBase.java

public interface CodeBase {
	public Short getKey();
	
	public String getMessage();
}


CodeDifinition.java

public class CodeDifinition {
	public static <T extends Enum<T> & CodeBase> Optional<T> of(Short key, Class<T> enumClass) {
		return Optional.ofNullable(Stream.of(enumClass.getEnumConstants())
				.filter(enums -> enums.getKey() == key)
				.findFirst()
				.orElse(null));
	}
	
	public static <T extends Enum<T> & CodeBase> String toCodeMessage(Optional<T> type) {
		return type.isPresent() ? type.get().getMessage() : "unknown";
	}
}


Fruits.java

public enum Fruits implements CodeBase {
	APPLE((short) 0, "りんご"),

	ORANGE((short) 1, "オレンジ"),

	LEMON((short) 2, "レモン");
	
	private Short key;
	private String message;
	
	private Fruits(Short key, String message) {
		this.key = key;
		this.message = message;
	}

	@Override
	public Short getKey() {
		return key;
	}

	@Override
	public String getMessage() {
		return message;
	}

	public static Optional<Fruits> of(Short key) {
		return CodeDifinition.of(key, Fruits.class);
	}
	
	public static String toMessage(Short key) {
		final Optional<Fruits> type = Fruits.of(key);
		
		return CodeDifinition.toCodeMessage(type);
	}
}


Execute.java

public class Execute {
	public static void main(String[] args) {
		final Short num0 = 0;
		final Short num1 = 1;
		final Short num2 = 2;
		final Short num3 = 3;
		final List<Short> numList = Arrays.asList(num0, num1, num2, num3);
		
		final List<String> messageList = numList.stream()
				.map(num -> Fruits.toMessage(num))
				.collect(Collectors.toList());
		
		messageList.forEach(System.out::println);
	}
}


出力結果

りんご
オレンジ
レモン
unknown


他にいい方法あれば教えて頂きたいです。

おわり