PSSL に新卒入社しました神﨑です。
6月から9月までの間、新卒研修の一環としてシステムのチーム開発を行っていました。作成したのは、旬の食材を用いたレシピサイトです。
私も含め計5名の新卒による開発体制で、個人での担当分野としては主に挿入するデータの加工等を行っていました。今回は、知識とデータの前処理等でとても苦労したので、書き残しておこうと思います。
レシピ検索+買い物リスト作成アプリを作成しました。
自分の担当部分であるデータの前処理の作業は大部分は記事[1]を参考にしましたが、一部自分たちのシステムに合わせて改変しました。
今回のブログの内容では、楽天レシピから取得するデータのうち、材料名をカテゴリ化するために表記ゆれ等を統一した際に苦労した点等をまとめています。
取得したレシピデータ(料理に必要な材料)は、以下のように表記ルールなどが定まっていないため、前処理を行いました。
例えば、以下のように☆や■などの記号や()などで補足説明が追加されているものなど形式が様々なものがありました。
#取得したレシピデータのうち、材料名の一部抜粋
['なす', 'オクラ', '大根', 'めんつゆ(ストレート)', 'サラダ油']
['茄子', 'ごま油', '☆生姜のすりおろし', '☆めんつゆ(3倍濃縮)', '☆水', 'ねぎ(小ねぎ等)']
['ナス', 'サラダ油', 'ポン酢', '花かつお']
まず、材料名の前後にある記号や括弧を消去しました。
例 ☆めんつゆ(3倍濃縮) → めんつゆ
コードは、前述したように[1]の記事を参考にPythonで実装しました。
変更点として、正規表現で記号や空白、括弧、括弧内の文字をまとめて削除パターンとして指定してデータの変換を行いました。
delete_pattern = r'[\u25A0-\u25FF\u2600-\u26FF\uFF0A\u002A\u30FB\u3007]|' \
r'\([a-zA-Z]\)|<[A-Z]>|\b[A-Z]\)|\b[A-Z]\.|\b[A-Z] |\([A-Z]'
削除した結果、以下のようになりました。
懸念事項として括弧内にレシピの材料についての補足などが含まれる場合もありますが、今回は目をつぶります。
#取得したレシピデータのうち、材料名の一部抜粋
['なす', 'オクラ', '大根', 'めんつゆ', 'サラダ油']
['茄子', 'ごま油', '生姜のすりおろし', 'めんつゆ', '水', 'ねぎ']
['ナス', 'サラダ油', 'ポン酢', '花かつお']
上記のレシピデータの出力結果から、材料名の一つである「なす」がなす、茄子、ナスなどの表記ゆれを確認したため、材料名について辞書を作成して表記を統一しました。
辞書の作成には、web上に公開されている食材図鑑等を参考に作成しました。
#辞書の抜粋
#見出し語、変換する単語
アスパラガス,アスパラガス,アスパラ,あすぱらがす,あすぱら
さやいんげん,さやいんげん,インゲン,サヤインゲン,いんげん,モロッコいんげん,モロッコインゲン,モロッコいんげん,モロッコインゲン
うど,うど,ウド,うど
えだまめ,えだまめ,枝豆,エダマメ
なす,なす,茄子,ナス,なすび,ナスビ,加茂なす,加茂ナス,加茂茄子,賀茂茄子,白茄子,白なす,白ナス,水ナス,水なす,米なす,米ナス,米茄子
変換した結果は以下のようになります。
#取得したレシピデータのうち、材料名の一部抜粋
['なす', 'オクラ', '大根', 'めんつゆ', '油']
['なす', 'ごま油', '生姜', 'めんつゆ', '水', 'ねぎ']
['なす', '油', 'ポン酢', '鰹節']
今回は、データの前処理に関してはデータ数を絞って最低限の実装に設定したおかげで、力業で変換しても事前に予定していた工数を大幅に超過することはありませんでしたが、工夫できた点は多々あったと考えています。
例えば、AIに判別させて表記ゆれを統一させたり、大学で少し触った自然言語処理などを使ってみるなど、アナログな手段ではない方法を採用したかったが、時間の見積もりが甘かったため挑戦できませんでした。
もし次回があるのならば、新しい技術を積極的に取り入れていきたいです。
[1]Python 初学者が楽天APIを使って買い物リスト作成アプリを作った(データ加工編)
https://qiita.com/yuuauuy1/items/5bb4a53ab15bde354297