영어가 아닌 텍스트의 단어 빈도: 단수형과 복수형을 결합하는 방법 등?

영어가 아닌 텍스트의 단어 빈도: 단수형과 복수형을 결합하는 방법 등?

정렬 중이에요프랑스 국민일부 텍스트 파일의 언어 단어는 다음을 기반으로 합니다.빈도집중하다통찰력통계적 의미보다는 문제는 악센트가 있는 문자를 보존하고 처리하는 것입니다.기사 형식순서를 위한 단어 표식 형성의 맥락에서 모음( l', ) 앞에 옵니다.d'

주제는가장 빈번한파일에 있는 단어는 다양한 형태로 나타납니다(1|2||4). 그래서 저는 이 기능을 사용하여 결합합니다.암소 비슷한 일종의 영양유용:

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. 원본 데이터를 제공할 수는 없지만 제공할 수는 있습니다.이것파일을 예로 들어보겠습니다. 만약에시간그리고유아본문에 예가 나와 있습니다. 전자는 텍스트에 두 번 나타납니다(한 번은 "l'heure"). 이는 명령이 유효한지 확인하는 데 도움이 됩니다. 후자는 단수형과 복수형으로 나타납니다(유아/유아) 여기에 통합되면 이익을 얻을 수 있습니다.

답변1

간단한 스크립트로는 sed이 작업을 수행 할 수 없습니다. 나는 당신이 "인용 형식"으로 단순화하고 모든 굴절을 기본 형식으로 축소하기를 원한다고 가정합니다.

이는 다음과 같은 형용사를 의미합니다.제자, 제자, 제자, 제자모두 같은 것, 기본 형용사/분사로 간주됩니다.제자. 마찬가지로, 동사의 모든 활용형보호자- 좋다protège, protégeons, protégeais, protégeasse, protégeâmes, protégeront, protégeraient등 - 기본 동사로 축소됩니다.

이는 언어의 굴절 형태를 이해해야 함을 의미합니다. 더 나쁜 것은 활용 및 동형이의어 구별을 포함하여 언어의 실제 문법에 대해 알아야 한다는 것입니다.

난 끝냈어매우최소한 Perl을 사용하여 첫 번째 부분을 구현하는 간단한 방법이 있습니다. 이것은 참으로 매우 고통스러운 일입니다. 다음은 이베리아 반도의 도시에 대한 정렬 키를 생성하는 데 사용하는 코드의 예입니다.

       # 주요 기사 1
          s/^L'//; # 카탈로니아어
          s{ ^
            (?:
        #카스티야
                엘자
              |로스
              | 당겨
              |러스

        # 카탈로니아어
              |엘스
              |레스         
              |사
              |에이스

        # 갈레고
              |산소       
              |운영체제
              |A
              |으로      
            )
            \s+
          }{}엑스;
        # 두 번째 내부 입자
          s/\b[dl]'//g # 카탈로니아어
          에스{
            \비
            (?:
                el|los|la|ras|de|삭제|예
              |els|les|i|sa|es|#CA 제거
              |오|os|a|as|do|da|os|das #GAL
            )
            \비
        {}gx;

이렇게 하면 항목과 입자가 제거되어 분류 목적으로 계산되지 않습니다. 하지만 다음과 같은 테이블을 처리해야 합니다.오텔실제로 U+2019 오른쪽 작은따옴표인 소위 둥근 따옴표를 사용하면 선호되는 아포스트로피 형태입니다. 먼저 direct 로 정규화합니다 s/’/'/g.

아, 그리고 인코딩 문제도 처리해야 합니다. MacRoman은 UTF-8이나 ISO-8859-1과 동일하지 않습니다. 심지어 가깝지도 않습니다.

솔직히 Snowball 형태소 분석과 같은 기능을 사용하여 프랑스어를 언어로 지정하고 싶을 수도 있습니다. 물론 Perl의 Lingua::Stem::Snowball모듈은 이를 수행하는 방법을 알고 있습니다. 다음 명령어를 사용하면 프랑스어학과 관련된 Perl 모듈을 검색할 수 있습니다.이 쿼리.

그러나 줄기는 지금까지만 당신을 데려갈 수 있습니다. 형태통사 분석을 적용하지 않으면 실제로 좋은 일을 할 수 없습니다. 즉, 문장의 구문 분석을 생성하고 문장의 각 요소에 품사를 할당해야 함을 의미합니다.

이를 위해서는 더 많은 작업이 필요합니다. 좋은 소식은 이를 수행하기 위한 전문 도구가 있으며 그 중 일부는 프랑스어로도 작동한다는 것입니다. 하지만 이제 자연어 처리와 전산 언어학을 접하게 되므로 이는 중요합니다. 이와 같은 질문을 할 수 있는 좋은 곳은 없지만 Linguistics.SE에서 더 나은 답변을 얻을 수 있을지는 모르겠습니다.

답변2

자연어 처리는 복잡합니다. 예를 수행하려면 정규식을 사용하세요.정규식으로 HTML을 구문 분석하는 것과 같습니다., 상황은 더욱 악화될 것입니다. 읽다그리스도의 탁월한 대답몇 가지 통찰력을 사용하여 문제를 해결하는 방법을 알아보세요. UNIX 텍스트 처리 도구의 이식성에 관한 부분에 대해 간략하게 답변해 드리겠습니다.

모든 현대 UNIX 계열 시스템의 공통점은 다음과 같습니다.POSIX 사양. 가장 유용한 리소스는 다음과 같습니다.공개 그룹 사양 문제 6POSIX를 포함하고 확장하며 유용하게도 온라인(예:더반). 비임베디드 Linux(및 Cygwin) 및 OSX의 이식성에만 관심이 있다면 다음을 확인하세요.GNU 매뉴얼그리고OSX 매뉴얼 페이지.

POSIX가 아닌 여러 옵션을 사용하고 있지만 grep모두 GNU 및 OSX에서 사용할 수 있습니다(OSX는 대부분의 GNU 구조를 에뮬레이트하도록 설계된 FreeBSD의 grep을 사용합니다). POSIX를 원하는 경우 피해야 할 몇 가지 옵션이 있습니다.

  • grep -h파일 이름 억제: grep한 번에 하나의 파일을 호출하거나 파일을 cat첫 번째 파일에 전달합니다.
  • grep -o일치하는 부분만 출력:사용sed혹은 awk그 반대로도.
  • grep -w전체 단어만 일치: 유사한 패턴을 검색합니다 (^|[^[:alnum:]])needle($|[^[:alnum:]]).

sed에서 GNU 전용 구성을 사용하고 있습니다. 이는 \Lcommand에서 대체 항목을 소문자로 지정하는 지시문입니다 s. 다른 sed 구현에는 비슷한 상황이 없습니다. 일반적으로 awk를 대신 사용할 수 있습니다. 입력을 분할하여 교체 및 호출할 문자열을 분리합니다 tolower. 전체 입력을 소문자로 바꾸려면 를 호출하세요 tr '[:upper:]' '[:lower:]'.

답변3

이것선택한 답변현장의 과제에 대한 정말 좋은 소개입니다.자연어 처리그리고전산언어학그리고 확실히 더 많은 정보가 있어요전용 SE 자산. 저는 이러한 과제를 강조하고 임시 "해결책"을 제공하는 부록을 제공하고 싶습니다.


어떤 경우에는 꽤 안전하지만 흥미로운 결과를 얻기 위해 마지막 부분을 다듬을 수도 있다고 생각합니다 .ssed

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
'

어떤 경우에는 단어를 특정 줄기까지 성공적으로 제거하지만 단지 몇 개의 문자만 포함하는 단어 처리를 피하기 위한 매우 의식적인 선택이 있습니다.일부작은 함수(대신R2예를 들어) 그리고 그것에 대해 끔찍한 일을 합니다. 하지만 이전 표현식이 포함되어 있기 때문에 샘플에서 50~60줄을 더 압축합니다 sed. 2 더 이해하기 위해 공부하겠습니다.언어학!


1. 이것은 모두 의사코드에 대한 나의 "이해"를 바탕으로 한 것입니다.설명하다~의스노볼프랑스 알고리즘.

2. 많은 경우 틀렸지만 온라인에서 대화형으로 실행하면 다음과 같은 단어를 볼 때 찾고 있던 통찰력을 얻을 수 있었습니다.팔론기다리다사탕. 왜 첫 번째(동사)는 빼앗겨야 ons하고 다른 하나(명사)는 빼앗길 수 밖에 없는지를 결정하는 본질적인 것이 이 두 단어에 없다는 것을 깨달았습니다 s. 그것은 관하여연설의 일부를 분석하다설명대로...

관련 정보