일본어로 문장의 특징을 추출하는 프로그램

11297 단어 Python3janomePython

janome를 통해 일본어의 형태소(명사 출현 빈도) 분석


문학 작품과 신문 보도 등 일본어 문장의 표현부터 형태소 해석을 통해 특정한 특징을 추출할 수 있는 동기를 살펴본다.

janome 설치


먼저 형태소 분석기의 janome 설치부터 시작합니다.
janome 설치
$ pip install janome
janome에 대한 설명서는 다음과 같습니다.
- Janome v0.3 documentation (ja)

실행 마스터


데이터 디렉터리 (폴더) 에서 모든 작품의 텍스트 형식의 파일 (확장자.txt) 을 준비한 후 실행합니다.

main.py의 실행
$ python main.py

주 프로그램의 소스 코드


한 마디로 하면 원본 코드는 다음과 같다.
main.py
# coding: UTF-8

from collections import Counter
from itertools import chain
from janome.tokenizer import Tokenizer
import math
import glob

result = []
for file in glob.glob('./data/*.txt'):
    # ファイルからテキストを読み込む
    book = []
    length = 0
    print(file, '-'*16)
    for line in open(file, 'r', encoding="utf-8"):
        print(line, '')
        book.append(line)

    data = []
    each_data = []

    # 形態素解析(janome)
    t = Tokenizer()
    for b in book:
        tokens = t.tokenize(b)
        length += len(b)
        for token in tokens:
            partOfSpeech = token.part_of_speech.split(',')[0]
            print(token)
            if partOfSpeech == "名詞":
                each_data.append(token.surface)
            data.append(each_data)
            each_data = []

    # 名詞の出現頻度(TF)を求める
    chain_data = list(chain.from_iterable(data))
    c = Counter(chain_data)

    # 統計情報の表示
    print("Statistics for ", file, ":")

    print("length = ", length)

    sum = 0
    for cnt in c.values():
        sum += cnt
    p = 0
    for cnt in c.values():
        q = cnt / sum
        p += - q * math.log(q)

    print("entropy = ", p)

    result_rankings = c.most_common(10)
    for d in result_ranking:
        print(d)

    result.append([file, length, p, result_ranking])

# 結果の表示(まとめ)
for r in result:
    print(r)

exit()

주 프로그램의 실행 결과 (예)


일부 문헌.의 텍스트 데이터입니다.
실행 결과의 한 예
['./data\\かいじん二十めんそう.txt', 9229, 4.869249479002453, [('の', 70), ('めん', 58), ('くん', 50), ('ん', 39), ('小', 37), ('二', 32), ('そう', 28), ('十', 28), ('おばけ', 27), ('中', 26)]]
['./data\\こころ.txt', 61906, 5.73922894743357, [('私', 1098), ('の', 465), ('先生', 356), ('事', 238), ('よう', 178), ('奥さ ん', 176), ('ん', 175), ('それ', 165), ('人', 142), ('もの', 142)]]
['./data\\ごんぎつね.txt', 3851, 4.7399830961522875, [('ん', 50), ('十', 33), ('兵', 32), ('中', 17), ('うなぎ', 15), ('の', 10), ('おれ', 10), ('栗', 10), ('家', 9), ('一', 8)]]
['./data\\坊っちゃん.txt', 22895, 6.168599304143815, [('おれ', 131), ('の', 103), ('ん', 90), ('事', 76), ('君', 59), ('もの', 55), ('シャツ', 55), ('山嵐', 54), ('赤', 53), ('人', 52)]]
['./data\\宇宙旅行の科学.txt', 16832, 5.9582839368126175, [('一', 83), ('こと', 81), ('ロケット', 73), ('の', 72), ('衛星', 58), ('マイル', 50), ('人工', 50), ('二', 50), ('地球', 44), ('五', 42)]]
['./data\\斜陽.txt', 73215, 6.35525411401746, [('私', 656), ('の', 418), ('お母さま', 268), ('事', 224), ('よう', 193), ('さん', 165), ('ん', 140), ('僕', 121), ('それ', 113), ('もの', 107)]]
['./data\\日本国憲法.txt', 11862, 5.884146792014421, [('条', 105), ('これ', 79), ('こと', 67), ('法律', 57), ('議員', 49), (' 国会', 46), ('国民', 45), ('内閣', 41), ('2', 40), ('議院', 32)]]
['./data\\日本国憲法(前文).txt', 650, 4.37189439697608, [('国民', 11), ('われ', 7), ('ら', 7), ('こと', 6), ('これ', 4), (' 平和', 4), ('日本', 3), ('憲法', 3), ('もの', 3), ('つて', 3)]]
['./data\\羅生門.txt', 2766, 4.853945084977317, [('下人', 27), ('事', 19), ('老婆', 18), ('の', 17), ('よう', 13), ('それ', 9), ('雨', 8), ('上', 8), ('門', 7), ('死骸', 7)]]
['./data\\茶わんの湯.txt', 3410, 4.813071551666044, [('湯', 30), ('よう', 22), ('茶わん', 21), ('の', 19), ('こと', 17), ('も の', 16), ('それ', 13), ('とき', 13), ('空気', 13), ('これ', 12)]]

전망하다


파일에 나타나는 N개의 명사의 출현 확률
청공 문고
파일에 대한 엔트로피

서로 다른 정의에 따라 문장의 읽기 쉬운 특징량으로 사용할 수 있다.
명사뿐만 아니라 동사와 형용사도 고려해야 하니 아직 의논할 필요가 있는 것 같다.

좋은 웹페이지 즐겨찾기