回答編集履歴

1

疑似コードを追加。

2015/02/26 02:30

投稿

shinosan
shinosan

スコア209

test CHANGED
@@ -1,3 +1,119 @@
1
1
  proc_open()は子プロセスでコマンドを実行しパイプや仮想コンソールで処理をさせるので、mecab コマンドを呼び出してやれば作れそうですね。
2
2
 
3
3
  [MeCabのコマンドライン引数](http://www.mwsoft.jp/programming/munou/mecab_command.html)を[proc_open()の引数に渡して](http://manual.xwd.jp/function.proc-open.html)パイプを読み書きすれば、Mecab_Targgerに近い処理ができるかと。
4
+
5
+
6
+
7
+ 以下は[このサイト](http://colo-ri.jp/develop/2011/04/mecab_php_mecab.html)を参考に書いた疑似コードです。動作確認はしてません。
8
+
9
+
10
+
11
+ ```lang-PHP
12
+
13
+ class MeCab_Tagger_dummy {
14
+
15
+ public $firstNode = null;
16
+
17
+ public function parseToNode($txt) {
18
+
19
+ $cmd = 'mecab '; // コマンドライン引数があったらここに追加する
20
+
21
+ $descriptorspec = array(
22
+
23
+ 0 => array("pipe", "r"), // stdin は、子プロセスが読み込むパイプです。
24
+
25
+ 1 => array("pipe", "w"), // stdout は、子プロセスが書き込むパイプです。
26
+
27
+ 2 => array("file", "/home/mecab-output.txt", "a") // はファイルで、そこに書き込みます。
28
+
29
+ );
30
+
31
+ $cwd = '/home';
32
+
33
+ $process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
34
+
35
+
36
+
37
+ if (is_resource($process)) {
38
+
39
+ fwrite($pipes[0], $txt);
40
+
41
+ fclose($pipes[0]);
42
+
43
+
44
+
45
+ while ( ($line = fgets($pipes[1])) !== false ) {
46
+
47
+ $node = new MeCab_Node_dummy($this->firstNode,$line);
48
+
49
+ if ( $this->firstNode === null ) $this->firstNode = $node;
50
+
51
+ }
52
+
53
+ fclose($pipes[1]);
54
+
55
+
56
+
57
+ proc_close($process);
58
+
59
+ }
60
+
61
+ return $this->firstNode;
62
+
63
+ }
64
+
65
+ }
66
+
67
+ class MeCab_Node_dummy {
68
+
69
+ public function __construct(MeCab_Node_dummy $prev,$feature) {
70
+
71
+ $prev->next = $this;
72
+
73
+ $this->feature = $feature;
74
+
75
+ if ( $feature ) {
76
+
77
+ $columns = mb_split(',',$feature);
78
+
79
+ $this->surface = mb_split(' ',$columns[0]);
80
+
81
+ }
82
+
83
+ }
84
+
85
+ protected $next;
86
+
87
+ protected $feature;
88
+
89
+ protected $surface = '';
90
+
91
+ public function getNext() { return $this->next; }
92
+
93
+ public function getFeature() { return $this->feature; }
94
+
95
+ public function getSurface() { return $this->surface; }
96
+
97
+ }
98
+
99
+
100
+
101
+ $mecab = new MeCab_Tagger_dummy();
102
+
103
+ $txt = "現在MeCabにおいて、php_mecabを使わずproc_open()関数で、Mecab_Tagger オブジェクト(またはその機能を持ったオブジェクト)を生成したいと考えております。";
104
+
105
+ $meisi = array(); //名詞配列
106
+
107
+ for ( $node=$mecab->parseToNode($txt); $node; $node=$node->getNext() ) {
108
+
109
+ $meisi[] = $node->getSurface();
110
+
111
+ }
112
+
113
+ //名詞の重複削除
114
+
115
+ $meisi = array_unique($meisi);
116
+
117
+ print_r($meisi);
118
+
119
+ ```