テキスト分析におけるデータ サイエンスの応用: 中国語と英語の NLP (パート 1)

ブログ投稿「流行後の時代、データ サイエンスが観光産業のサービス品質向上に貢献」では、トリップアドバイザーのテキスト分析プロジェクトの背景とソリューションを紹介し、最終的な分析結果を示しました。次に、中国語と英語の NLP に興味のある読者のために、データ収集、データ保存、データ クリーニング、データ モデリングのステップに含まれる原則とコード実装について詳しく説明します。スペースの制限のため、最初のパートではデータ収集、データ保存、データ クリーニングの 3 つのステップに焦点を当て、2 番目のパートではデータ モデリングの完全なプロセスについて説明します。

データ収集

1. クローラー解析

Web スクレイピングは、インターネットからデータを取得する方法の 1 つです。Web スクレイピングに Python を使用する開発者にとって、より主流のツールは次のとおりです。

美しいスープ

Beautiful Soup は、いくつかのツールの中で最もアクセスしやすい Web スクレイピング ライブラリであり、開発者が HTML または XML 形式のファイルからデータを迅速に取得するのに役立ちます。このプロセスでは、Beautiful Soup はそのようなファイルのデータ構造をある程度読み取り、これに基づいてデータ コンテンツの検索と取得に関連する多くの方程式を提供します。さらに、Beautiful Soup の包括的でわかりやすいドキュメントと活発なコミュニティにより、開発者はすぐに使い始めることができるだけでなく、すぐにマスターして独自のアプリケーションで柔軟に使用することもできます。

ただし、これらの動作特性により、Beautiful Soup には他のライブラリと比較して明らかな欠陥もあります。まず第一に、Beautiful Soup は他の Python ライブラリ (Requests など) に依存してオブジェクト サーバーにリクエストを送信し、Web ページ コンテンツのクロールを実現する必要があります。また、他の Python パーサー (html.parser など) に依存して解析する必要もあります。キャプチャされたコンテンツ。次に、Beautiful Soup は後でコンテンツを見つけるために、事前にファイル全体のデータ フレームを読み取って理解する必要があるため、ファイルの読み取り速度の観点から見ると、Beautiful Soup は比較的遅いです。多くの Web ページ情報を取得するプロセスでは、必要な情報はごく一部に過ぎないため、このような読み取りステップは必要ありません。

スクレイピー

Scrapy は非常に人気のあるオープンソースの Web スクレイピング ライブラリの 1 つで、その最大の特徴は高速なクローリング速度であり、Twisted 非同期ネットワーク フレームワークに基づいているため、ユーザーから送信されたリクエストはノンブロッキングでサーバーに送信されます。このメカニズムはブロックするよりも優れており、より柔軟でリソース効率が高くなります。したがって、Scrapy には次の機能があります。

  • HTML タイプの Web ページの場合、XPath または CSS を使用してデータ取得のサポートを表現します。
  • Python に限らず、さまざまな環境で実行できます。Linux、Windows、Mac およびその他のシステムでは Scrapy ライブラリを使用できます。
  • 強力な拡張性
  • スピードと効率の向上
  • 必要なメモリと CPU リソースが少なくて済みます

Scrapy は強力な Web スクレイピング ライブラリであり、関連するコミュニティ サポートもありますが、ぎこちなくて難しいドキュメントが多くの開発者の意欲をそぎ、使い始めるのを困難にしています。

セレン

Selenium の起源は Web アプリケーションをテストするために開発されたもので、他のライブラリとは非常に異なる方法で Web コンテンツを取得します。Selenium は、自動化された Web ページ操作を通じて Web ページから返された結果を取得する構造設計になっており、Java との互換性が高く、AJAX および PJAX リクエストに簡単に応答できます。Selenium は Beautiful Soup と同様に比較的簡単に始めることができますが、他のライブラリと比較すると、情報を取得するためのテキスト入力や、ユーザーがプロセスに参加する必要があるポップアップ ページなどを処理できることが最大の利点です。 Web クローリングの影響で、ブラウザにアクションが介入する場合があります。このような機能により、開発者は Web クローリングの手順をより柔軟に行うことができるため、Selenium は最も人気のある Web クローリング ライブラリの 1 つになりました。

景勝地のレビューを取得するプロセスでは、検索バーの入力、ポップアップ ページ、ページめくりを処理する必要があるため、このプロジェクトでは、Selenium を使用して Web ページのテキスト データをキャプチャします。

2. Web ページのデータと構造の事前理解

各 Web サイトは、開発の過程で独自の構造とロジックを持っています。同じ HTML ベースの Web ページでも、UI が同じであっても、その背後にある階層関係はまったく異なる場合があります。これは、Web クローリングのロジックを明確にするためには、対象となる Web ページの特性を理解するだけでなく、将来の同じ URL の更新や、同じ種類の他のプラットフォーム上の Web ページの特性も理解し、分類する必要があることを意味します。類似した部分を比較することで、比較的柔軟なロジックを取得します。

トリップアドバイザーの国際版 Web サイトの Web クローリング手順は、中国版 Web サイトの手順と似ています。ここでは、www.tripadvisor.cn を例として、ホームページから景勝地のレビューに至るまでの一般的な手順を観察します。

ステップ 1: ホームページに入り、検索バーに検索したいアトラクションの名前を入力して Enter キーを押します。

ステップ 2: ページが更新され、アトラクションのリストが表示され、目的のアトラクションを選択します

アトラクションの名前を検索した後、図に示すリストで目的のアトラクションをロックする必要があります。この目標を達成するために、ここには 2 つの論理的な重ね合わせが存在します。

  • トリップアドバイザーの検索エンジン自体が観光スポットの名前と検索入力を比較し、独自の内部ロジックを使用して対象となる観光スポットを上位にランク付けします。
  • 結果が表示されたら、州や都市などの情報を使用して対象の観光スポットをフィルタリングできます。

ステップ 3: 対象のアトラクションをクリックすると、新しいページがポップアップします。このページに切り替えて、関連するコメントを探します。

コメント形式の特性上、取得できる情報は以下のとおりです。

  • ユーザー
  • ユーザーの場所
  • スコア
  • レビュータイトル
  • 訪問日
  • トラベルタイプ
  • 詳細レビュー
  • 執筆日

ステップ 4: ページをめくってさらにコメントを表示します

関連 Web ページを取得する過程でブラウザーが実行する必要のあるアクションが多数あることがわかります。これが Selenium を選択する理由です。したがって、Web クローラーはデータ スクレイピングの前に同じ手順を実行します。

Web クローラー プログラムを開発するときに、HTML コード内で必要なコンテンツを見つける非常に便利な方法は、ブラウザーでコンテンツが配置されている領域にマウスを移動し、右クリックして [検査] を選択することです。ブラウザーにポップアップ ウィンドウが表示されます。 Web ページの HTML 要素を検索し、コンテンツに関連するコードを見つけます。このアプローチに基づいて、自動化とデータ スクレイピングに Selenium を使用できます。

上記のコメントを例にとると、HTML 構造内での位置は次のようになります。

5fac8b97e3463cc95e1bd694a28c2528.jpeg

Selenium を使用する場合、要素のカテゴリとクラス名は、関連するコンテンツを見つけたり、さらなる操作を実行したり、関連するテキスト データを取得したりするのに役立ちます。CSS または XPATH という 2 つの配置方法を使用でき、開発者は自分のニーズに応じて選択できます。最終的に、私たちが実行する Web スクレイピング プロセスは、大きく 2 つのステップに分けることができます。

  • ステップ 1: リクエストを送信し、Selenium を使用してブラウザを操作し、指定した景勝地のコメント ページを見つけます。
  • ステップ 2: コメント ページにアクセスしてコメント データを取得する    

3. コメントデータの取得

この部分の関数実装では、最初に次の Python ライブラリをインストールしてインポートする必要があります。

from selenium import webdriver
import chromedriver_binary
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import datetime
import re
import pandas as pd
from utility import print_log_message, read_from_config

このうちユーティリティは、セッションや発生時刻を印刷するための計算式や、ini 設定ファイルからプログラム情報を読み取るための計算式を含む補助モジュールです。ユーティリティの補助方程式は、必要な数のモジュールで繰り返すことができます。

#utility.py
import time
import configparser
def print_log_message(app_name, procedure, message):
   ts = time.localtime()
   print(time.strftime("%Y-%m-%d %H:%M:%S", ts) + " **" + app_name + "** " + procedure + ":", message)
   return
def read_from_config(file_name, section, var):
   config = configparser.ConfigParser()
   config.read(file_name)
   var_value = config.get(section, var)
   return var_value

Web クローリングを開始する前に、Web セッション プロセスを開始する必要があります。

# Initiate web session
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')     
chrome_options.add_argument('--window-size=1920,1080')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-dev-shm-usage')
wd = webdriver.Chrome(ChromeDriverManager().install(),chrome_options=chrome_options)
wd.get(self.web_url)
wd.implicitly_wait(5)
review_results = {}

動作環境が十分なリソースを備えた PC またはインスタンスではないことを考慮して、プログラムに表示要件がないことをコード内で示す必要があります。ChromeDriverManager() は、プログラムが Chrome ドライバーのない環境で必要なドライバー ファイルをダウンロードし、それを Selenium のセッション プロセスに渡すのに役立ちます。

多くの Web ページは Chrome のバージョン、リソース、システム環境、時間に関連していることに注意してください。このプロジェクトで使用されるページは、そのような情報や状況の影響を受けませんが、ブラウザーの表示設定によって制限され、クロールされる内容に影響します。このようなクローリングプログラムを開発する際には、Webページに表示されている情報が実際に取得したデータと一致しているかどうかを十分に確認してください。

トリップアドバイザーのホームページ (https://www.tripadvisor.cn/) に入った後、検索バーに目的の観光スポットの名前を入力して Enter キーを押し、新しいページに入った後、検索エンジンに従ってリスト内の観光スポットを並べ替えます、州、市を見つけてクリックすると、正しい観光スポットのページに移動します。ここでは「外灘」を例に挙げます。

location_name = '外滩' 
city = '上海' 
state = '上海'
# Find search box
wd.find_element(By.CSS_SELECTOR, '.weiIG.Z0.Wh.fRhqZ>div>form>input').click()
# Enter location name
wd.find_element(By.XPATH, '//input[@placeholder="去哪里?"]').send_keys(f'{location_name}')
wd.find_element(By.XPATH, '//input[@placeholder="去哪里?"]').send_keys(Keys.ENTER)
# Find the right location with city + province info
element = wd.find_element(By.XPATH,
                                 f'//*[@class="address-text" and contains(text(), "{city}") and contains(text(), "{state}")]')
element.click()

目的のアトラクションをクリックすると、飛び出す新しいページに切り替わります。アトラクションのレビュー ページに入ると、ページの HTML 構造とコード階層内のレビューの位置に従って必要な情報を取得できます。Selenium が特定の要素を検索するときは、Web ページ フレーム全体で関連情報を検索しますが、他の Web クローリング ライブラリのように特定の部分をロックして、この部分で目的の要素のみを検索することはできません。したがって、1 種類の情報を均一に取得し、不要な情報を削除する必要があります。このプロセスでは、不要なコンテンツがキャプチャされてデータ品質に影響を与えるのを防ぐために、実際の Web ページに表示される情報を繰り返しチェックする必要があります。

クロールに使用されるコードは次のとおりです。

comment_section = wd.find_element(By.XPATH, '//*[@data-automation="WebPresentation_PoiReviewsAndQAWeb"]')
# user id
user_elements = comment_section.find_elements(By.XPATH, '//div[@class="ffbzW _c"]/div/div/div/span[@class="WlYyy cPsXC dTqpp"]')
user_list = [x.text for x in user_elements]

英語のコメント データをキャプチャする場合、Web ページのフレームワークにいくつかの違いがあることに加えて、場所に関するデータはより複雑であり、さらなる処理が必要です。クロールのプロセスでは、デフォルトのカンマが区切り文字となり、カンマの前の値が都市、カンマの後の値が国になります。

# location
loca_elements = comment_section.find_elements(By.XPATH,
                                                         '//div[@class="ffbzW _c"]/div/div/div/div/div[@class="WlYyy diXIH bQCoY"]')
loca_list = [x.text[5:] for x in loca_elements]
# trip type
trips_element = comment_section.find_elements(By.XPATH, '//*[@class="eRduX"]')
trip_types = [self.separate_trip_type(x.text) for x in trips_element]

評価時間を特定するのは比較的難しいため、テキスト クラス カテゴリには Web ページのアトラクションの紹介に関する情報が含まれるため、この部分の不要なデータを削除する必要があることに注意してください。

# comment date
comments_date_element = comment_section.find_elements(By.CSS_SELECTOR, '.WlYyy.diXIH.cspKb.bQCoY')
# drop out the first element
comments_date_element.pop(0)
comments_date = [x.text[5:] for x in comments_date_element]

ユーザー評価はテキストではないため、星評価を計算するには、HTML 構造からそれを表す要素を見つける必要があります。トリップアドバイザーの Web ページの HTML では、星評価を表す要素は「バブル」ですが、HTML 構造内で関連するコードを見つけて、コード内の星評価データを抽出する必要があります。

# rating
rating_element = comment_section.find_elements(By.XPATH,
                                                         '//div[@class="dHjBB"]/div/span/div/div[@style="display: block;"]')
rating_list = []
for rating_code in rating_element:
       code_string = rating_code.get_attribute('innerHTML')
       s_ind = code_string.find(" bubble_")
       rating_score = code_string[s_ind + len(" bubble_"):s_ind + len(" bubble_") + 1]
       rating_list.append(rating_score)
# comments title
comments_title_elements = comment_section.find_elements(By.XPATH,
                                                                   '//*[@class="WlYyy cPsXC bLFSo cspKb dTqpp"]')
comments_title = [x.text for x in comments_title_elements]
# comments content
comments_content_elements = wd.find_element(By.XPATH,
                                                       '//*[@data-automation="WebPresentation_PoiReviewsAndQAWeb"]'
                                                       ).find_elements(By.XPATH, '//*[@class="duhwe _T bOlcm dMbup "]')
comments_content = [x.text for x in comments_content_elements]

コメント内の画像を検索するロジックは、星の評価を検索するロジックと同じです。まず、HTML 構造内で画像を表す部分を見つけてから、コメントにコード内に画像情報が含まれているかどうかを確認する必要があります。

# if review contains pictures
pic_sections = comment_section.find_elements(By.XPATH,
                                                        '//div[@class="ffbzW _c"]/div[@class="hotels-community-tab-common-Card__card--ihfZB hotels-community-tab-common-Card__section--4r93H comment-item"]')
pic_list = []
for r in pic_sections:
       if 'background-image' in r.get_attribute('innerHTML'):
                     pic_list.append(1)
                 else:
                     pic_list.append(0)

要約すると、入力された観光名所名と必要なレビュー ページ数に従って、トリップアドバイザー Web サイトからレビュー データを取得して統合し、最終的に Pandas DataFrame として保存できます。

プロセス全体を自動化し、data_processor という名前の .py ファイルにパッケージ化することができます。レビュー データを取得するには、次の方程式を実行してアトラクションのレビュー情報を Pandas DataFrame 形式で取得するだけです。

#引入之前定义的Python Class:
from data_processor import WebScrapper
scrapper = WebScrapper()
#运行网页抓取方程抓取中文语料:
trip_review_data = scrapper.trip_advisor_zh_scrapper_runner(location, location_city, location_state, page_n=int(n_pages))

location はアトラクションの名前を表し、location_city と location_state はアトラクションがある都市と州を表し、page_n はクロールされるページの数を表します。

データストレージ

キャプチャされたコメント データを取得した後、データを共有し、さらなる分析とモデリングを行うためにデータベースにデータを保存できます。PieCloudDB Database を例に挙げると、Python の Postgres SQL ドライバーを使用して PieCloudDB に接続できます。

このプロジェクトがデータ ストレージを実装する方法は、コメント データを取得して Pandas DataFrame に統合した後、SQLAlchemy エンジンを使用して psycopg2 を通じて Pandas データをデータベースにアップロードすることです。まず、データベースに接続するエンジンを定義する必要があります。

from sqlalchemy import create_engine
import psycopg2
engine = create_engine('postgresql+psycopg2://user_name:password@db_ip:port /database')

このうち、postgresql + psycopg2 はデータベースに接続するときに使用する必要があるドライバー、user_name はデータベースのユーザー名、password は対応するログインパスワード、db_ip はデータベースの IP またはエンドポイント、port はデータベースの外部接続インターフェイスです。 、database はデータベースの名前です。

エンジンを Pandas に渡した後、Pandas DataFrame をデータベースに簡単にアップロードして、ストレージ操作を完了できます。

data.to_sql(table_name, engine, if_exists=‘replace’, index=False)

data は保存する必要がある Pandas DataFrame データ、table_name はテーブル名、engine は前に定義した SQLAlchemy エンジン、if_exists='replace' および Index=False は Pandas to_sql() 方程式のオプションです。このオプションの意味は、テーブルがすでに存在する場合、既存のデータが既存のデータに置き換えられ、格納プロセス中にインデックスを考慮する必要がないことです。

データクリーニング

このステップでは、元のデータの特性に従ってコメント データをクリーンアップし、後続のモデリングに備えます。キャプチャされたコメント データには、次の 3 つのカテゴリの情報が含まれます。

  • ユーザー情報(所在地等)
  • コメント情報(画像情報の有無等)
  • コメントコーパス

このステップに正式に入る前に、次のコード ライブラリをインポートする必要があります。その一部はデータ モデリングのステップで使用されます。

import numpy as np
import pandas as pd
import psycopg2
from sqlalchemy import create_engine
import langid
import re
import emoji
from sklearn.preprocessing import MultiLabelBinarizer
import demoji
import random
from random import sample
import itertools
from collections import Counter
import matplotlib.pyplot as plt

ユーザー情報とコメント情報の適用は主に BI 部分に反映され、モデリング部分は主にコメント コーパス データに依存します。コメント言語に応じて、適切なクリーニング、単語の分割、およびモデリングの方法を採用する必要があります。まず、データベースからデータを取得します。これは次のコードで実現できます。

中国語コメントデータ:

df = pd.read_sql('SELECT * FROM "上海_上海_外滩_source_review"', engine)
df.shape

英語レビューデータ:

df = pd.read_sql('SELECT * FROM "Shanghai_Shanghai_The Bund (Wai Tan)_source_review_EN"', engine)
df.shape

中国語版 Web サイトでは 171 ページのコメント (1 ページあたり 10 件のコメント) をクロールし、合計 1,710 件のコメントを取得しました。国際版 Web サイトでは、200 ページのコメント、合計 2,000 件のコメントを取得しました。

1. データ型の処理

データベースに書き込まれるデータはすべて文字列型であるため、最初にデータの各列のデータ型を校正して変換する必要があります。中国語のコメント データで変換する必要がある変数は、コメント時間と評価です。

df['comment_date'] = pd.to_datetime(df['comment_date'])
df['rating'] = df['rating'].astype(str)
df['comment_year'] = df['comment_date'].dt.year
df['comment_month'] = df['comment_date'].dt.month

2. データの状態を理解する

NULL 値を処理してデータを変換する前に、データを簡単に参照して、NULL 値の状況を予備的に理解することができます。

df.isnull().sum()

中国語コメントデータのnull値の一般的な状況は次のとおりです。

中国のレビュー データとは異なり、英語のレビュー データは、主にユーザーの場所と旅行タイプの 2 つの変数に集中する、より多くの空白データを処理する必要があります。

3. トリップタイプの NULL 値の処理

NULL 値を持つ変数については、変数の各カテゴリの統計を通じてその特性を一般的に理解できます。旅行タイプ (trip_type) を例にとると、6 種類の変数があり、そのうちの 1 つはユーザーが指定していない旅行タイプであり、このタイプのデータは null 値の形式で存在します。

df.groupby(['trip_type']).size()

旅行タイプはカテゴリ変数であるため、このプロジェクトの場合、NULL をカテゴリ「不明」または「NA」で埋めます。

中国語コメントデータ:

df['trip_type'] = df['trip_type'].fillna('未知')

英語レビューデータ:

df['trip_type'] = df['trip_type'].fillna('NA')

中国語の口コミのテキスト分析では、旅行タイプを英語に対応して「家族旅行」「ビジネス旅行」「カップル旅行」「一人旅」「同伴旅行」「不明」の6つに分類しています。その後の分析を容易にするために、2 つの言語の旅行タイプに一致するルックアップ テーブルを作成する必要があります。

zh_trip_type = ['全家游', '商务行', '情侣游', '独自旅行', '结伴旅行', '未知']
en_trip_type = ['Family', 'Business', 'Couples', 'Solo', 'Friends', 'NA']
trip_type_df = pd.DataFrame({'zh_type':zh_trip_type, 'en_type':en_trip_type})

次に、その後の視覚的な分析のためにテーブルをデータベースに書き込みます。

trip_type_df.to_sql("tripadvisor_TripType_lookup", engine, if_exists="replace", index=False)

4. 英語コメントデータのユーザー位置情報処理

英語のコメントデータでは、ユーザーの所在地がユーザーが入力する情報であるため、地域データは非常にわかりにくく、特定の順序やロジックで入力されていません。都市および国のフィールドは、NULL 値を処理する必要があるだけでなく、修正する必要もあります。データを取得するとき、領域情報を取得するためのロジックは次のとおりです。

  • 地域情報がカンマで区切られている場合、最初の単語は市、最後の単語は国/県になります。
  • カンマがない場合、情報はデフォルトの国情報になります。

ウェブサイトの国際版のレビュー分析では、ユーザーの所在地を国レベルまで細分化することを選択します。多くのユーザーがスペルミスや虚偽の地名の入力に問題を抱えているため、大文字と小文字の修正、略語、対応する都市情報などを修正するなど、可能な限り情報を修正することを目標としています。ここでの具体的な解決策は次のとおりです。

  • 省略された国/県を抽出して個別に処理します(主に米国、ユーザーは地域情報を入力するときに州名のみを入力します)
  • 略語以外の国情報を表示します。国名が国リストに表示されない場合は、都市情報とみなされます。
  • 国フィールドに都市名が正しく入力されていない場合 (大都市など)、スペルミスがある場合は、手動で修正する必要があります。

このプロジェクトで使用されている国名と地域名は、国名、および米国のを参照していることに注意してください。

まず、ファイル システムから国情報を読み取ります。

country_file = open("countries.txt", "r")
country_data = country_file.read()
country_list = country_data.split("\n")
countries_lower = [x.lower() for x in country_list]
读取美国州名及其缩写信息:
state_code = pd.read_csv("state_code_lookup.csv")

次の方程式は、国名の文字列を読み取り、クリーニングと変更が必要かどうかを判断できます。

def formating_country_info(s_input):
   if s_input is None: #若字符串输入为空值,返回空值
       return None
   if s_input.strip().lower() in countries_lower: #若字符串输入在国家列表中,返回国家名
       c_index = countries_lower.index(s_input.strip().lower())
       return country_list[c_index]
   else:
       if len(s_input) == 2: #若输入为缩写,在美国州名、墨西哥省名和英国缩写中查找,若可以找到,返回对应国家名称
           if s_input.strip().upper() in state_code["code"].to_list():
               return "United States"
           elif s_input.strip().upper() == "UK":
               return "United Kingdom"
           elif s_input.strip().upper() in ("RJ", "GO", "CE"):
               return "Mexico"
           elif s_input.strip().upper() in ("SP", "SG"):
               return "Singapore"
           else:
               # could not detect country info
               return None
       else: #其他情况,需要手动修改国家名称
           if s_input.strip().lower() == "caior":
               return "Egypt"
           else:
               return None

単一の値をクリーンアップする方程式が得られたので、.apply() 関数を介して国情報を表す Pandas DataFrame の列にその方程式を適用できます。

df["location_country"] = df["location_country"].apply(formating_country_info)

次に、クリーンアップされた結果を確認します。

df["location_country"].isnull().sum()

NULL値が増えていることに気づきましたので、一部データを修正するとともに、一部の存在しない地名については上式​​によりNULL値に変換します。次に、都市情報を取得し、都市として分類される可能性のある国に関する情報を国変数に入力しましょう。間違って配置される可能性のある情報を国名に応じてフィルタリングし、この種の情報を国の情報の入力として使用し、残りはデフォルトで都市名になります。

def check_if_country_info(city_list):
   clean_list = []
   country_fill_list = []
   for city in city_list:
       if city is None:
           clean_list.append(None)
           country_fill_list.append(None)
       elif city.strip().lower() in countries_lower: #如城市变量中出现的是国家名,记录国家名称
           c_index = countries_lower.index(city.strip().lower())
           country_name = country_list[c_index]
           if country_name == "Singapore": #如城市名为新加坡,保留城市名,如不是则将原先的城市名转换为空值
               clean_list.append(country_name)
           else:
               clean_list.append(None)
           country_fill_list.append(country_name)
       else:
           # format city string
           city_name = city.strip().lower().capitalize()
           clean_list.append(city_name)
           country_fill_list.append(None)
   return clean_list, country_fill_list

 上記の方程式を実行すると、2 つのシリーズが得られます。1 つはクリーンアップされた都市データ、もう 1 つは国の情報が詰め込まれたデータです。

city_list, country_fillin = check_if_country_info(df["location_city"].to_list())

データ内に新しい列を作成し、国情報を含む配列を保存します。

df["country_fill_temp"] = country_fillin

英語コメントデータの都市情報を置き換え、国情報の空の値に新規作成した列を埋めてから、埋め込みに使用した列を削除します。

df["location_city"] = city_list
df["location_country"] = df["location_country"].fillna(df["country_fill_temp"])
df = df.drop(columns=["country_fill_temp"])

これまでのところ、このプロジェクトにおけるデータ収集、データ保存、データクリーニングの手順の原則とコード実装を説明し、完了しました。データの処理プロセスは困難で時間がかかりますが、大量の生データを有用なデータに変換できることは非常に価値があります。より高度なデータ モデリングの手順に興味があり、絵文字分析、単語分割キーワード、テキスト感情分析、品詞単語頻度分析、およびテキスト データのトピック モデル テキスト分類を実装する方法を知りたい場合は、引き続き支払いを行ってください。 Data Science Lab のフォローアップ ブログ投稿に注目してください。


参考文献:

この記事のデータの一部はインターネットから取得したものです。侵害がある場合は、連絡して削除してください。

おすすめ

転載: blog.csdn.net/OpenPie/article/details/129710312