Частота слов в тексте на неанглийском языке: как я могу объединить единичные и множественные формы и т. Д.?

Я сортирую слова французского языка в некоторых текстовых файлах по частоте с упором на понимание, а не на статистическую значимость. Задача состоит в том, чтобы сохранить акцентированные символы и иметь дело с формами статей перед гласными ( l' , d' ) в контексте формирования слово-токенов для сортировки.

Тема наиболее часто встречающихся слов в файле принимает много форм ( 1 | 2 | 3 | 4 ). Поэтому я собрал эту функцию, используя утилиты GNU :

 compt1 () { for i in *.txt; do echo "File: $i" sed -e 's/ /\ /g' <"$i" | sed -e 's/^[[:alpha:]][[:punct:]]\(.*\)/\1/' | sed -e 's/\(.*\)/\L\1/' | grep -hEo "[[:alnum:]_'-]+" | grep -Fvwf /path_to_stop_words_file | sort | uniq -c | sort -rn done } 

… который торгует пространства для строк новой строки; выравнивает символ, за которым следует пунктуация, которая находится в начале строки; затем преобразует все в нижний регистр; использует эту компактную конструкцию grep которая соответствует символьным составляющим символам для создания токенов; затем удаляет слова остановки, и, наконец, обычная сортировка. Стоп-файл содержит сегмент с отдельными символами, поэтому вам нужно быть осторожным с тем, как он используется, но анализ, предоставляемый по созданию стеблей для слов на разных языках, действительно интересен!

Теперь, когда я сравниваю частоту значимого слова с выходом grep -c непосредственно на файлы, я думаю, что он достаточно близко в пределах некоторой погрешности.


Вопросы :

  • Как я могу изменить это, чтобы объединить частоту множественных чисел с их особыми формами, т.е. словами, использующими общий префикс с переменным 1 символьным суффиксом?
  • Я пытаюсь оценить, будет ли часть grep в частности, работать с тем, что находится на OSX ?

1. Я не могу предоставить исходные данные, но я могу предоставить этот файл в качестве примера. Примером могут служить слова heure и enfant в тексте. Первый текст дважды появляется в тексте, включая один раз «l'heure», и помогает проверить, работает ли команда или нет. Последний появляется как в форме единственного числа, так и во множественном числе ( enfant / enfants ) и выиграет от объединения здесь.

Вы действительно не сможете это сделать с помощью упрощенного сценария sed . Я предполагаю, что вы захотите сводить к «формам цитаты», сворачивая все перегибы в базовую форму.

Это означает, что прилагательные, такие как протеже, протеже, протеже, протеже, считаются одним и тем же, базовым прилагательным / причастием протеже . Точно так же все перегибы глагола protéger – как protège, protégeons, protégeais, protégeasse, protégeâmes, protégeront , protégeraient и т. Д. – все сводятся к этому базовому глаголу.

Это означает, что вам нужно знать, что такое флективная морфология языка. Хуже того, вам нужно будет понять что-то о фактическом синтаксисе языка, в том числе о перегибах и о различии в гомографах.

Я сделал очень простые подходы, по крайней мере, к первой части этого, используя Perl. Это действительно боль в заднице. Вот пример кода, который я использовал для создания ключей сортировки для городов и поселков на Иберийском полуострове:

        # 1-я полоса ведущих статей
           s / ^ L '//;  # Каталанский
           s {^
             (?:
         # Кастильский
                 El
               |  Los
               |  ля
               |  Las

         # Каталанский 
               |  высота инструмента
               |  Les         
               |  Sa
               |  Es

         # Gallego
               |  О       
               |  Операционные системы
               | 
               |  В виде      
             ) 
             \ s + 
           }{}Икс;
         # 2 части внутренних частиц
           с / \ Ъ [дл] '// г;  # Каталанский
           s { 
             \ б
             (?:
                 el |  los |  la |  las |  de |  del |  да
               |  els |  les |  i |  sa |  es |  dels # CA 
               |  o |  os |  a |  как |  сделать |  da |  dos |  das # GAL
             )
             \ б
         }} {Дх;

Это разбивает статьи и частицы так, чтобы они не учитывались для целей сортировки. Но вам придется иметь дело с такими формами, как l'autre, с так называемой курчавой цитатой, которая на самом деле является U + 2019 RIGHT SINGLE QUOTATION MARK, предпочтительной формой для апострофа. Я нормализовал их на прямые, сначала s/'/'/g .

О, и вам придется иметь дело с кодировками: MacRoman – это не то же самое, что UTF-8 или ISO-8859-1 – не длинным выстрелом.

Честно говоря, вы, вероятно, захотите использовать что-то вроде алгоритма «Снежка», определяя французский как язык. Конечно, модуль Lingua::Stem::Snowball Perl знает, как это сделать. Вы можете искать модули Perl, связанные с французской лингвистикой, используя этот запрос .

Но отвлечение вас займет только до сих пор. Вы действительно не будете делать хорошую работу, пока не будете применять морфосинтактический анализ, а это значит, что вам нужно создать синтаксический анализ предложений и назначить части речи каждому элементу.

Для этого требуется гораздо больше работы. Хорошей новостью является то, что для этого есть специальные инструменты, некоторые из которых действительно работают на французском языке. Но это действительно сильно укусит, потому что теперь вы отважились в области обработки естественного языка и вычислительной лингвистики. Здесь нет большого места для таких вопросов, но на них, возможно, лучше ответить на лингвистику.SE; Я не знаю.

Обработка естественного языка сложна. Выполнение его с помощью регулярных выражений похоже на разбор HTML с регулярными выражениями , только хуже. Прочтите превосходный ответ tchrist за некоторое понимание того, как использовать подход к вашей проблеме. Я кратко расскажу о переносимости использования инструментов обработки текста unix.

Общий знаменатель для всех современных Unix-подобных систем – это спецификация POSIX . Самый полезный ресурс – это проблема с Open Group Specification Issue 6 aka Single Unix Specification version 3 (OGS Issue 7 = SUS version 4 не полностью реализована во многих системах), которая включает и расширяет POSIX и, что удобнее, доступна онлайн и для загрузки ( например, в Debian ). Если вас интересует переносимость не встроенных Linux (и Cygwin) и OSX, ознакомьтесь с руководствами GNU и справочными страницами OSX .

Вы используете несколько параметров, отличных от POSIX, для grep , но все они доступны как в GNU, так и OSX (OSX использует grep из FreeBSD, который пытается имитировать большинство конструкций GNU). Если вы хотите POSIX, вам нужно избегать нескольких вариантов:

  • grep -h чтобы подавить имя файла: вызовите grep по одному файлу за один раз или сначала передайте файлы cat .
  • grep -o для вывода только согласованной части: вместо этого используйте sed или awk .
  • grep -w соответствует только целым словам: найдите шаблон, подобный (^|[^[:alnum:]])needle($|[^[:alnum:]]) .

Вы используете одну конструкцию GNU в директиве sed: the \L для замены в команде s в нижнем регистре. В других реализациях sed нет ничего подобного. В общем случае вы можете использовать awk: сломайте вход, чтобы изолировать строку для замены и вызвать tolower . Для ввода всего ввода введите tr '[:upper:]' '[:lower:]' .

Выбранный ответ действительно дает большое представление о проблемах в области обработки естественного языка и вычислительной лингвистики, и, безусловно, есть дополнительная информация об выделенных активах SE . Я хотел предоставить дополнение, которое подчеркивает эти проблемы и дает мне временное «исправление».


Я думаю, что в некоторых случаях я могу обрезать последние s с sed для достижения довольно безопасного, но интересного результата:

 s/\(.*[bcdefghjklmnpqrtvwxyzéëêàâûùôö]\)s$/\1/ 

При использовании с оригинальной функцией это уплотняет около 50 строк в предоставленном образце.

Поэтому я попробовал sed со следующим, что является неполным и не работает должным образом, – но демонстрирует трудности и полезно, на мой взгляд, в понимании того, что объяснил ответ:

 sed ' h; s/^\(par\|col\|tap.*\)/\1/ t RVv h; s/^\(par\|col\|tap.*\)/\1/ t RVc h; s/^\([aeiouyâàëéêèïîôûù][aeiouyâàëéêèïîôûù]..*\)$/\1/ t RVnotpctv_v h; s/^\(.*.[aeiouyâàëéêèïîôûù]....*\)/\1/ t RVnotpctother b :RVv s/^\(par\|col\|tap[bcdfghjklmnpqrstvwxz][aeiouyâàëéêèïîôûù].*\)/\1/ t R1 :RVc s/^\(par\|col\|tap[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)/\1/ t R1 :RVnotpctv_v s/^\([aeiouyâàëéêèïîôûù][aeiouyâàëéêèïîôûù].[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)$/\1/ t R1 :RVnotpctother s/^\(.*[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)/\1/ t R1 :R1 s/ement$\|ements$\|ité$\|ités$\|if$\|ive$\|ifs$\|ives$\|euse$\|euses$// s/é$\|ée$\|ées$\|és$\|èrent$\|er$\|era$\|erai$\|eraIent$\|erais$\|erait$\|eras$\|erez$\|eriez$\|erions$\|erons$\|eront$\|ez$\|iez$\|ions$\|eons$// s/eâmes$\|eât$\|eâtes$\|ea$\|eai$\|eaIent$\|eais$\|eait$\|eant$\|eante$\|eantes$\|eants$\|eas$\|easse$\|eassent$\|easses$\|eassiez$\|eassions$// s/âmes$\|ât$\|âtes$\|a$\|ai$\|aIent$\|ais$\|ait$\|ant$\|ante$\|antes$\|ants$\|as$\|asse$\|assent$\|asses$\|assiez$\|assions$// s/[bcdfghjklmnpqrstvwxz]îmes$\|ît$\|îtes$\|i$\|ie$\|ies$\|ir$\|ira$\|irai$\|iraIent$\|irais$\|irait$\|iras$\|irent$\|irez$\|iriez$\|irions$\|irons$\|iront$\|is$\|issaIent$\|issais$\|issait$\|issant$\|issante$\|issantes$\|issants$\|isse$\|issent$\|isses$\|issez$\|issiez$\|issions$\|issons$\|it$// s/Y/i/ s/ç/c/ t R2 :R2 s/ance$\|iqUe$\|isme$\|able$\|iste$\|eux$\|ances$\|iqUes$\|ismes$\|ables$\|istes$// s/atrice$\|ateur$\|ation$\|atrices$\|ateurs$\|ations$// s/logie$\|logies$/log/ s/usion$\|ution$\|usions$\|utions$/u/ t Res :Res ##Residual s/ier$\|ière$\|Ier$\|Ière$/i/ s/\(.*[bcdefghjklmnpqrtvwxyzéëêàâûùôö]\)s$/\1/ ##Undouble s/\(en\)n$/\1/ s/\(on\)n$/\1/ s/\(et\)t$/\1/ s/\(el\)l$/\1/ s/\(eil\)l$/\1/ ##Unaccent s/\(.*\)\(é\)\([bcdefghjklmnpqrtvwxyzéëêàâûùôö]*\)$/\1e\3/ s/\(.*\)\(è\)\([bcdefghjklmnpqrtvwxyzéëêàâûùôö]*\)$/\1e\3/ s/\(.*\)e$/\1/ t ' в sed ' h; s/^\(par\|col\|tap.*\)/\1/ t RVv h; s/^\(par\|col\|tap.*\)/\1/ t RVc h; s/^\([aeiouyâàëéêèïîôûù][aeiouyâàëéêèïîôûù]..*\)$/\1/ t RVnotpctv_v h; s/^\(.*.[aeiouyâàëéêèïîôûù]....*\)/\1/ t RVnotpctother b :RVv s/^\(par\|col\|tap[bcdfghjklmnpqrstvwxz][aeiouyâàëéêèïîôûù].*\)/\1/ t R1 :RVc s/^\(par\|col\|tap[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)/\1/ t R1 :RVnotpctv_v s/^\([aeiouyâàëéêèïîôûù][aeiouyâàëéêèïîôûù].[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)$/\1/ t R1 :RVnotpctother s/^\(.*[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)/\1/ t R1 :R1 s/ement$\|ements$\|ité$\|ités$\|if$\|ive$\|ifs$\|ives$\|euse$\|euses$// s/é$\|ée$\|ées$\|és$\|èrent$\|er$\|era$\|erai$\|eraIent$\|erais$\|erait$\|eras$\|erez$\|eriez$\|erions$\|erons$\|eront$\|ez$\|iez$\|ions$\|eons$// s/eâmes$\|eât$\|eâtes$\|ea$\|eai$\|eaIent$\|eais$\|eait$\|eant$\|eante$\|eantes$\|eants$\|eas$\|easse$\|eassent$\|easses$\|eassiez$\|eassions$// s/âmes$\|ât$\|âtes$\|a$\|ai$\|aIent$\|ais$\|ait$\|ant$\|ante$\|antes$\|ants$\|as$\|asse$\|assent$\|asses$\|assiez$\|assions$// s/[bcdfghjklmnpqrstvwxz]îmes$\|ît$\|îtes$\|i$\|ie$\|ies$\|ir$\|ira$\|irai$\|iraIent$\|irais$\|irait$\|iras$\|irent$\|irez$\|iriez$\|irions$\|irons$\|iront$\|is$\|issaIent$\|issais$\|issait$\|issant$\|issante$\|issantes$\|issants$\|isse$\|issent$\|isses$\|issez$\|issiez$\|issions$\|issons$\|it$// s/Y/i/ s/ç/c/ t R2 :R2 s/ance$\|iqUe$\|isme$\|able$\|iste$\|eux$\|ances$\|iqUes$\|ismes$\|ables$\|istes$// s/atrice$\|ateur$\|ation$\|atrices$\|ateurs$\|ations$// s/logie$\|logies$/log/ s/usion$\|ution$\|usions$\|utions$/u/ t Res :Res ##Residual s/ier$\|ière$\|Ier$\|Ière$/i/ s/\(.*[bcdefghjklmnpqrtvwxyzéëêàâûùôö]\)s$/\1/ ##Undouble s/\(en\)n$/\1/ s/\(on\)n$/\1/ s/\(et\)t$/\1/ s/\(el\)l$/\1/ s/\(eil\)l$/\1/ ##Unaccent s/\(.*\)\(é\)\([bcdefghjklmnpqrtvwxyzéëêàâûùôö]*\)$/\1e\3/ s/\(.*\)\(è\)\([bcdefghjklmnpqrtvwxyzéëêàâûùôö]*\)$/\1e\3/ s/\(.*\)e$/\1/ t ' социологическое sed ' h; s/^\(par\|col\|tap.*\)/\1/ t RVv h; s/^\(par\|col\|tap.*\)/\1/ t RVc h; s/^\([aeiouyâàëéêèïîôûù][aeiouyâàëéêèïîôûù]..*\)$/\1/ t RVnotpctv_v h; s/^\(.*.[aeiouyâàëéêèïîôûù]....*\)/\1/ t RVnotpctother b :RVv s/^\(par\|col\|tap[bcdfghjklmnpqrstvwxz][aeiouyâàëéêèïîôûù].*\)/\1/ t R1 :RVc s/^\(par\|col\|tap[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)/\1/ t R1 :RVnotpctv_v s/^\([aeiouyâàëéêèïîôûù][aeiouyâàëéêèïîôûù].[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)$/\1/ t R1 :RVnotpctother s/^\(.*[aeiouyâàëéêèïîôûù][bcdfghjklmnpqrstvwxz].*\)/\1/ t R1 :R1 s/ement$\|ements$\|ité$\|ités$\|if$\|ive$\|ifs$\|ives$\|euse$\|euses$// s/é$\|ée$\|ées$\|és$\|èrent$\|er$\|era$\|erai$\|eraIent$\|erais$\|erait$\|eras$\|erez$\|eriez$\|erions$\|erons$\|eront$\|ez$\|iez$\|ions$\|eons$// s/eâmes$\|eât$\|eâtes$\|ea$\|eai$\|eaIent$\|eais$\|eait$\|eant$\|eante$\|eantes$\|eants$\|eas$\|easse$\|eassent$\|easses$\|eassiez$\|eassions$// s/âmes$\|ât$\|âtes$\|a$\|ai$\|aIent$\|ais$\|ait$\|ant$\|ante$\|antes$\|ants$\|as$\|asse$\|assent$\|asses$\|assiez$\|assions$// s/[bcdfghjklmnpqrstvwxz]îmes$\|ît$\|îtes$\|i$\|ie$\|ies$\|ir$\|ira$\|irai$\|iraIent$\|irais$\|irait$\|iras$\|irent$\|irez$\|iriez$\|irions$\|irons$\|iront$\|is$\|issaIent$\|issais$\|issait$\|issant$\|issante$\|issantes$\|issants$\|isse$\|issent$\|isses$\|issez$\|issiez$\|issions$\|issons$\|it$// s/Y/i/ s/ç/c/ t R2 :R2 s/ance$\|iqUe$\|isme$\|able$\|iste$\|eux$\|ances$\|iqUes$\|ismes$\|ables$\|istes$// s/atrice$\|ateur$\|ation$\|atrices$\|ateurs$\|ations$// s/logie$\|logies$/log/ s/usion$\|ution$\|usions$\|utions$/u/ t Res :Res ##Residual s/ier$\|ière$\|Ier$\|Ière$/i/ s/\(.*[bcdefghjklmnpqrtvwxyzéëêàâûùôö]\)s$/\1/ ##Undouble s/\(en\)n$/\1/ s/\(on\)n$/\1/ s/\(et\)t$/\1/ s/\(el\)l$/\1/ s/\(eil\)l$/\1/ ##Unaccent s/\(.*\)\(é\)\([bcdefghjklmnpqrtvwxyzéëêàâûùôö]*\)$/\1e\3/ s/\(.*\)\(è\)\([bcdefghjklmnpqrtvwxyzéëêàâûùôö]*\)$/\1e\3/ s/\(.*\)e$/\1/ t ' 

В некоторых случаях преуспевает в том, чтобы лишить слово какой-то основы, но есть очень сознательный выбор, чтобы не иметь дело со словами, содержащими только несколько символов, потому что он реализует лишь некоторые небольшие функции (а не R2, например), и это плохо. Но он сжимает еще 50-60 строк в выборке, так как включает в себя предыдущее выражение sed . 2 Для дальнейшего понимания я изучу лингвистику !


1. Все это основано на моем «понимании» псевдокода / описания французского алгоритма снежного кома .

2. Во многих случаях это неверно, но интерактивное взаимодействие на линии дало мне понимание, которое я искал, рассматривая такие слова, как parlons et bonbons . Я понял, что в этих двух словах нет ничего внутреннего, которое диктует, почему первый (глагол) должен быть оторван от своих благ, а другой (существительное) только от его s . Речь идет о разборе частей речи, как было объяснено …