u++の備忘録

言語処理100本ノック 2020「31. 動詞」

問題文 nlp100.github.io 問題の概要 「30. 形態素解析結果の読み込み」で作成したデータ構造から「x['pos'] == '動詞'」の「surface」部分を取り出します。 def parseMecab(block): res = [] for line in block.split('\n'): if line == '': return res (su…

言語処理100本ノック 2020「30. 形態素解析結果の読み込み」

問題文 nlp100.github.io 問題の概要 本章では、MeCabを用いて形態素解析した結果を読み込んでいきます。手始めに、以下コマンドでファイルに対して形態素解析を実行しましょう。 mecab < ch04/neko.txt > ch04/neko.txt.mecab あとは、読み込むファイルの形…

令和大相撲の暫定王者は誰だ?USWC(非公式相撲世界王者)とともに振り返る

次の記事に影響を受けて、大相撲版をやってみようと思い立ちました。 note.com 概要は次の通りです。 平成最後の「平成31年春場所」で優勝した白鵬を、令和開始時の「王者」とする 令和になってからの取り組みで「王者」に勝利した力士を次の「王者」とする …

「Sports Analyst Meetup #7」を初のオンラインで開催しました #spoana

「Sports Analyst Meetup #7」を、4月16日に開催しました。昨今の情勢を受け、7回目にして初めてのオンライン開催となりました。250名以上の申し込みがあり、だいたい170人程度にご参加いただきました。 spoana.connpass.com 発表内容 今回は4名の方にLTをし…

言語処理100本ノック 2020「29. 国旗画像のURLを取得する」

問題文 nlp100.github.io 問題の概要 「28. MediaWikiマークアップの除去」を改変します。国旗画像のURLを取得を除去する関数「getUrl()」を定義し適用します。第3章は2015年版と同様なので、先駆者のコード*1を流用しつつ実装しました。 import re import r…

言語処理100本ノック 2020「28. MediaWikiマークアップの除去」

問題文 nlp100.github.io 問題の概要 「27. 内部リンクの除去」を改変します。MediaWikiマークアップを除去する関数「removeMk()」を定義し適用します。第3章は2015年版と同様なので、先駆者のコード*1を流用しつつ実装しました。 import re import pandas a…

言語処理100本ノック 2020「27. 内部リンクの除去」

問題文 nlp100.github.io 問題の概要 「26. 強調マークアップの除去」を改変します。内部リンクを除去する関数「remove_inner_links()」を定義し適用します。第3章は2015年版と同様なので、先駆者のコード*1を流用しつつ実装しました。 import re import pan…

言語処理100本ノック 2020「26. 強調マークアップの除去」

問題文 nlp100.github.io 問題の概要 「25. テンプレートの抽出」を改変します。強調マークアップを除去する関数「remove_stress()」を定義し適用します。第3章は2015年版と同様なので、先駆者のコード*1を流用しつつ実装しました。 import re import pandas…

言語処理100本ノック 2020「25. テンプレートの抽出」

問題文 nlp100.github.io 問題の概要 この辺りから、正規表現芸人っぽくなってきます。第3章は2015年版と同様なので、先駆者のコード*1を流用しつつ実装しました。 import re import pandas as pd df = pd.read_json('ch03/jawiki-country.json.gz', lines=T…

言語処理100本ノック 2020「24. ファイル参照の抽出」

問題文 nlp100.github.io 問題の概要 正規表現を用いて、参照されているメディアファイルに該当する箇所を取り出します。 import re import pandas as pd df = pd.read_json('ch03/jawiki-country.json.gz', lines=True) ukText = df.query('title=="イギリ…

言語処理100本ノック 2020「23. セクション構造」

問題文 nlp100.github.io 問題の概要 正規表現を用いて、セクションに該当する箇所を取り出します。 import re import pandas as pd df = pd.read_json('ch03/jawiki-country.json.gz', lines=True) ukText = df.query('title=="イギリス"')['text'].values[…

言語処理100本ノック 2020「22. カテゴリ名の抽出」

問題文 nlp100.github.io 問題の概要 「21. カテゴリ名を含む行を抽出」で取り出した行から、余計な部分を「replace()」で削除します。 import pandas as pd df = pd.read_json('ch03/jawiki-country.json.gz', lines=True) ukText = df.query('title=="イギ…

言語処理100本ノック 2020「21. カテゴリ名を含む行を抽出」

問題文 nlp100.github.io 問題の概要 「20. JSONデータの読み込み」で取り出したイギリスに関する文章を扱います。 記事中でカテゴリ名を宣言している行は「Category:」を含みます。文章を「split()」を用いて改行で分割し、「filter」を用いて「Category:」…

言語処理100本ノック 2020「20. JSONデータの読み込み」

問題文 nlp100.github.io 問題の概要 pandasでデータを読み込み「title」が「イギリス」のデータを抽出します。 import pandas as pd df = pd.read_json('ch03/jawiki-country.json.gz', lines=True) ukText = df.query('title=="イギリス"')['text'].values…

言語処理100本ノック 2020「19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる」

問題文 nlp100.github.io 問題の概要 pandasでデータを読み込み「value_counts()」で出現頻度の高い順に集計します。 import pandas as pd df = pd.read_csv('ch02/popular-names.txt', sep='\t', header=None) print(df[0].value_counts())

言語処理100本ノック 2020「18. 各行を3コラム目の数値の降順にソート」

問題文 nlp100.github.io 問題の概要 pandasでデータを読み込み「sort_values(カラム名)」でデータをソートします。「ascending=False」のオプションを指定することで、並びを昇順ではなく降順にしています。 import pandas as pd df = pd.read_csv('ch02/po…

言語処理100本ノック 2020「17. 1列目の文字列の異なり」

問題文 nlp100.github.io 問題の概要 pandasでデータを読み込み「unique()」で、異なる文字列の集合を取得します。 import pandas as pd df = pd.read_csv('ch02/popular-names.txt', sep='\t', header=None) print(df[0].unique())

言語処理100本ノック 2020「16. ファイルをN分割する」

問題文 nlp100.github.io 問題の概要 ①コマンドライン引数でNを受け取る②pandasでデータを読み込み行数を取得する③分割後の各ファイルの行数を計算する④各ファイルを保存するーーの4段階で処理します。 ①は「14. 先頭からN行を出力」で解説済み、②は「10. 行…

言語処理100本ノック 2020「15. 末尾のN行を出力」

問題文 nlp100.github.io 問題の概要 「14. 先頭からN行を出力」とほぼ同様です。今回表示するのは上位N件ではなく下位N件なので「head(N)」の代わりに「tail(N)」を使います。 import sys import pandas as pd if len(sys.argv) == 1: print('Set arg n, li…

言語処理100本ノック 2020「14. 先頭からN行を出力」

問題文 nlp100.github.io 問題の概要 ①コマンドライン引数でNを受け取る②pandasでデータを読み込み上位N件を表示するーーの2段階で処理します。 Pythonにて実行時に「python (ファイル名) hoge」として与えたコマンドライン引数は「sys.argv」にリストとし…

言語処理100本ノック 2020「13. col1.txtとcol2.txtをマージ」

問題文 nlp100.github.io 問題の概要 pandasでデータを読み込み「pd.concat(リスト)」でリスト内のデータを結合します。「axis=1」で結合方向を指定しています。 import pandas as pd c1 = pd.read_csv('ch02/col1.txt', header=None) c2 = pd.read_csv('ch0…

言語処理100本ノック 2020「12. 1列目をcol1.txtに,2列目をcol2.txtに保存」

問題文 nlp100.github.io 問題の概要 pandasでデータを読み込み、列ごとにファイルに吐き出します。 import pandas as pd df = pd.read_csv('ch02/popular-names.txt', sep='\t', header=None) df[0].to_csv('ch02/col1.txt', index=False, header=None) df[…

言語処理100本ノック 2020「11. タブをスペースに置換」

問題文 nlp100.github.io 問題の概要 pandasでデータを読み込み、保存時に区切り文字としてタブではなく半角スペースを指定します。 import pandas as pd df = pd.read_csv('ch02/popular-names.txt', sep='\t', header=None) df.to_csv('ch02/ans11.txt', s…

言語処理100本ノック 2020「10. 行数のカウント」

問題文 nlp100.github.io 問題の概要 第2章では、表形式のデータを扱います。筆者がKaggleなどで使い慣れているpandas*1を利用します。 pandasでデータを読み込み「len()」で行数を取得します。読み込み時にはファイル形式に応じて「sep='\t', header=None」…

言語処理100本ノック 2020「09. Typoglycemia」

問題文 nlp100.github.io 問題の概要 少し処理が煩雑ですが、大体は今まで扱った記法が利用できます。 ランダムに並び替える部分は「random.shuffle()」や「random.sample()」が選択肢となります*1。 import random def shuffleWord(word): if len(word) <= …

言語処理100本ノック 2020「08. 暗号文」

問題文 nlp100.github.io 問題の概要 文字の文字コードを得るには「ord()」を使います。逆に文字コードから文字を得る場合は「chr()」です。「print(ord(a), ord(z))」として、英小文字が取りうる文字コードの範囲を調べ、条件分岐に盛り込みましょう。 「''…

言語処理100本ノック 2020「07. テンプレートによる文生成」

問題文 nlp100.github.io 問題の概要 Pythonでは、いくつかの方法で文字列に変数を埋め込めます。3.6以降のバージョンで利用可能になった「f文字列」*1が便利です。 def genText(x, y, z): return f'{x}時の{y}は{z}' x = 12 y = '気温' z = 22.4 print(genT…

言語処理100本ノック 2020「06. 集合」

問題文 nlp100.github.io 問題の概要 bi-gramの作成には「05. n-gram」のソースコードを流用します。 Pythonでは「set()」を用いることで、集合の概念を扱えます。 def n_gram(target, n): return [target[idx:idx + n] for idx in range(len(target) - n + …

言語処理100本ノック 2020「05. n-gram」

問題文 nlp100.github.io 問題の概要 n-gram*1を作る関数を作成します。 def n_gram(target, n): return [target[idx:idx + n] for idx in range(len(target) - n + 1)] text = 'I am an NLPer' for i in range(1, 4): print(n_gram(text, i)) print(n_gram(…

言語処理100本ノック 2020「04. 元素記号」

問題文 nlp100.github.io 問題の概要 ①文を単語に分割する②各単語の先頭の1文字もしくは2文字を取り出すーーの2段階で処理します。②の処理では、条件分岐が必要です。 ①の処理は「03. 円周率」と同様です。 ②の条件分岐に当たって、単語の順番情報が必要なた…