中国語学習×グラフデータベース(11) - 類語を結びつける

ひとまず、単語(キーワード)の一部と短文をつなげるところまで来たので、今回は類義語どうしをつないでみる。

ネタ元はこれ

CD付 どう違う?例文で覚える中国語類義語1000

CD付 どう違う?例文で覚える中国語類義語1000

  • 作者: 于鵬,平山邦彦,川田直樹
  • 出版社/メーカー: アスク出版
  • 発売日: 2010/04/28
  • メディア: 単行本(ソフトカバー)
  • クリック: 1回
  • この商品を含むブログを見る

正確には、これの中国語版(当時58元)。ただし、日本で手に入れるのであれば、2800円払って日本語版の方が良いと思う。例文のCDが付いているので、この方がお買い得なはず。日本語タイトルからは分かりづらいけど、中国語を学ぶ留学生が躓きそうな500組の単語の使い分けについて例文付きで解説している。ちなみに北京語言大学出版から、辞典形式で1700組取り上げた本もあるし、日本で出版されたこんな本もある。

中国語類義語辞典

中国語類義語辞典

今のところお試しの意味合いもあるので、500組程度で十分かなと思い、500組の単語をタブ区切りファイルで作ってみた。同じ行にある単語は類義語の組み合わせというイメージだ。カンマ区切りのCSVではなくタブ区切りになったのは、デフォルトでSHIFT-JISにしてしまうEXCELのせいだと声高に言っておくw。

タブ区切りファイルを読み込む

取り込み用のコードをPythonで書くとこんな感じになった。本当は500組一気に取り込むつもりだったが、とりあえず先頭の259組を取り込んでみた。

combinations = []
with open('aton_sample.csv', encoding='utf-8') as f:
    for row in f.readlines():
        newset = [word for word in row[:-1].split('\t') if word]
        combinations.append(newset)
print(len(combinations))
259

今考えると、combinationsというListの名称は別の名前にするべきだったかなと思うが、Python的なポイントはそこではなく、for文の次にあるnewsetをリスト内包表記で取得している部分になる。

row[:-1]は行末の改行コードを取り除き、split('\t')は、行データをタブで分割している。ただし、行によって含まれる単語数が違う関係で、空っぽのデータが取得された場合はそれを無視してListを作るというイメージだ。そのListをさらにcombinationsというListにappend()しているという流れだ。

Keywordはすでに存在しているかのチェック

単語については、HSKの綱領に載っているもの、類義語の組み合わせについては別の本から持ってきているので、当然のことながら単語として登録されていない類義語が登場してくる可能性があるので、念のためチェックしてみた。

unknown_words = []
known_words = []
for wordset in combinations:
    ws = graph.cypher.execute("MATCH (w:Word) WHERE w.keyword in {0} RETURN w.keyword".format(str(wordset)))
    found_words = []
    for record in ws:
        found_words.append(record['w.keyword'])
        known_words.append(record['w.keyword'])
    for word in wordset:
        if word not in found_words:
            unknown_words.append(word)
known_words = set(known_words)   # To be a SET
unknown_words = set(unknown_words) # To be a SET
print("Found {0} known words".format(len(known_words)))
print("Found {0} unknown words".format(len(unknown_words)))||<
>||
Found 521 known words
Found 89 unknown words

これは、1回失敗したのを踏まえてロジックを調整したものになる。具体的には、今回登録した類義語の組み合わせの中に、単語として登録されていないキーワードが複数回登場した場合を考慮するために、生成されたunknown_wordsの中身をsetとして読み込み直して重複を排除している。後で取り上げるつもりだが、誤って重複して登録してしまった場合のNodeの削除が結構面倒くさい。

次回は、未登録単語の登録から類義語間のRelationshipを設定するところまで行こうと思う。


(つづく)

最初の本は、Cypherのリファレンス的にも使えたりして、日本語では一番充実していると思ってる。

グラフ型データベース入門 - Neo4jを使う

グラフ型データベース入門 - Neo4jを使う

グラフデータベース ―Neo4jによるグラフデータモデルとグラフデータベース入門

グラフデータベース ―Neo4jによるグラフデータモデルとグラフデータベース入門

A Programmatic Introduction to Neo4j

A Programmatic Introduction to Neo4j