形態素解析 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. |
| ↓品詞決定 |
| I | have | a | pen | . |
| 人称代名詞 | 動詞 | 限定詞 | 名詞 | |
| ↓文型解析 |
| I | have | a pen | . |
| S | V | O | |
最初に抽出した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プロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは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)
|