はじめに
言語処理100本ノックは東北大学が公開している自然言語処理の問題集です。
とても良質なコンテンツで企業の研修や勉強会で使われています。
そんな言語処理100本ノックが2020年に改定されてました。昨今の状況を鑑みて、深層ニューラルネットワークに関する問題が追加されました。(その他にも細かい変更があります)
この記事では、言語処理100本ノック2020にPythonで取り組んでいきます。
他にも色々な解法があると思うので、一つの解答例としてご活用ください!
全100問の解説に戻る
10. 行数のカウント
行数をカウントせよ.確認にはwcコマンドを用いよ.
この章はPandasを使ってみようと思います。
1 | import pandas as pd |
pandasで表形式のデータを読み込む際はread_csv
を用います。read_csv
はdelimiter
を適切に指定することで、csvファイル以外にも使えます。また、header=None
をつけないとファイルの一行目がヘッダーとして読み込まれてしまうので注意しましょう。
1 | wc popular-names.txt |
11. タブをスペースに置換
タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.
1 | import pandas as pd |
保存する際はto_csv
を使います。その際にsep
で区切り文字を指定します。保存する際に、DataFrame
のヘッダーやインデックスが出力されないように注意します。
1 | sed 's/\t/ /g' popular-names.txt > replaced.txt |
12. 1列目をcol1.txtに,2列目をcol2.txtに保存
各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.
1 | import pandas as pd |
iloc
を使うことで行や列を指定して取得することができます。
1 | cut -f 1 popular-names.txt > col1.txt |
13. col1.txtとcol2.txtをマージ
12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.
1 | import pandas as pd |
concat
で結合ができます。横方向に連結したいのでaxis=1
を指定します。
1 | paste col1.txt col2.txt > col1_2.txt |
14. 先頭からN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.
1 | import pandas as pd |
head
で指定した行数を確認することができます。
1 | head -n 5 popular-names.txt |
15. 末尾のN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.
1 | import pandas as pd |
Pandas
で先頭から取得する場合はhead
、末尾から取得する場合はtail
を使います。UNIXコマンドと同様ですね。
1 | tail -n 5 popular-names.txt |
16. ファイルをN分割する
自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.
1 | N = 3 |
Python
で切り上げ除算をする際は以下のように実装すると良いです。
1 | step = - (-len(df) // N) |
1 | split -n 3 popuar-names.txt |
17. 1列目の文字列の異なり
1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはcut, sort, uniqコマンドを用いよ.
1 | import pandas as pd |
unique
を使うことで集合を求めることができます。
1 | cut -f 1 popular-names.txt | sort | uniq |
uniq
はソートされていることを前提としています。そのため、前処理としてsort
が必要です。
18. 各行を3コラム目の数値の降順にソート
各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).
1 | import pandas as pd |
sort_values
でソートできます。
1 | cut -f 3 popular-names.txt | sort -n -r |
sort
はデフォルトでは文字列としてソートをするため、-n
オプションで数値としてソートする必要があります。-r
オプションで降順ソートになります。
19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.
1 | import pandas as pd |
value_counts
を用いることで出現頻度の高い順に並べ替えることができます。その後の処理はUNIXコマンドと結果を合わせるためにname
をソートしています。
1 | cut -f 1 popular-names.txt | sort | uniq -c | sort -n -r |
uniq
は-c
オプションでカウントすることができます。
最後に
全100問の解説に戻る
記事情報
- 投稿日:2020年5月9日
- 最終更新日:2020年5月9日