From 872ec231dee6b8414050b5376181d4af4469b51b Mon Sep 17 00:00:00 2001 From: NISHIO Hirokazu Date: Tue, 28 Jan 2025 16:47:01 +0900 Subject: [PATCH 1/6] add quickstart --- docs/quickstart.md | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 docs/quickstart.md diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 0000000..cd438c2 --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,71 @@ +# 初めてのTttC(Talk to the City)ガイド + +## 概要 + +TttCは、コメントのCSVファイルを入力として受け取り、以下のようなHTMLレポートを生成するAIパイプラインです。 + +- 元のコメントから主要な議論を抽出 +- 意味的な類似性に基づいて議論をクラスター化 +- 各クラスターにラベルと要約を生成 +- 各クラスター内の議論を探索するためのインタラクティブなマップを提供 + +TttCは、異なる種類のデータを取り込み、異なる言語でレポートを生成することができます。 + +## 必要なもの + +- OpenAIのAPIキー +- PythonとJavaScriptを実行できるマシン +- コメントを含むCSVファイル + +Python 3.10以上が必要です。Pythonのバージョン管理にはpyenvを使用することをお勧めします。 + +## セットアップ手順 + +1. **Python環境のセットアップ** + - Python 3.10をインストールし、仮想環境を作成してアクティブ化します。 + - 必要な依存関係をインストールします。 + + ```bash + pyenv install 3.10.15 + pyenv local 3.10.15 + python -m venv venv + source venv/bin/activate + pip install -r requirements.txt + python -c "import nltk; nltk.download('stopwords')" + ``` + +2. **JavaScript依存関係のインストール** + - npmを使用してJavaScriptの依存関係をインストールします。 + + ```bash + cd next-app + npm install + ``` + +3. **レポートの生成** + - サンプルの`example-polis`データを使用して試してみましょう。 + + ```bash + cd pipeline + export OPENAI_API_KEY=sk-... + python main.py configs/example-polis.json + ``` + + このコマンドは、`pipeline/inputs/example-polis.csv`のデータを使用し、`pipeline/outputs/example-polis/report`にレポートを生成します。 + +4. **レポートのビルドと表示** + - Next.jsを使用してレポートをビルドします。 + + ```bash + cd next-app + REPORT=example-polis npm run build + ``` + + - PythonのHTTPサーバーを使用してレポートを表示します。 + + ```bash + cd pipeline/outputs/example-polis/report + python -m http.server 8000 + ``` + + ブラウザで`http://localhost:8000`を開きます。 From d091ccbfb8592dcd1b22de42404ecc13d1f25b20 Mon Sep 17 00:00:00 2001 From: NISHIO Hirokazu Date: Tue, 28 Jan 2025 17:12:39 +0900 Subject: [PATCH 2/6] add docker --- Dockerfile | 32 ++++++++++++++++++++++++++++++++ docs/quickstart.md | 32 ++++++++++++++++++++++++++++---- 2 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4c4248e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +# ベースイメージとしてPythonとNode.jsを含むイメージを使用 +FROM python:3.10-slim + +# 作業ディレクトリを設定 +WORKDIR /app + +# 必要なシステムパッケージをインストール +RUN apt-get update && apt-get install -y \\ + curl \\ + && rm -rf /var/lib/apt/lists/* + +# Node.jsをインストール +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \\ + && apt-get install -y nodejs + +# プロジェクトのファイルをコピー +COPY . . + +# Pythonの依存関係をインストール +RUN pip install --no-cache-dir -r scatter/requirements.txt + +# JavaScriptの依存関係をインストール +RUN cd scatter/next-app && npm install + +# NLTKのデータをダウンロード +RUN python -c "import nltk; nltk.download('stopwords')" + +# 環境変数を設定 +ENV OPENAI_API_KEY=your_openai_api_key_here + +# パイプラインを実行し、レポートを生成 +CMD ["bash", "-c", "cd scatter/pipeline && python main.py configs/example-polis.json && cd ../next-app && REPORT=example-polis npm run build && cd ../pipeline/outputs/example-polis/report && python -m http.server 8000"] \ No newline at end of file diff --git a/docs/quickstart.md b/docs/quickstart.md index cd438c2..9280ac1 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -1,15 +1,17 @@ -# 初めてのTttC(Talk to the City)ガイド +# 初めてのブロードリスニングガイド + +このドキュメントは、初めてブロードリスニングに挑戦する人を想定したガイドです。 ## 概要 -TttCは、コメントのCSVファイルを入力として受け取り、以下のようなHTMLレポートを生成するAIパイプラインです。 +このツール(*)は、コメントのCSVファイルを入力として受け取り、以下のようなHTMLレポートを生成するAIパイプラインです。 - 元のコメントから主要な議論を抽出 - 意味的な類似性に基づいて議論をクラスター化 - 各クラスターにラベルと要約を生成 - 各クラスター内の議論を探索するためのインタラクティブなマップを提供 -TttCは、異なる種類のデータを取り込み、異なる言語でレポートを生成することができます。 +(* 「このツール」はAI Objective Instituteが開発したTalk to the Cityから派生したものですが、Talk to the Cityにも2種類あり、またかなり大々的に書き換えているため、近々分かりやすい名前をつける予定です) ## 必要なもの @@ -19,7 +21,29 @@ TttCは、異なる種類のデータを取り込み、異なる言語でレポ Python 3.10以上が必要です。Pythonのバージョン管理にはpyenvを使用することをお勧めします。 -## セットアップ手順 +## Windowsユーザ向けDockerセットアップ + +WindowsユーザはDockerを使用して簡単に環境をセットアップできます。以下の手順に従ってください。 + +1. **Dockerのインストール** + - Docker Desktopをインストールし、起動します。 + +2. **Dockerイメージのビルド** + - プロジェクトのルートディレクトリで以下のコマンドを実行してDockerイメージをビルドします。 + + ```bash + docker build -t broadlistening . + ``` + +3. **Dockerコンテナの起動** + - 以下のコマンドを実行してDockerコンテナを起動し、レポートを生成します。 + + ```bash + docker run -p 8000:8000 broadlistening + ``` + + ブラウザで`http://localhost:8000`を開き、生成されたレポートを確認します。 + 1. **Python環境のセットアップ** - Python 3.10をインストールし、仮想環境を作成してアクティブ化します。 From a8383112c27c1c88a8f13738b85cc3809fe56383 Mon Sep 17 00:00:00 2001 From: NISHIO Hirokazu Date: Tue, 28 Jan 2025 22:40:22 +0900 Subject: [PATCH 3/6] fix --skip-interaction option --- scatter/pipeline/main.py | 21 +++++++++++---------- scatter/pipeline/utils.py | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/scatter/pipeline/main.py b/scatter/pipeline/main.py index 02d7580..ca72969 100644 --- a/scatter/pipeline/main.py +++ b/scatter/pipeline/main.py @@ -21,30 +21,31 @@ def parse_arguments(): description="Run the annotation pipeline with optional flags." ) parser.add_argument( - "config", - help="Path to config JSON file that defines the pipeline execution." + "config", help="Path to config JSON file that defines the pipeline execution." ) parser.add_argument( - "-f", "--force", + "-f", + "--force", action="store_true", - help="Force re-run all steps regardless of previous execution." + help="Force re-run all steps regardless of previous execution.", ) parser.add_argument( - "-o", "--only", + "-o", + "--only", type=str, - help="Run only the specified step (e.g., extraction, embedding, clustering, etc.)." + help="Run only the specified step (e.g., extraction, embedding, clustering, etc.).", ) parser.add_argument( "--skip-interaction", action="store_true", - help="Skip the interactive confirmation prompt and run pipeline immediately." + help="Skip the interactive confirmation prompt and run pipeline immediately.", ) return parser.parse_args() def main(): args = parse_arguments() - + # Convert argparse namespace to sys.argv format for compatibility new_argv = [sys.argv[0], args.config] if args.force: @@ -52,8 +53,8 @@ def main(): if args.only: new_argv.extend(["-o", args.only]) if args.skip_interaction: - new_argv.append("-skip-interaction") - + new_argv.append("--skip-interaction") + config = initialization(new_argv) try: diff --git a/scatter/pipeline/utils.py b/scatter/pipeline/utils.py index 924b5f5..7a8a590 100644 --- a/scatter/pipeline/utils.py +++ b/scatter/pipeline/utils.py @@ -140,7 +140,7 @@ def initialization(sysargv): config["force"] = True if option == "-o": config["only"] = sysargv[i + 1] - if option == "-skip-interaction": + if option == "--skip-interaction": config["skip-interaction"] = True output_dir = config["output_dir"] From e2ed6d1e1c4a07c84fba8bfc27437c16d0aa7077 Mon Sep 17 00:00:00 2001 From: NISHIO Hirokazu Date: Tue, 28 Jan 2025 22:40:34 +0900 Subject: [PATCH 4/6] add Dockerfile for windows user --- Dockerfile | 8 +++----- docs/for_windows_user.md | 24 ++++++++++++++++++++++++ docs/quickstart.md | 32 ++++---------------------------- 3 files changed, 31 insertions(+), 33 deletions(-) create mode 100644 docs/for_windows_user.md diff --git a/Dockerfile b/Dockerfile index 4c4248e..fe75149 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,12 +5,10 @@ FROM python:3.10-slim WORKDIR /app # 必要なシステムパッケージをインストール -RUN apt-get update && apt-get install -y \\ - curl \\ - && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y curl gcc build-essential && rm -rf /var/lib/apt/lists/* # Node.jsをインストール -RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \\ +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \ && apt-get install -y nodejs # プロジェクトのファイルをコピー @@ -29,4 +27,4 @@ RUN python -c "import nltk; nltk.download('stopwords')" ENV OPENAI_API_KEY=your_openai_api_key_here # パイプラインを実行し、レポートを生成 -CMD ["bash", "-c", "cd scatter/pipeline && python main.py configs/example-polis.json && cd ../next-app && REPORT=example-polis npm run build && cd ../pipeline/outputs/example-polis/report && python -m http.server 8000"] \ No newline at end of file +CMD ["bash", "-c", "cd scatter/pipeline && python main.py configs/example-polis.json --skip-interaction && cd outputs/example-polis/report && python -m http.server 8000"] \ No newline at end of file diff --git a/docs/for_windows_user.md b/docs/for_windows_user.md new file mode 100644 index 0000000..1e27fb2 --- /dev/null +++ b/docs/for_windows_user.md @@ -0,0 +1,24 @@ +## Windowsユーザ向けDockerセットアップ +(注: このドキュメントは作りかけです) + + +WindowsユーザはMacやLinuxと比較して環境構築で迷いやすいです。Dockerを使用して比較的マシに環境をセットアップできます。以下の手順に従ってください。 + +1. **Dockerのインストール** + - Docker Desktopをインストールし、起動します。 + +2. **Dockerイメージのビルド** + - プロジェクトのルートディレクトリで以下のコマンドを実行してDockerイメージをビルドします。 + + ```bash + docker build -t broadlistening . + ``` + +3. **Dockerコンテナの起動** + - 以下のコマンドを実行してDockerコンテナを起動し、レポートを生成します。 + + ```bash + docker run -p 8000:8000 broadlistening + ``` + + ブラウザで`http://localhost:8000`を開き、生成されたレポートを確認します。 diff --git a/docs/quickstart.md b/docs/quickstart.md index 9280ac1..937ecea 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -17,33 +17,15 @@ - OpenAIのAPIキー - PythonとJavaScriptを実行できるマシン -- コメントを含むCSVファイル Python 3.10以上が必要です。Pythonのバージョン管理にはpyenvを使用することをお勧めします。 ## Windowsユーザ向けDockerセットアップ -WindowsユーザはDockerを使用して簡単に環境をセットアップできます。以下の手順に従ってください。 - -1. **Dockerのインストール** - - Docker Desktopをインストールし、起動します。 - -2. **Dockerイメージのビルド** - - プロジェクトのルートディレクトリで以下のコマンドを実行してDockerイメージをビルドします。 - - ```bash - docker build -t broadlistening . - ``` - -3. **Dockerコンテナの起動** - - 以下のコマンドを実行してDockerコンテナを起動し、レポートを生成します。 - - ```bash - docker run -p 8000:8000 broadlistening - ``` - - ブラウザで`http://localhost:8000`を開き、生成されたレポートを確認します。 +WindowsユーザはMacやLinuxと比較して環境構築で迷いやすいです。Dockerを使用して比較的マシに環境をセットアップできます。 +[Windowsユーザ向けDockerセットアップ](for_windows_user.md)を参照。 +## その他の環境でのセットアップ 1. **Python環境のセットアップ** - Python 3.10をインストールし、仮想環境を作成してアクティブ化します。 @@ -77,13 +59,7 @@ WindowsユーザはDockerを使用して簡単に環境をセットアップで このコマンドは、`pipeline/inputs/example-polis.csv`のデータを使用し、`pipeline/outputs/example-polis/report`にレポートを生成します。 -4. **レポートのビルドと表示** - - Next.jsを使用してレポートをビルドします。 - - ```bash - cd next-app - REPORT=example-polis npm run build - ``` +4. **レポートの表示** - PythonのHTTPサーバーを使用してレポートを表示します。 From bc329a3ec73fe5151d0a1779175aebd9cdc5bc17 Mon Sep 17 00:00:00 2001 From: NISHIO Hirokazu Date: Tue, 28 Jan 2025 23:34:29 +0900 Subject: [PATCH 5/6] add .env.example --- .env.example | 1 + 1 file changed, 1 insertion(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9847a1d --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +OPENAI_API_KEY= \ No newline at end of file From 7ad6857aa29efd49a2b11d3c88c1277b2a920619 Mon Sep 17 00:00:00 2001 From: NISHIO Hirokazu Date: Wed, 29 Jan 2025 00:24:49 +0900 Subject: [PATCH 6/6] update docs --- docs/for_windows_user.md | 36 +++++++++++------ docs/images/usage.png | Bin 0 -> 55641 bytes docs/quickstart.md | 84 +++++++++++++++++++++++---------------- 3 files changed, 73 insertions(+), 47 deletions(-) create mode 100644 docs/images/usage.png diff --git a/docs/for_windows_user.md b/docs/for_windows_user.md index 1e27fb2..b03e380 100644 --- a/docs/for_windows_user.md +++ b/docs/for_windows_user.md @@ -4,21 +4,31 @@ WindowsユーザはMacやLinuxと比較して環境構築で迷いやすいです。Dockerを使用して比較的マシに環境をセットアップできます。以下の手順に従ってください。 -1. **Dockerのインストール** - - Docker Desktopをインストールし、起動します。 +### 1. **Dockerのインストール** +Docker Desktopをインストールし、起動します。 -2. **Dockerイメージのビルド** - - プロジェクトのルートディレクトリで以下のコマンドを実行してDockerイメージをビルドします。 +### 2. **環境変数の設定** +プロジェクトのルートディレクトリで`.env`ファイルを作成します。`.env.example`ファイルをコピーして編集すると良いでしょう。 +以下のような内容になります。 - ```bash - docker build -t broadlistening . - ``` +``` +OPENAI_API_KEY= +``` -3. **Dockerコンテナの起動** - - 以下のコマンドを実行してDockerコンテナを起動し、レポートを生成します。 +### 3. **Dockerイメージのビルド** +プロジェクトのルートディレクトリで以下のコマンドを実行してDockerイメージをビルドします。 - ```bash - docker run -p 8000:8000 broadlistening - ``` +```bash +docker build -t broadlistening . +``` - ブラウザで`http://localhost:8000`を開き、生成されたレポートを確認します。 +### 3. **Dockerコンテナの起動** +以下のコマンドを実行してDockerコンテナを起動し、レポートを生成します。 + +```bash +docker run -p 8000:8000 broadlistening +``` + + +### 4. 結果の確認 +ブラウザで`http://localhost:8000`を開き、生成されたレポートを確認します。 diff --git a/docs/images/usage.png b/docs/images/usage.png new file mode 100644 index 0000000000000000000000000000000000000000..265bc3f18982cd1776925af7d357a8a9c2335beb GIT binary patch literal 55641 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

=5;?@uyeo_odiAC!(PL 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 +``` - ```bash - pyenv install 3.10.15 - pyenv local 3.10.15 - python -m venv venv - source venv/bin/activate - pip install -r requirements.txt - python -c "import nltk; nltk.download('stopwords')" - ``` +### **レポートの生成** +サンプルの`example-polis`データを使用して試してみましょう。 -2. **JavaScript依存関係のインストール** - - npmを使用してJavaScriptの依存関係をインストールします。 +```bash +cd pipeline +python main.py configs/example-polis.json +``` - ```bash - cd next-app - npm install - ``` +このコマンドは、`pipeline/inputs/example-polis.csv`のデータを使用し、`pipeline/outputs/example-polis/report`にレポートを生成します。 -3. **レポートの生成** - - サンプルの`example-polis`データを使用して試してみましょう。 +### **レポートの表示** - ```bash - cd pipeline - export OPENAI_API_KEY=sk-... - python main.py configs/example-polis.json - ``` +PythonのHTTPサーバーを使用してレポートを表示します。 - このコマンドは、`pipeline/inputs/example-polis.csv`のデータを使用し、`pipeline/outputs/example-polis/report`にレポートを生成します。 +```bash +cd pipeline/outputs/example-polis/report +python -m http.server 8000 +``` -4. **レポートの表示** +ブラウザで`http://localhost:8000`を開きます。 - - PythonのHTTPサーバーを使用してレポートを表示します。 +### API費用の確認 +OpenAIのUsege画面を見るとかかった費用がわかります。 - ```bash - cd pipeline/outputs/example-polis/report - python -m http.server 8000 - ``` +![](images/usage.png) - ブラウザで`http://localhost:8000`を開きます。 +この処理では1〜2円程度であることがわかります。