Обработка текста с помощью mystem на php?

Программа mystem производит морфологический анализ текста на русском языке.


Пытаюсь с помощью нее обработать строку:

&lt;?php<br/>
function mystem($q) {<br/>
 $out = array();<br/>
 exec('echo ' . $q . ' | ' . dirname(__FILE__) . '\mystem\mystem.exe -i', $out);<br/>
 $q = implode('', $out);<br/>
 return $q;<br/>
}<br/>
<br/>
echo mystem('в мурелки шлепают пельсиски');<br/>
?&gt;


XAMPP 1.7.3, php 5.3.1, windows 7, результат вывожу в документе с кодировкой utf-8


На выходе вижу:

�{�??}�{�??}��{��??}���{���??}�{�??}����{����??}���{���??}��{��??}���{���??}



Проблема в кодировке, т.к. по-умолчанию mystem работает с cp1251. Пытаюсь добавить параметр -e для изменения кодировки (см. документацию), меняю соответствующую строку:

exec('echo ' . $q . ' | ' . dirname(__FILE__) . '\mystem\mystem.exe -e utf-8 -i', $out);



Не выводит ничего.


Попробовал так же работать с windows-1251:

&lt;?php<br/>
function mystem($q) {<br/>
 $out = array();<br/>
 $q = iconv(&quot;utf-8&quot;, &quot;windows-1251&quot;, $q);<br/>
 exec('echo ' . $q . ' | ' . dirname(__FILE__) . '\mystem\mystem.exe -i', $out);<br/>
 $q = implode('', $out);<br/>
 return $q;<br/>
}<br/>
<br/>
echo mystem('в мурелки шлепают пельсиски');<br/>
?&gt;


результат вывожу в документе с кодировкой windows-1251


На выходе:

ў{ў??}гаҐ{гаҐ??}ЄЁ{ЄЁ??}и{и=INTJ=|и=PART=|и=S,сокр=им,ед|=S,сокр=им,мн|=S,сокр=род,ед|=S,сокр=род,мн|=S,сокр=дат,ед|=S,сокр=дат,мн|=S,сокр=вин,ед|=S,сокр=вин,мн|=S,сокр=твор,ед|=S,сокр=твор,мн|=S,сокр=пр,ед|=S,сокр=пр,мн|и=CONJ=}ҐЇ{ҐЇ??}ов{ов??}ЇҐ{ЇҐ??}мбЁбЄЁ{мбЁбЄЁ??}



Обработана корректно только буква и, все остальное — кракозябры.


Из-за чего так происходит? Что я делаю не так? Пожалуйста, объясните ошибки. Заранее спасибо.

Update: antoo, спасибо, ваше решение работает.


В итоге сделал так для кода в utf-8:

&lt;?php<br/>
function mystem($q) {<br/>
 $q = iconv(&quot;utf-8&quot;, &quot;windows-1251&quot;, $q);<br/>
 $result = exec('echo &quot;'.$q.'&quot; | mystem.exe -i -e cp866');<br/>
 $result = iconv(&quot;cp866&quot;, &quot;utf-8&quot;, $result);<br/>
 return $result;<br/>
}<br/>
<br/>
header(&quot;Content-type: text/html; charset=utf-8&quot;);<br/>
echo mystem('в мурелки шлепают пельсиски');<br/>
?&gt;<br/>



Для меня все же осталось загадкой, почему в скрипт отдается строка в windows-1251, а указывается cp866 (а не cp1251, что вроде как правильно), но задача решена.


То, что скрипт не корректно отрабатывает при -e utf8, видимо, косяк mystem, т.к. с файлами в этой кодировке он справляется без проблем.
  • Вопрос задан
  • 8945 просмотров
Решения вопроса 1
antoo
@antoo
У меня работает такой вариант:
image

<?php
function mystem($q) {
	$result = exec('echo "'.$q.'" | mystem.exe -i -e cp866');
	$result = iconv("cp866", "windows-1251", $result);
	return $result;
}

echo mystem('в мурелки шлепают пельсиски');

Кодировка скрипта: ANSI (Notepad++)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
antoo
@antoo
mystem — консольное приложение, в консоли используется кодировка 866.
можно попробовать:
$q = convert_cyr_array($q,"k","w");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы