見出し画像

日本語の単語リスト(ローマ字)を作る

こんにちは、junkawaです。

パスワード生成PWAアプリで使用する、日本語の単語リストを作りました。

用意

ベースとなる辞書にはmecab-ipadicを使用しました。

$ tar zxf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ wc -l Noun.csv
60477 Noun.csv

Noun.csvで約6万個の単語が含まれています。

このNoun.csvに含まれる単語をローマ字化したリストを作成します。

EUC-JPからUTF-8に変換

$ pkg install iconv
$ iconv -f eucjp -t utf-8 Noun.csv > Noun.utf8.csv

iconvを利用して文字コードをUTF-8に変換します。

単語を抜き出してローマ字化

$ head -n 10 Noun.utf8.csv
仕舞い,1285,1285,5543,名詞,一般,*,*,*,*,仕舞い,シマイ,シマイ
綺,1285,1285,5622,名詞,一般,*,*,*,*,綺,アヤギヌ,アヤギヌ
洋裁,1285,1285,5618,名詞,一般,*,*,*,*,洋裁,ヨウサイ,ヨーサイ
組打ち,1285,1285,5622,名詞,一般,*,*,*,*,組打ち,クミウチ,クミウチ
畿内,1285,1285,5770,名詞,一般,*,*,*,*,畿内,キナイ,キナイ
明き家,1285,1285,5402,名詞,一般,*,*,*,*,明き家,アキヤ,アキヤ
酔,1285,1285,4879,名詞,一般,*,*,*,*,酔,ヨイ,ヨイ
乱臣,1285,1285,5622,名詞,一般,*,*,*,*,乱臣,ランシン,ランシン
シルバー,1285,1285,2925,名詞,一般,*,*,*,*,シルバー,シルバー,シルバー
放課後,1285,1285,5494,名詞,一般,*,*,*,*,放課後,ホウカゴ,ホーカゴ

カンマで区切られた12番目のカタカナ (シマイ、アヤギヌ、ヨウサイ、・・・)を抜き出し、ローマ字化します。

$ emacs convert.js

convert.js

const fs = require('fs');
const readline = require('readline');

const toRoman = ( () => {

    const roman = {

        '1':'1', '2':'2', '3':'3', '4':'4', '5':'5', '6':'6', '7':'7', '8':'8', '9':'9', '0':'0',
        '!':'!', '”':'"', '#':'#', '$':'$', '%':'%', '&':'&', '’':"'", '(':'(', ')':')', '=':'=',
        '~':'~', '|':'|', '@':'@', '‘':'`', '+':'+', '*':'*', ';':";", ':':':', '<':'<', '>':'>',
        '、':',', '。':'.', '/':'/', '?':'?', '_':'_', '・':'・', '「':'[', '」':']', '{':'{', '}':'}',
        '¥':'\\', '^':'^',

        'ファ':'fa', 'フィ':'fi', 'フェ':'fe', 'フォ':'fo',

        'キャ':'kya', 'キュ':'kyu', 'キョ':'kyo',
        'シャ':'sha', 'シュ':'shu', 'ショ':'sho',
        'チャ':'tya', 'チュ':'tyu', 'チョ':'tyo',
        'ニャ':'nya', 'ニュ':'nyu', 'ニョ':'nyo',
        'ヒャ':'hya', 'ヒュ':'hyu', 'ヒョ':'hyo',
        'ミャ':'mya', 'ミュ':'myu', 'ミョ':'myo',
        'リャ':'rya', 'リュ':'ryu', 'リョ':'ryo',

        'フャ':'fya', 'フュ':'fyu', 'フョ':'fyo',
        'ピャ':'pya', 'ピュ':'pyu', 'ピョ':'pyo',
        'ビャ':'bya', 'ビュ':'byu', 'ビョ':'byo',
        'ヂャ':'dya', 'ヂュ':'dyu', 'ヂョ':'dyo',
        'ジャ':'ja',  'ジュ':'ju',  'ジョ':'jo',
        'ギャ':'gya', 'ギュ':'gyu', 'ギョ':'gyo',

        'パ':'pa', 'ピ':'pi', 'プ':'pu', 'ペ':'pe', 'ポ':'po',
        'バ':'ba', 'ビ':'bi', 'ブ':'bu', 'ベ':'be', 'ボ':'bo',
        'ダ':'da', 'ヂ':'di', 'ヅ':'du', 'デ':'de', 'ド':'do',
        'ザ':'za', 'ジ':'zi', 'ズ':'zu', 'ゼ':'ze', 'ゾ':'zo',
        'ガ':'ga', 'ギ':'gi', 'グ':'gu', 'ゲ':'ge', 'ゴ':'go',

        'ラ':'ra', 'リ':'ri', 'ル':'ru', 'レ':'re', 'ロ':'ro',
        'ヤ':'ya',            'ユ':'yu',            'ヨ':'yo',
        'マ':'ma', 'ミ':'mi', 'ム':'mu', 'メ':'me', 'モ':'mo',
        'ハ':'ha', 'ヒ':'hi', 'フ':'hu', 'ヘ':'he', 'ホ':'ho',
        'ナ':'na', 'ニ':'ni', 'ヌ':'nu', 'ネ':'ne', 'ノ':'no',
        'タ':'ta', 'チ':'ti', 'ツ':'tu', 'テ':'te', 'ト':'to',
        'サ':'sa', 'シ':'si', 'ス':'su', 'セ':'se', 'ソ':'so',
        'カ':'ka', 'キ':'ki', 'ク':'ku', 'ケ':'ke', 'コ':'ko',
        'ア':'a', 'イ':'i', 'ウ':'u', 'エ':'e', 'オ':'o',
        'ァ':'la', 'ィ':'li', 'ゥ':'lu', 'ェ':'le', 'ォ':'lo',
        //'ワ':'wa', 'ウィ':'wi', 'ウ':'wu', 'ウェ':'we', 'ヲ':'wo',
        'ワ':'wa', 'ウィ':'wi', 'ウェ':'we', 'ヲ':'wo',

        'ヶ':'ke', 'ヵ':'ka',        'ン':'n',  'ー':'-', ' ':' '

    };
    const reg_tu  = /ッ([bcdfghijklmnopqrstuvwyz])/gm;
    const reg_xtu = /ッ/gm;

    return ( str ) => {
        let pnt = 0;
        const max = str.length;
        let s, r;
        let txt = '';

        while( pnt <= max ) {
            if( r = roman[ str.substring( pnt, pnt + 2 ) ] ) {
                txt += r;
                pnt += 2;
            } else {
                txt += ( r = roman[ s = str.substring( pnt, pnt + 1 ) ] ) ? r: s;
                pnt += 1;
            }
        }
        txt = txt.replace( reg_tu, '$1$1' );
        txt = txt.replace( reg_xtu, 'xtu' );
        return txt;
    };
})();

const stream = fs.createReadStream("./Noun.utf8.csv", "utf8");

const reader = readline.createInterface({ input: stream });
reader.on('line', (data) => {
    const kana = data.split(',')[11];
    const roma = toRoman(kana);
    console.log(roma);
});

一番下の data.split(',')[11]でカタカナ単語を取り出し、toRoman()でローマ字に変換しています。

参考URL

結果

$ node convert.js > noun

convert.js を実行して単語リストnounを生成します。

$ head -n 10 noun
simai
ayaginu
yousai
kumiuti
kinai
akiya
yoi
ransin
siruba-
houkago

単語がローマ字化されているのが分かります。

補足

JSON形式のリストを生成するために、convert.jsの一部を修正。

console.log('[');
reader.on('line', (data) => {
    const kana = data.split(',')[11];
    const roma = toRoman(kana);
    console.log('"'+roma+'",');
});
reader.on('close', () => {
    console.log(']');
});

リスト生成後、最後の要素のカンマを手動で削除します。

ご覧下さりありがとうございます。いただいたサポートは図書館への交通費などに使わせていただきます。