Все существительные русского языка в простом формате
Готового файла в нужном мне простейшем и удобном формате (простой текст, одно слово - одна строка) не нашёл, пришлось сделать самому.
Для начала я взял "все" слова русского языка с указанием части речи, числа, рода и падежа, то есть, морфологический словарь русского языка по Хагену, вот отсюда (hagen-morph.rar). Развёрнутый файл .txt будет более 200 Мб, так что поосторожней с "Блокнотиками", если его скачаете :)
Потом я простенько отобрал оттуда существительные по формальному указанию файла словаря, вот код на PHP:
<?php
function startsWith($haystack, $needle) {
return (substr($haystack, 0, strlen($needle)) === $needle);
}
$f = fopen ('1.txt','r');
$r = fopen ('2.txt','w');
if (!f or !$r) halt ('File error');
$t1 = time ();
$n = 0;
while (!feof($f)) {
$s = fgets($f);
if (strlen(trim($s))<1 or $s[0]==' ') continue;
$w = explode ('|',$s);
if (count($w)<2) continue;
if (startsWith(trim($w[1]),'сущ')==true) {
fputs ($r,trim($w[0])."\r\n");
$n++;
}
}
$t2 = time ();
fclose ($r);
fclose ($f);
echo '<p>'.$n.' word(s) in '.($t2-$t1).' sec.</p>';
?>
Предполагается, что развёрнутый словарь "лежит" под именем 1.txt в папке скрипта, а вывод писался в файл 2.txt.
Символы конца строк - CR/LF, то есть, в формате для Windows. Скрипт может выполняться до 10 секунд, но из-за нехватки памяти "зависать" не должен, так как не пытается засунуть весь файл в оперативку, а читает его построчно.
"Вытащить" только единственное число существительных пришлось вторым маленьким кодом:
<?php
function endsWith ($haystack, $needle) {
$length = strlen($needle);
if ($length == 0) return true;
return (substr($haystack,-$length) === $needle);
}
function pluralForm ($s1, $s2) {
$s1len = strlen($s1);
$s2len = strlen($s2);
if (strncmp($s1,$s2,$s2len-1)==0 and ($s2len == $s1len or $s2len == $s1len+1)) return true;
$suffix = array (
'ек'=>'ки',
'ец'=>'цы',
'ец'=>'ьцы',
'ок'=>'ки',
'енок'=>'ята',
// ''=>'',
);
foreach ($suffix as $suf1=>$suf2) {
if (endsWith($s1,$suf1) and endsWith($s2,$suf2)) return true;
}
return false;
}
$f = fopen ('2.txt','r');
$r = fopen ('3.txt','w');
if (!f or !$r) halt ('File error');
$t1 = time ();
$n = 0;
$s0 = '';
while (!feof($f)) {
$s1 = trim(fgets($f));
if ($s1!=$s0 and pluralForm($s0,$s1)==false) {
fputs ($r,$s1."\r\n");
$n++;
}
$s0 = $s1;
}
$t2 = time ();
fclose ($r);
fclose ($f);
echo '<p>'.$n.' word(s) in '.($t2-$t1).' sec.</p>';
?>
Качество отбора "единственного числа" здесь невысоко, скрипт выполнялся на локальном хосте "Денвер".
Можете исключить из получившегося второго словаря что-то ещё, это легко сделать даже с помощью функций startsWith и endsWith из приведённого кода. Например, вот так можно вывести все слова, заканчивающиеся на "ые":
<?php
function endsWith ($haystack, $needle) {
$length = strlen($needle);
if ($length == 0) return true;
return (substr($haystack,-$length) === $needle);
}
$f = fopen ('3.txt','r');
if (!f) halt ('File error');
$n = 0;
while (!feof($f)) {
$s = trim(fgets($f));
if (endsWith($s,'ые')) echo '<br>'.++$n.' '.$s;
}
fclose ($f);
?>
В реальности исключать такие слова не стоит, ведь окончание "ие" или "ые" может означать не совсем "множественное число", а что-то вроде "русские как нация", группа "Младшенькие" или отряд "Куриные".
В файлах, разумеется, нет имён, географических названий и т.п. Буквы "ё" тоже нигде нет, как и в исходном словаре.
Скачать файлы .txt в архиве .zip (перекодированы в кодировку utf-8 Юникода!)
Словарь с падежами .txt, примерно 1,5 млн словоформ и 35 Мб в кодировке utf-8
27.01.2017, 13:12 [35687 просмотров]

