0
0

More than 3 years have passed since last update.

韻を扱いたいpart5

Last updated at Posted at 2020-05-25

内容

前回グラフを作れたので、クラスタリング等を行ってみる。
また、韻の捉え方を拡張する。「eい」→「ee」,「oう」→「oo」と変換し、変換後に母音が一致したものも「韻」と捉える。これはカタカナ英語や子供の間違えやすい日本語を参考にした。「ei」と表記しないのは「えき」が「ええ」にはならないということだ。「い」と「う」は母音単体ではないといけない。(「れいぞうこ」が「れえぞおこ」)

グラフの操作

import networkx as nx
import matplotlib.pyplot as plt
import community

G = nx.Graph()
G.add_weighted_edges_from(edge_list)
#クラスタリング
partition = community.best_partition(G, weight="weight")
#コミュニティごとにノードを分けてリストにする。[[コミュニティ0のノードリスト],[コミュニティ1のノードリスト]…]
part_sub = [[] for _ in set(list(partition.values()))]
for key in partition.keys():
    part_sub[partition[key]].append(key)
#各コミュニティで固有ベクトル中心性が最大となるノードをリストに格納
max_betw_cent_node = []
for part in part_sub:
    G_part = nx.Graph()
    for edge in edge_list:
        if edge[0] in part and edge[1] in part:
            G_part.add_weighted_edges_from([edge])
    max_betw_cent_node.append(max(G_part.nodes(), key=lambda val:
                                 nx.eigenvector_centrality_numpy(G_part, weight="weight")[val]))

print([dic[i] for i in max_betw_cent_node])
#モジュラリティ指標
print(community.modularity(partition,G))

クラスタリングし、コミュニティ毎に固有ベクトル中心性が最大となるものを求めた。良い分割が出来ていれば、それぞれをtarget_wordとした時に、良い結果が得られると思われる。エッジの重みに使っている部分に閾値を設けることで重みに差が付くようにしてみる等を検討する。

韻の捉え方の拡張

from pykakasi import kakasi
import re

with open("./gennama.txt","r", encoding="utf-8") as f:
    data = f.read()

kakasi = kakasi()
kakasi.setMode('J', 'K')
kakasi.setMode('H', 'K')
conv = kakasi.getConverter()
text_data = conv.do(data)

#eイ→ee,oウ→ooのように変換したテキストを得る
def expansion(text_data):
    #最後の文字次第だが、i,uの余分が出ることを長さを合わせることで解決
    text_data_len = len(text_data)
    #いい椅子や、そういう噂のような「い、う」の連続への対処。
    text_data = text_data.replace("イイ", "イi").replace("ウウ","ウu")
    text_data = text_data.split("イ")
    new_text_data = []
    kakasi.setMode('K', 'a')
    conv = kakasi.getConverter()
    for i in range(len(text_data):
        if len(text_data[i]) > 0:
            if ("e" in conv.do(text_data[i][-1])):
                new_text_data.append(text_data[i] + "e")
            else:
                new_text_data.append(text_data[i] + "i")

    text_data = "".join(new_text_data).split("ウ")
    new_text_data = []
    for i in range(len(text_data):
        if len(text_data[i]) > 0:
            if ("o" in conv.do(text_data[i][-1])):
                new_text_data.append(text_data[i] + "o")
            else:
                new_text_data.append(text_data[i] + "u")

    return "".join(new_text_data)[:text_data_len]

print(expansion(text_data))

まず、データをカタカナへ変換し、「イ、ウ」で分割、直前の文字の母音によって処理を変更する、という方針でやっていたがなかなか苦労した。データの最後が「イ、ウ」の場合や、それ以外の時は「iu」が残る。引数のデータと長さが変わらないようにすることで対処したが、printしてみると「i」が最後に残っていた。「イイ、ウウ」という連続出現を想定していなかった。やはり、やってみるとすんなりはいかないものだし、やらないと気付かないことが多い。

今後の方針

(カタカナ変換データ、母音だけ残したデータ、拡張したデータ)それぞれで一致部分をスコア化し、(子音の一致、母音の一致、響きの一致)を捉えようと思う。長音、撥音、促音の一致を見ることは不要と判断した。
つまり、これまでのことを一度まとめてみる。N-gramもスペース分割部分も考慮すべきと思うし、一致部分の見方にも問題有りと思っている。現状最良の方法をまとめ、入力データをなにかしら用意して検証していきたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0