文書の類似度判定(2)

まずはjanomeを使用して形態素解析を行います。

カスタム辞書を指定していますが、指定しなくても動作します。

janomeによる形態素解析

# -*- coding: utf-8 -*-
# http://www.mizunagi-works.com
# ------------------------------------------------------------------ import(s)
import sys
import os

import janome.tokenizer

# ------------------------------------------------------------------- const(s)
DB_FILENAME = "dccol.db"
CUSTOM_DIC = "./dic/nanoha_keyword.dic"
RAW_TEXT_DIR = "doc_source"


# ------------------------------------------------------------------- class(s)
# ---------------------------------------------------------------- function(s)
def main():

    o_tagger = janome.tokenizer.Tokenizer(CUSTOM_DIC)

    # 指定したフォルダ内の .txt 拡張子のファイルを読み込み
    for dirname, _, list_filename in os.walk(RAW_TEXT_DIR):
        for filename in list_filename:
            if os.path.splitext(filename)[1].lower() not in (".txt",):
                continue

            pathname = os.path.join(dirname, filename)

            with open(pathname, "r") as h_reader:

                # utf-8 to unicode
                raw_u_text = h_reader.read().decode("utf-8")

                for pos, r in enumerate(o_tagger.tokenize(raw_u_text)):
                    word_surface = r.surface
                    word_feature = r.part_of_speech.split(",")[0]

if __name__ == "__main__":
    main()

# [EOF]

word2vecを使用するには形態素解析したデータをもとに分かち書きを作成する必要があります。

毎回形態素解析をして生成しても良いですが、ここでは形態素解析をした結果をデータベースに一旦保存した後、必要な情報を取得できるようにしてみます。

janomeによる形態素解析とデータベースへの保存

前述のコードを修正してデータベース(ここではsqlite3)へ保存するようにしたもの。

# -*- coding: utf-8 -*-
# http://www.mizunagi-works.com
# ------------------------------------------------------------------ import(s)
import sys
import os
import sqlite3

import janome.tokenizer


# ------------------------------------------------------------------- const(s)
DB_FILENAME = "dccol.db"
CUSTOM_DIC = "./dic/nanoha_keyword.dic"
RAW_TEXT_DIR = "doc_source"


# ------------------------------------------------------------------- class(s)
# ---------------------------------------------------------------- function(s)
def main():

    o_tagger = janome.tokenizer.Tokenizer(CUSTOM_DIC)

    o_conn = sqlite3.connect(DB_FILENAME)
    o_cursor = o_conn.cursor()

    # テーブル生成
    o_cursor.execute(
        """
        CREATE TABLE IF NOT EXISTS doc_collection
        (
            id_doc text
        ,   word_pos int
        ,   word_surface text
        ,   word_feature text
        );
        """
    )

    # 指定したフォルダ内の .txt 拡張子のファイルを読み込んでDB化
    for dirname, _, list_filename in os.walk(RAW_TEXT_DIR):
        for filename in list_filename:
            if os.path.splitext(filename)[1].lower() not in (".txt",):
                continue

            pathname = os.path.join(dirname, filename)

            with open(pathname, "r") as h_reader:

                # utf-8 to unicode
                raw_u_text = h_reader.read().decode("utf-8")

                # 指定したドキュメントを削除
                o_cursor.execute(
                    """
                    DELETE FROM
                        doc_collection
                    WHERE
                        id_doc = ?;
                    """,
                    (pathname,)
                )

                for pos, r in enumerate(o_tagger.tokenize(raw_u_text)):

                    word_surface = r.surface
                    word_feature = r.part_of_speech.split(",")[0]

                    # 指定したドキュメントに単語を追加
                    o_cursor.execute(
                        """
                        INSERT INTO doc_collection
                        (
                            id_doc, word_pos, word_surface, word_feature
                        ) VALUES (?, ?, ?, ?);
                        """,
                        (pathname, pos, word_surface, word_feature,)
                    )

    o_conn.commit()

if __name__ == "__main__":
    main()

# [EOF]

.