HOME | Raspberry Pi | ビジネス書籍紹介 | 2026-01-04 (Sun) Today's Access : 242 Total : 1260940. Since 10 Sep. 2019

形態素解析 TreeTagger
2021.07.24 / 2022.02.05更新


YouTube でも紹介しています。画像をクリックすると再生できます。

TreeTaggerは、英文を単語とその品詞に分解してくれる形態素解析ツールです。 英語以外にもフランス語やスペイン語、ドイツ語などにも対応しています。
今回は、ANC(American National Corpus)単語頻度準拠・英和辞典から、30000語の英単語を切り出して、 これにTree Tagger を用いて、品詞情報を付加してみます。
また応用として、品詞情報をもとに英文の文型を特定、単語の原形から英和辞典を用いて日本語を付加する自作WEBアプリを紹介します。

■動作環境

ラズベリーパイにはモニター、キーボードを取り付けていないので、ノートパソコンからSSHで接続しています。

■ANC単語頻度準拠・英和辞典/ANC Frequency Dictionary

「the public for FREE」とあるので無料で使用できるようですが、その適用範囲は不明です。

辞書をダウンロードします。
http://www.jamsystem.com/ancdic/index.html → ANC30000_1014_Dic.zip


辞書を解凍して、エクセルファイル(ANC30000_1014_Dic.xls)を開きます。
Excel表のシート名:Japanese+ を選択します。
A列のLemma(見出し語)とD列のJapanese(Short)の2列を残して、他の列を削除します。
なお、このExcelシートには、品詞の情報はありません。
タブ区切りのcsvファイル(anc30000.csv)として書き出します。

■Tree Tagger


https://www.cis.lmu.de/~schmid/tools/TreeTagger/
TreeTaggerは、英文を単語とその品詞に分解してくれる形態素解析ツールです。 英語以外にもフランス語やスペイン語、ドイツ語などにも対応しています。

TreeTagger License
1. You can freely use the TreeTagger software for evaluation, research and teaching purposes. Any other usage of the system (in particular for commercial purposes) requires a commercial license.
TreeTaggerは、評価、調査、教育を目的として自由に使用できます。 その他の使用法、特に商用目的の場合は、商用ライセンスが必要です。
2. You are not allowed to distribute the TreeTagger software to other persons without written permission.
TreeTaggerを許可なしに再配布することはできません。


※Raspberry Pi OS (64bit/bullseye)の場合
tagger package に ARM64 を選択

TreeTaggerのインストール

1.ページを下にスクロールして、ARMHF(あるいはARM64)を選択してダウンロードします。

2.同じディレクトリにtagging scriptsをダウンロードします。

3.インストールスクリプト install-tagger.shをダウンロードします。

4.さらにページを下にスクロールして、処理したい言語のparameter filesをダウンロードします。

 例えば、英語関連の場合、2つのタグセットが存在します。
・English parameter file (PENN tagset)
・English parameter file (BNC tagset)
ざっと見たところ、解析結果として表示される品詞タグが異なっています。
ここでは、PENN tagset を選んでいます。
さらに、ドイツ語、フランス語のパラメタ・ファイルもダウンロードしました。
・German parameter file
・French parameter file

5.インストールスクリプトを実行します。
$ sh install-tagger.sh
TreeTagger version for ARM Linux 32 bit installed.
Tagging scripts installed.
German parameter file installed.
English parameter file installed.
French parameter file installed.
Path variables modified in tagging scripts.

You might want to add /home/pi/TreeTagger/cmd and /home/pi/TreeTagger/bin to the PATH variable so that you do not need to specify the full path to run the tagging scripts.

後継の品詞解析ツールにRNNTaggerがありますが、PyTorchが必要であることと、処理速度を向上させるためにGPUが必要になります。

6.環境変数にパスを追加します。
$ vi .bashrc
export PATH="$PATH:/home/pi/TreeTagger/cmd"
export PATH="$PATH:/home/pi/TreeTagger/bin"
$ source .bashrc

7.テスト
$ echo 'Hello world!' | tree-tagger-english
        reading parameters ...
        tagging ...
         finished.
Hello   UH      hello
world   NN      world
!       SENT    !

単語ごとに「表層形」「品詞」「原型」が出力されます。

品詞タグ タグの説明
CC 等位接続詞 and, but, or
CD 基数 1, three
DT 限定詞 the
EX 存在文のthere There is
FW 外国語 d'œuvre
IN 前置詞または従位接続詞 in, of, like, after, whether
IN/that 補文素 that
JJ 形容詞 green
JJR 形容詞の比較級 greener
JJS 形容詞の最上級 greenest
LS リスト項目のマーカー (1)
MD 法助動詞 could, will
NN 名詞の単数形または不可算名詞 table
NNS 名詞の複数形 tables
NP 固有名詞の単数名 John
NPS 固有名詞の複数形 Vikings
PDT 前限定詞 both the boys
POS 所有格語尾 friend's
PP 人称代名詞 I, he, it
PP$ 所有代名詞 my, his
RB 副詞 however, usually, here, not
RBR 副詞の比較級 better
RBS 副詞の最上級 best
RP 不変化詞(句動詞を構成する前置詞) give up
SENT 文末の句読点記号 ?, !, .
SYM 記号 @, +, *, ^, =
TO to to go, to him
UH 間投詞 uhhuhhuhh
VB be動詞の原形 be
VBD be動詞の過去形 was, were
VBG be動詞の動名詞または現在分詞 being
VBN be動詞の過去分詞 been
VBZ be動詞の三人称単数形現在 is
VBP be動詞の三人称単数形以外の現在 am, are
VD do動詞の原形 do
VDD do動詞の過去形 did
VDG do動詞の動名詞または現在分詞 doing
VDN do動詞の過去分詞 done
VDZ do動詞の三人称単数形現在 does
VDP do動詞の三人称単数形以外の現在 do
VH have動詞の原形 have
VHD have動詞の過去形 had
VHG have動詞の動名詞または現在分詞 having
VHN have動詞の過去分詞 had
VHZ have動詞の三人称単数形現在 has
VHP have動詞の三人称単数形以外の現在 have
VV 動詞の原形 take
VVD 動詞の過去形 took
VVG 動詞の動名詞または現在分詞 taking
VVN 動詞の過去分詞 taken
VVP 動詞の三人称単数形現在 take
VVZ 動詞の三人称単数形以外の現在 takes
WDT Wh限定詞 which
WP Wh代名詞 who, what
WP$ 所有関係代名詞 whose
WRB Wh副詞 where, when
: 一般結合記号 ;, -, --
$ 通貨記号 $, £

■Pythonの実行環境整備

Python用ラッパーをインストールします。
$ pip3 install treetaggerwrapper
Installing collected packages: treetaggerwrapper Successfully installed treetaggerwrapper-2.3

Pythonサンプルコードの編集
$ vi example.py
import warnings
warnings.simplefilter('ignore', FutureWarning)

import treetaggerwrapper as ttw

text = 'I have a pen.'
tags_tabseparated = ttw.TreeTagger(TAGLANG='en').tag_text(text)
tags_tuple = ttw.make_tags(tags_tabseparated)  
for tag in tags_tuple:
    print("{0}\t{1}\t{2}".format(tag[0], tag[1], tag[2]))
$ python3 example.py
I       PP      I
have    VHP     have
a       DT      a
pen     NN      pen
.       SENT    .
※import treetaggerwrapper で FutureWarning を吐くので抑止しています。

■ANC単語頻度準拠_英和辞典に品詞情報を追加する

$ vi add_pos.py
import warnings
warnings.simplefilter('ignore', FutureWarning)

import treetaggerwrapper as ttw

out = open("anc3000plus.csv","wt")
tgr = ttw.TreeTagger(TAGLANG='en')
with open('anc30000.csv', 'r', encoding='UTF-8') as file:
 for line in file.read().splitlines():
  words = line.split('\t')
  tags_tabseparated = tgr.tag_text(words[0])
  tags_tuple = ttw.make_tags(tags_tabseparated)  
  for tag in tags_tuple:
   print("{0}\t{1}\t{2}\t{3}".format(tag[0], tag[1], words[1],tag[2]))
   text = words[0] + '\t'+ tag[1] + '\t' + words[1] + '\t' + tag[2] + '\n'
   out.write(text)
out.close()
【テストデータ(anc30000.csvから一部抜粋)】
abreast[TAB]横に並んで[LF]
abridge[TAB]削減する[LF]
abroad[TAB]海外で[LF]
abrogate[TAB]廃止する[LF]
xxxxxxx[TAB]意味不明[LF]

データの最終行に存在しない単語を追加しておきました。

$ python3 add_pos.py
abreast JJ      横に並んで      abreast
abridge VV      削減する        abridge
abroad  RB      海外で  abroad
abrogate        VV      廃止する        abrogate
xxxxxxx NN      意味不明        xxxxxxx
意味不明な単語は、名詞単数形(NN)に振り分けられていました。

最初に作成した、ANC単語頻度準拠_英和辞典のcsvファイルを実際に処理しましょう。 あっという間に、30000語の英単語に品詞情報が追加されます。

■PHPでの実行環境構築

WEB環境と相性の良いPHPで使えるようにします。

◇Composer のセットアップ

PHP のパッケージ管理ツール Composer をインストールします。

1.セットアップ用PHPスクリプト(composer-setup.php)のダウンロード
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ ls -l
-rw-r--r-- 1 pi pi 58460 7月 20 12:28 composer-setup.php

2.Composer の実行ファイル(phar)の作成
composer-setup.php を実行して、Composer の実行ファイル(phar)を作成します。
$ php --version
PHP 7.3.19-1~deb10u1 (cli) (built: Jul 5 2020 06:46:45) ( NTS )
$ php composer-setup.php
Composer (version 2.1.3) successfully installed to: /home/pi/composer.phar

3.セットアップ用PHPスクリプトの削除
$ php -r "unlink('composer-setup.php');"
$ ls -l
-rwxr-xr-x 1 pi pi 2253070 7月 20 12:30 composer.phar

4.動作確認
/usr/local/bin フォルダに composer.phar を移動させて、どこからでも使えるようにします。
$ sudo mv composer.phar /usr/local/bin/composer
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.1.3 2021-06-09 16:31:20
Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version (以下略)

◇php-lemmatizer のインストール

php-lemmatizer は、TreeTaggerライブラリーのPHPラッパーです。
composer を用いて、php-lemmatizer をインストールします。

$ composer require mbeurel/php-lemmatizer
Using version ^0.1.2 for mbeurel/php-lemmatizer
./composer.json has been created
Running composer update mbeurel/php-lemmatizer
Loading composer repositories with package information
Updating dependencies
Lock file operations: 2 installs, 0 updates, 0 removals
 - Locking mbeurel/php-lemmatizer (0.1.2)
 - Locking symfony/process (v4.4.26)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
 - Downloading symfony/process (v4.4.26)
 - Downloading mbeurel/php-lemmatizer (0.1.2)
 - Installing symfony/process (v4.4.26): Extracting archive
 - Installing mbeurel/php-lemmatizer (0.1.2): Extracting archive
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!

$ ls -l
-rw-r--r--  1 pi pi       70  7月 20 12:40 composer.json
-rw-r--r--  1 pi pi     4784  7月 20 12:40 composer.lock
drwxr-xr-x  5 pi pi     4096  7月 20 12:40 vendor
$ ls -l vendor
-rw-r--r-- 1 pi pi 178 7月 20 12:40 autoload.php
drwxr-xr-x 2 pi pi 4096 7月 20 12:40 composer
drwxr-xr-x 3 pi pi 4096 7月 20 12:40 mbeurel
drwxr-xr-x 3 pi pi 4096 7月 20 12:40 symfony

TreeTagger.php のバグ修正
php-lemmatizer のライブラリーにあるTreeTagger.phpにはバグがあるので修正します。
$ vi /home/pi/vendor/mbeurel/php-lemmatizer/lib/TreeTagger.php 289-291行
$source =array_key_exists(0, $elementsArray) ? $elementsArray[0] : null;
$type =array_key_exists(1, $elementsArray) ? $elementsArray[0] : null;
$dest =array_key_exists(2, $elementsArray) ? $elementsArray[0] : null;
 ↓修正
$source =array_key_exists(0, $elementsArray) ? $elementsArray[0] : null;
$type =array_key_exists(1, $elementsArray) ? $elementsArray[1] : null;
$dest =array_key_exists(2, $elementsArray) ? $elementsArray[2] : null;

サンプルコーディングexample.php
github から php-lemmatizerのサンプルコードをダウンロードして、簡素化します。

$ vi example.php
<?php
include "vendor/autoload.php";
use PhpTreeTagger\TreeTagger;

try {
  $treeTagger = new TreeTagger("english", array(
      "treeTaggerPath"   => "/home/pi/TreeTagger", // Path to TreeTagger Library
      "debug"            => false,           // View Debug
      "wordUnique"       => false,           // Keep only one occurrence of the word
      "wordRemoveAccent" => true,            // Remove all accent in word
      "nbProcess"        => 6
    )
  );

  // Remove type in words
  $treeTagger->setCleanTypeWords(
    array("PRO:PER","DET:ART","DET:POS","SENT","PRP")
  );

  // Lemmatizer String or Array parameters, to array => ["La lemmatisation designe un traitement lexical", "apporte a un texte en vue de son analyse"]
  $result = $treeTagger->lemmatizer("I have a pen.");

  // View result :
  var_dump($result);
} catch(\Exception $e) {
  echo $e;
}
?>

実行してみます。
$ php example.php
array(1) {
  [0]=>array(2) {
       ["value"]=>string(12) "I have a pen"
       ["detail"]=>array(4) {
         [0]=>array(3) {
               ["source"]=>string(1) "I"
               ["type"]=>string(2) "PP"
               ["dest"]=>string(1) "I"
         }
         [1]=>array(3) {
               ["source"]=>string(4) "have"
               ["type"]=>string(3) "VHP"
               ["dest"]=>string(4) "have"
         }
         [2]=>array(3) {
               ["source"]=>string(1) "a"
               ["type"]=>string(2) "DT"
               ["dest"]=>string(1) "a"
         }
         [3]=>array(3) {
               ["source"]=>string(3) "pen"
               ["type"]=>string(2) "NN"
               ["dest"]=>string(3) "pen"
         }
       }
  }
}

■WEB環境での利用

WEB環境では、英文をフォームから入力して、プログラムに引き渡す処理が加わります。 また、WEBサーバの設定を変更したくなかったので、TreeTaggerのパスを絶対パスに変更しています。
プログラムをWEBサーバのドキュメントルートに配置して編集します。
$ vi example.php
<?php
  $statement = 'I have a pen.'; // ←実際にはフォームから取得
  include "/home/pi/vendor/autoload.php";
  use PhpTreeTagger\TreeTagger;

  try {
    $treeTagger = new TreeTagger("english", array(
      "treeTaggerPath"   =>  "/home/pi/TreeTagger",
      "debug"            =>  false,
      "wordUnique"       =>  false,
      "wordRemoveAccent" =>  true, 
      "nbProcess"        =>  6
      )
    );

    $treeTagger->setCleanTypeWords(
      array(
        "PRO:PER",
        "DET:ART",
        "DET:POS",
        "SENT",
        "PRP"
      )
    );

    $result = $treeTagger->lemmatizer($statement);
    $source = array();
    $type   = array();
    $dest   = array();
    foreach ($result[0]["detail"] as $key=>$value) {
      $source[$key] = $value["source"];
      $type[$key]   = $value["type"];
      $dest[$key]   = $value["dest"];
      echo $source[$key].' '.$type[$key].' '.$dest[$key]."
\n"; } } catch(\Exception $e) { echo $e; } ?>
http://192.168.11.2/example.php にアクセスしてみます。

Exception: The file "tree-tagger" not exist in /home/pi/TreeTagger/bin/tree-tagger in /home/pi/vendor/mbeurel/php-lemmatizer/lib/TreeTagger.php:127

tree-taggerが存在しないという例外が発生しました。
tree-taggerの配置されているディレクトリーを確認してみます。

$ ls -l ~/TreeTagger
drwxr-x--- 2 pi pi 4096 7月 21 20:52 bin
drwxr-x--- 2 pi pi 4096 7月 17 11:54 cmd
drwxr-x--- 2 pi pi 4096 7月 17 11:53 lib

Apache WEBサーバーに、bin/tree-tagger へのアクセス権限を付与します。
$ chmod 755 bin cmd lib

$ ls -l ~/TreeTagger/lib/english*
-rw-r----- 1 pi pi 1857 8月 4 2014 /home/pi/TreeTagger/lib/english-abbreviations
-rw-r--r-- 1 pi pi 14339739 7月 17 11:53 /home/pi/TreeTagger/lib/english.par

同様に、english-abbreviations にアクセスできるように、権限を付与します。
$ chmod a+r ~/TreeTagger/lib/english-abbreviations

これで品詞情報と原型を取得できるようになりました。
I PP I
have VHP have
a DT a
pen NN pen


■オリジナルWEBアプリの制作

WEB環境が整いましたので、ここからはオリジナルのアプリケーションを作ってみましょう。 フォームから英文を入力して、TreeTaggerで品詞決定、 独自の解析プログラムで、品詞の並びから文型を判定するアプリを作ってみました。
I have a pen.
↓品詞決定
Ihaveapen.
人称代名詞動詞限定詞名詞
↓文型解析
Ihavea pen.

最初に抽出したANC英和辞典は、英単語と日本語をセットとしてデータベース化しています。


英文を入力して、構文解析ボタンを押します。


品詞の並びから文型を判断しています。 過去形のboughtは、TreeTaggerにより原型のbuyを取得して、データベースに登録した辞書から、英単語に該当する日本語を抽出して表示しています。 複雑な形態素解析ではないので、解析ボタンを押して2秒も掛からずに結果が表示されました。
なお、普通にわかる代名詞などは意味表示を省いています。

■参考文献
英単語1万語以上の最強csvファイルを作る方法
TreeTaggerの環境構築からPythonで動かすまで
形態素解析ツールTreeTaggerの品詞コードの意味・日本語訳一覧表(完全版)
Tree Tagger Tag Set (58 tags)
TreeTagger Python Wrapper’s documentation!
Windows+Python 3 環境における TreeTagger のセットアップ手順
Composer を CentOS にインストールする手順
php-lemmatizer
PHPのオートロード(autoload)
PHP開発でComposerを使わないなんてありえない!基礎編
英語の基本5文型を徹底おさらい!
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2020.04.24 Twitter-LINE連携によるビジネス活用
2021.02.27 TweLite Neural Network 第1回環境設定
2021.07.24 形態素解析 TreeTagger
2023.09.01 XMLParser
2023.09.16 RSSフィード読上げ Emic2
2023.11.01 Internet Radio
2024.09.24 Learn English

たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」 「一念発起して何かを始めても、いつも三日坊主で終わってしまう」 「色んなことを先延ばしにしたまま、時間だけが過ぎていく」 そこで本書では、そんな著者が独自に開発した、 まったく新しい目標達成メソッド「100日デザイン」について、 その知識と技術を、余すところなくご紹介します。

まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。 ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。

今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。

ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。 29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!

【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。 基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説! 500以上のサンプルを掲載。実行結果も確認。 全24章の包括的なチュートリアル。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。

Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード

電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)

Copyright © 2011-2027 Sarako Tsukiyono All rights reserved®.