日本語の単語リスト(ローマ字)を作る
こんにちは、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(']');
});
リスト生成後、最後の要素のカンマを手動で削除します。
ご覧下さりありがとうございます。いただいたサポートは図書館への交通費などに使わせていただきます。