BLOG

シンラボメンバーのあれこれ

  1. HOME
  2. ブログ
  3. 代表通信
  4. 6/14 代表通信~「Building Machine Learning Powered Applications」再び

6/14 代表通信~「Building Machine Learning Powered Applications」再び

こんばんは。代表の草場です。

Building Machine Learning Powered Applications: Going from Idea to Product 1st Edition」、再びです。4章で詰まっていました。StackExchangeのwriteコミュニティーから、質問と回答(XMLファイル)を取り出してきて、これをベースのデータとしてモデルを構築していくのですが、そのデータの取得、前処理部分でウンウンうなっていました。

まずはこのDataDumpからXMLデータを取得してきてrawタグを取り出してきます。XMLファイルを扱ったことがなく、まず詰まりました。CyberTechこんばんは。代表の草場です。

 

「Building Machine Learning Powered Applications: Going from Idea to Product 1st Edition」、再びです。4章で詰まっていました。StackExchangeのwriteコミュニティーから、質問と回答(XMLファイル)を取り出してきて、これをベースのデータとしてモデルを構築していくのですが、そのデータの取得、前処理部分でウンウンうなっていました。Stack Exchangeは、哲学やゲームなどのテーマに焦点を当てた質問応答サイトのネットワークです。DataDumpには多くのアーカイブがあり、Stack Exchangeネットワーク内の各ウェブサイトごとに1つずつあります。

まずはこのDataDumpからXMLデータを取得してきてrowタグを取り出してきます。XMLファイルを扱ったことがなく、まず詰まりました。XMLファイルの関してはCyberTechさんのこの記事を読み、そしてPython公式しのやまさんのQiitaの記事を読んでPythonでのXMLファイルの使い方のお勉強。わかったようなわからんようなです。xml.etree.ElementTreeがカギなのね。使ったXMLファイルは以下です。

rowタグ部分に、必要な情報がつまっているので、

all_rows = [row.attrib for row in root.findall(“row”)]

にて、rowタグ取り出し。以下のような情報が取り出されます。

all_rows[1] {‘AcceptedAnswerId’: ’16’, ‘AnswerCount’: ‘7’, ‘Body’: ‘<p>What kind of story is better suited for each point of view? Are there advantages or disadvantages inherent to them?</p>\n\n<p>For example, writing in the first person you are always <em>following</em> a character, while in the third person you can “jump” between story lines.</p>\n’, ‘CommentCount’: ‘0’, ‘ContentLicense’: ‘CC BY-SA 3.0’, ‘CreationDate’: ‘2010-11-18T20:42:31.513’, ‘FavoriteCount’: ‘5’, ‘Id’: ‘2’, ‘LastActivityDate’: ‘2018-04-29T19:35:55.850’, ‘LastEditDate’: ‘2018-04-29T19:35:55.850’, ‘LastEditorDisplayName’: ‘user29032’, ‘OwnerUserId’: ‘8’, ‘PostTypeId’: ‘1’, ‘Score’: ’23’, ‘Tags’: ‘<fiction><grammatical-person><third-person>’, ‘Title’: ‘What is the difference between writing in the first and the third person?’, ‘ViewCount’: ‘9339’}

BeautifulSoupを使ってBody部分をparseします。

最後に、

df = pd.DataFrame.from_dict(all_rows)
にて、DataFrame形式へ。と、ここで、本に書いてあるデータと実際にサイトから取ってきたデータが微妙に違うことに気付きました。本出版時から時間がたっているので当たり前か。
ということで、この本の公式GitHubにあるデータを活用します。カラムには、
Index([‘Unnamed: 0’, ‘AcceptedAnswerId’, ‘AnswerCount’, ‘Body’, ‘ClosedDate’, ‘CommentCount’, ‘CommunityOwnedDate’, ‘CreationDate’, ‘FavoriteCount’, ‘Id’, ‘LastActivityDate’, ‘LastEditDate’, ‘LastEditorDisplayName’, ‘LastEditorUserId’, ‘OwnerDisplayName’, ‘OwnerUserId’, ‘ParentId’, ‘PostTypeId’, ‘Score’, ‘Tags’, ‘Title’, ‘ViewCount’, ‘body_text’], dtype=’object’)
が含まれています。質問が受け入れられたか、回答の数、実際の質問などなど。

どのタイプの質問が高得点を獲得しているかを確認します。質問のスコアを真のラベルである質問の品質の弱いラベルとして使用したいからです。まず、問題を関連する回答にマッチさせます。次のコードは、受け入れられた回答を持つすべての問題を選択し、回答のテキストと結合します。最初の数行を見て、回答が質問と一致していることを確認することができます。これにより、テキストに素早く目を通し、その品質を判断することもできます。

今日はここまで。

 

関連記事