문제

정보 검색 학위를 취득하지 않고도 주어진 텍스트 본문에서 단어가 나타나는 빈도를 계산하는 알고리즘이 있는지 알고 싶습니다.목표는 일련의 텍스트 주석을 통해 사람들이 말하는 내용에 대한 "일반적인 느낌"을 얻는 것입니다.의 라인을 따라 워들.

내가 원하는 것:

  • 관사, 대명사 등('a', 'an', 'the', 'him', 'them' 등)을 무시합니다.
  • 고유명사를 보존하다
  • 소프트 종류를 제외하고 하이픈 무시

별에 도달하면 복숭아 같을 것입니다.

  • 형태소 분석 및 복수형 처리(예:좋아요, 좋아요, 좋아요, 좋아요는 같은 결과로 일치합니다)
  • 형용사(부사 등)와 주제("훌륭한", "서비스"가 아닌 "훌륭한 서비스") 그룹화

나는 Wordnet을 사용하여 몇 가지 기본적인 작업을 시도했지만 맹목적으로 조정하고 그것이 내 특정 데이터에 작동하기를 바라고 있습니다.좀 더 일반적인 것이 좋을 것입니다.

도움이 되었습니까?

해결책

하나가 아니라 다음과 같은 여러 가지 좋은 알고리즘이 필요합니다.

  • 대명사 무시는 다음을 통해 수행됩니다. 중지 목록.
  • 고유명사를 보존한다고요?즉, 다음과 같은 명명된 엔터티를 감지한다는 뜻입니다. 후버 "이건 한 단어야"라고 말하거나 복합 명사를 사용하는 거죠. 프로그램 작성 언어?힌트를 드리겠습니다:어려운 일이지만 두 가지 모두에 대한 라이브러리가 있습니다.NER(명명된 엔터티 인식) 및 어휘 청킹을 찾아보세요. 오픈NLP 두 가지를 모두 수행하는 Java-Toolkit입니다.
  • 하이픈 넣기를 무시하시나요?줄 바꿈 같은 거요?정규 표현식을 사용하고 사전 조회를 통해 결과 단어를 확인하세요.
  • 복수형/어간 분석 처리:당신은 조사 할 수 있습니다 눈덩이 스테머.그것은 트릭을 훌륭하게 수행합니다.
  • 형용사와 명사를 "그룹화"하는 것은 일반적으로 다음과 같은 작업입니다. 얕은 구문 분석.하지만 특별히 질적 형용사(좋다, 나쁘다, 형편없다, 놀랍다...)를 찾고 있다면 다음 사항에 관심이 있을 수 있습니다. 감정 분석. 링파이프 이 외에도 훨씬 더 많은 일을 합니다.

미안해요. 당신이 KISS하고 싶다고 말한 건 알지만, 불행히도 당신의 요구는 들어주기가 쉽지 않습니다.그럼에도 불구하고 이 모든 것을 위한 도구가 존재하며, 원하지 않는 경우 직접 작업을 수행할 필요 없이 도구를 함께 묶을 수 있어야 합니다.작업을 직접 수행하고 싶다면 형태소 분석을 살펴보는 것이 좋습니다. 가장 쉬운 방법입니다.

Java를 사용하는 경우 결합 루씬 와 더불어 오픈NLP 툴킷.Lucene에는 이미 형태소 분석기와 많은 튜토리얼이 내장되어 있으므로 매우 좋은 결과를 얻을 수 있습니다.반면에 OpenNLP 툴킷은 문서화가 잘 되어 있지 않지만 너무 많은 내용이 필요하지는 않습니다.당신은 또한에 관심이있을 수 있습니다 NLTK, Python으로 작성되었습니다.

얕은 구문 분석이 필요하고 결과에 영향을 주지 않기 때문에 마지막 요구 사항을 삭제한다고 말하고 싶습니다.

아, 그런데.당신이 찾고 있던 문서 용어 빈도의 정확한 용어는 다음과 같습니다. tf-idf.용어에 대한 문서 빈도를 찾는 가장 좋은 방법입니다.이를 올바르게 수행하려면 다차원 벡터 행렬을 사용하지 마십시오.

...네, 알아요.IR 세미나를 듣고 Google에 대한 존경심이 더욱 커졌습니다.하지만 IR에서 몇 가지 일을 하고 난 후에는 그들에 대한 존경심도 빠르게 떨어졌습니다.

다른 팁

NLP의 세계에 오신 것을 환영합니다 ^_^

필요한 것은 약간의 기본 지식과 몇 가지 도구뿐입니다.

문장의 단어가 명사인지, 형용사인지, 동사인지 알려주는 도구가 이미 있습니다.그들 불리는 품사 태거.일반적으로 일반 텍스트 영어를 입력으로 사용하고 단어, 기본 형식 및 품사를 출력합니다.다음은 게시물의 첫 번째 문장에 있는 인기 있는 UNIX 품사 태거의 출력입니다.

$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english 
# Word  POS     surface form
Without IN  without
getting VVG get
a   DT  a
degree  NN  degree
in  IN  in
information NN  information
retrieval   NN  retrieval
,   ,   ,
I   PP  I
'd  MD  will
like    VV  like
to  TO  to
know    VV  know
if  IN  if
there   EX  there
exists  VVZ exist
any DT  any
algorithms  NNS algorithm
for IN  for
counting    VVG count
the DT  the
frequency   NN  frequency
that    IN/that that
words   NNS word
occur   VVP occur
in  IN  in
a   DT  a
given   VVN give
body    NN  body
of  IN  of
text    NN  text
.   SENT    .

보시다시피, "알고리즘"은 "알고리즘"의 복수 형태 (NNS)와 "존재"의 컨쥬 게이션 (VBZ)으로 "존재"로 식별했습니다. 또한 "A"와 "The"As "DeGiners (DT)" - 기사의 또 다른 단어를 식별했습니다.보시다시피 POS 태거는 구두점도 토큰화했습니다.

목록의 마지막 지점을 제외한 모든 작업을 수행하려면 POS 태거를 통해 텍스트를 실행하고 관심 없는 범주(결정사, 대명사 등)를 필터링하고 기본 형태의 빈도를 계산하면 됩니다. 단어.

다음은 인기 있는 POS 태거입니다.

트리태거 (바이너리만:리눅스, 솔라리스, OS-X)
지니아 태거 (C++:스스로 컴파일)
스탠포드 POS 태거 (자바)

목록의 마지막 작업을 수행하려면 단어 수준의 정보 이상이 필요합니다.시작하는 쉬운 방법은 계산하는 것입니다. 시퀀스 ~의 단어 말 자체보다는.이들은 호출됩니다 n-그램.시작하기 좋은 곳은 시인을 위한 유닉스.NLP에 관한 책에 투자할 의향이 있다면 추천하고 싶습니다. 통계적 자연어 처리의 기초.

다음은 Python에서 이를 수행하는 방법에 대한 예입니다. 개념은 모든 언어에서 유사합니다.

>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
      if item not in skip:
        try:
          results[item] += 1
        except KeyError:
          results[item] = 1

>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...

첫 번째 줄은 문제의 일부를 해결하는 데 도움이 되는 라이브러리를 가져옵니다. 두 번째 줄에서는 urllib2가 Ambrose Bierce의 "Devil's Dictionary" 복사본을 다운로드합니다. 다음 줄은 구두점 없이 텍스트의 모든 단어 목록을 만듭니다.그런 다음 해시 테이블을 생성합니다. 이 경우 숫자와 관련된 고유 단어 목록과 같습니다.for 루프는 Bierce 책의 각 단어를 검토합니다. 테이블에 해당 단어에 대한 레코드가 이미 있는 경우 새로 발생할 때마다 테이블의 해당 단어와 연관된 값에 1이 추가됩니다.해당 단어가 아직 표시되지 않은 경우 해당 단어는 1의 값(한 번 발생함을 의미)으로 테이블에 추가됩니다. 예를 들어 대문자를 사용하는 등 세부 사항에 훨씬 더 많은 주의를 기울이고 싶을 것입니다. 문장 중간 등에서만 고유명사 식별을 돕기 위해 이것은 매우 거칠지만 개념을 표현합니다.

형태소 분석 및 복수화 작업에 들어가 실험하고 제3자 작업을 살펴보기 위해 저는 학문적 오픈 소스 프로젝트인 NLTK의 일부도 Python으로 즐겼습니다.

나는 얼마 전에 이 작업을 수행하기 위한 전체 프로그램을 작성했습니다.나중에 집에 가면 데모를 업로드할 수 있습니다.

다음은 코드입니다(asp.net/c#).시간ttp://naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

질문의 첫 번째 부분은 그렇게 나쁘지 않은 것 같습니다.기본적으로 해야 할 일은 파일(또는 스트림으로 스트리밍)에서 각 단어를 읽고 이를 접두사 트리에 배치하는 것뿐입니다. 그리고 이미 존재하는 단어를 발견할 때마다 해당 단어와 관련된 값이 증가합니다.물론 계산에서 제외하고 싶은 모든 항목의 무시 목록도 갖게 됩니다.

접두사 트리를 사용하는 경우 모든 단어를 찾는 것이 O(N)으로 진행되는지 확인합니다. 여기서 N은 데이터 세트에 있는 단어의 최대 길이입니다.이 상황에서 접두사 트리의 장점은 복수형과 어간을 찾고 싶은 경우 단어에 대해 가능한 경우 O(M+1)에서 확인할 수 있다는 것입니다. 여기서 M은 어간이나 복수형이 없는 단어의 길이입니다. (그게 말이 되나요?헤헤).접두사 트리를 구축한 후에는 어간 등에 대해 다시 분석하고 압축하여 루트 단어가 결과를 유지하도록 합니다.

검색 시 뿌리나 줄기 또는 무엇을 가지고 있는 경우 일치 항목이 긍정적으로 반환되도록 하는 몇 가지 간단한 규칙을 적용할 수 있습니다.

두 번째 부분은 매우 어려운 것 같습니다.나의 순진한 성향은 형용사-주어 그룹화에 대해 별도의 결과를 보유하는 것입니다.위와 동일한 원칙을 사용하되 별도로 유지하세요.

의미 분석을 위한 또 다른 옵션은 각 문장을 주어, 동사 등의 관계 트리로 모델링하는 것입니다(문장에는 주어와 동사가 있고, 주어에는 명사와 형용사가 있습니다 등).이런 식으로 모든 텍스트를 분류하고 나면 실행하고 발생한 다양한 적절한 쌍을 빠르게 계산하는 것이 상당히 쉬울 것 같습니다.

좀 더 나은 아이디어가 있을 거라고 확신하지만 저는 이런 것에 대해 생각하는 것을 좋아합니다.

방금 설명한 알고리즘입니다."Do it"이라고 적힌 큰 버튼이 있는 프로그램...모르겠습니다.

하지만 건설적인 입장을 취하겠습니다.이 책을 추천합니다 집단지성 프로그래밍.3장과 4장은 매우 실용적인 예를 담고 있습니다(실제로 복잡한 이론은 없고 단지 예만 있습니다).

월드넷 사전을 사용하여 과거 말과 같은 질문 키워드의 기본 정보를 얻고 동의어를 추출할 수 있으며 문서에 대해 동일한 작업을 수행하여 색인을 만들 수도 있습니다.그러면 색인 파일과 키워드를 쉽게 일치시키고 문서 순위를 지정할 수 있습니다.그런 다음 그것을 여름화하십시오.

귀하가 나열한 모든 내용은 다음에서 잘 처리됩니다. 적응력이 있는.

  1. 일부 단어를 무시하세요. 중지 단어를 사용하세요.
  2. 주제 추출 - 음성 태그 지정을 사용하여 식별합니다(즉시 작동).문장이 구문 분석된 후 문장의 주요 동사인 "ROOT"를 찾습니다.에 의해 구문 분석 트리 탐색 이 동사와 관련된 명사를 찾을 수 있습니다.주제가 될 것입니다.
  3. 하이픈 무시 - 토크나이저는 대부분의 경우 하이픈을 처리합니다.더 많은 특별한 경우를 처리하기 위해 쉽게 확장할 수 있습니다.

주제 목록이 미리 결정되어 있고 크지 않은 경우에는 더 나아갈 수도 있습니다.주제를 예측하는 분류 모델을 구축합니다.10개의 과목이 있다고 가정해 보겠습니다.샘플 문장이나 텍스트를 수집합니다.다른 제품에 로드합니다. 신동.훌륭한 인터페이스를 사용하면 샘플에 주제를 빠르게 할당할 수 있습니다.마지막으로 분류된 샘플을 사용하여 공간 모델을 훈련하여 텍스트나 문장의 주제를 예측합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top