2009-06-23 5 views
16

(선호하는 PHP에서) n 그램으로 일부 응용 프로그램을 구현하고 싶습니다.N 그램 : 설명 + 2 응용 프로그램


어떤 유형의 n 그램이 대부분의 목적에 더 적합합니까? 단어 수준 또는 문자 수준 n-gram? PHP로 n-gram-tokenizer를 어떻게 구현할 수 있습니까?


먼저 N 그램이 정확히 무엇인지 알고 싶습니다. 이 올바른지? 그것은 n 그램을 이해하는 방법입니다.

문장 : "나는 NY에 살고 있습니다."

단어 수준의 bigrams (N 2가) : 뉴욕 # '

캐릭터 레벨 bigrams (N 2)를'내가 "뉴욕", "", "살고, 살고", # 나는 " ' "#I", "I #", "l", "iv", "ve", "e #", "#i", "in", "n #", "#N" "NY", "Y 번호"당신이 N-g-부품이 배열이있는 경우

, 당신은 중복 된 것들을 삭제하고 주파수를 제공하는 각 부분에 대한 카운터를 추가 :

단어 수준의 bigrams를 : 1 , 1, 1, 1]

문자 레벨 bigrams : [2, 1, 1, ...]

이 정보가 맞습니까?


또한, 나는 당신이 N-g로 할 수있는 사항에 대한 자세한 내용을 보려면 :

  • 가 어떻게 N-그램을 사용하여 텍스트의 언어를 식별 할 수 있습니까?
  • 이중 언어 코퍼스가 없어도 n 그램을 사용하여 기계 번역을 수행 할 수 있습니까?
  • 스팸 필터 (스팸, 햄)를 어떻게 만들 수 있습니까? n-gram을 베이지안 필터와 결합 하시겠습니까?
  • 주제 스포팅은 어떻게합니까? 예 : 농구 또는 개에 관한 텍스트입니까? 내 접근법 ("개"와 "농구"에 대한 Wikipedia 기사에서 다음을 수행하십시오) : 두 문서에 대한 n-gram 벡터를 작성하고, 표준화하고, 맨하탄/유클리드 거리를 계산하십시오. 결과가 가까울수록 1이 더 높습니다. 유사성
  • 당신이 내 응용 프로그램 방식, 특히 마지막에 대해 어떻게 생각하십니까

?


도와 주시면 감사하겠습니다. 미리 감사드립니다!

+0

당신을 위해 PHP 라이브러리가 있습니다. https://packagist.org/packages/drupol/phpngrams –

답변

23

단어 n 그램은 일반적으로 문자 검출과 같은 예외를 제외하고는 대부분의 텍스트 분석 응용 프로그램에 더 유용합니다. 문자 trigram과 같은 것이 더 나은 결과를 제공 할 수 있습니다. 효과적으로, 당신은 검색에 관심이있는 각 언어의 텍스트 코퍼스를위한 n-gram 벡터를 만들 것입니다. 그러면 각 코퍼스의 트라이 그램 빈도를 분류중인 문서의 트라이 그램과 비교할 수 있습니다. 예를 들어, trigram the은 독일어보다 영어로 표시되는 빈도가 높으며 통계적으로 일정 수준의 상관 관계를 제공합니다. 일단 n-gram 형식으로 문서를 작성하면 추가 분석을위한 알고리즘, Baysian 필터, N-Nearest Neighbor, 지원 벡터 머신 등을 선택할 수 있습니다.

언급 한 응용 프로그램 중 기계 번역은 다음과 같습니다. 아마도 가장 멀리 떨어져있는 N 그램만으로는 길을 아주 먼 곳으로 데려 가지 않을 것입니다. 입력 파일을 n 그램 표현으로 변환하는 것은 추가 기능 분석을 위해 데이터를 형식으로 저장하는 방법 일 뿐이지 만 많은 컨텍스트 정보를 잃어 버리면 번역에 유용하지 않을 수 있습니다.

한 가지주의해야 할 점은 한 문서에 벡터 [1,1,1,2,1]을 작성하고 다른 문서에 벡터 [2,1,2,4]를 작성하는 것으로 충분하지 않다는 점입니다 문서, 차원이 일치하지 않는 경우 즉, 벡터의 첫 번째 항목은 한 문서에서는 the이고 다른 문서에서는 is이 아니거나 알고리즘이 작동하지 않습니다. [00001100200,1]과 같은 벡터를 사용하면 대부분의 문서에 관심있는 대부분의 n-gram이 포함되지 않기 때문입니다.이 '라이닝 기능 향상 '이 필수적이며 분석에 포함시킬 Ngram을'사전에 '결정해야합니다. 흔히, 이것은 두 가지 패스 알고리즘으로 구현되며, 먼저 여러 가지 n-gram의 통계적 중요성을 결정하여 유지할 지 결정합니다. 자세한 내용은 Google '기능 선택'을 참조하십시오.

토픽 스포팅을 수행하는 훌륭한 방법으로 Word 기반 n-grams와 Support Vector Machines를 사용하지만 분류 기준을 학습하기 위해 'topic on'및 'topic off'로 분류 된 큰 텍스트의 코퍼스가 필요합니다. citeseerx과 같은 사이트에서이 문제에 대한 다양한 접근법을 설명하는 많은 수의 연구 논문을 찾을 수 있습니다. 이 문제에 대한 유클리드 거리 접근법은 통계적 유의성을 기반으로 개별 n-gram에 비중을 두지 않기 때문에 권장하지 않습니다. 따라서 the, a, isof을 포함하는 두 개의 문서는 모두 Baysian을 포함합니다. 관심있는 n-gram에서 정지 단어를 제거하면 다소 개선 될 것입니다.

+0

이 상세한 답변 주셔서 대단히 감사합니다! 나는 여전히 하나의 마지막 질문을 가지고있다 : 벡터에 대한 단순한 단어에 비해 벡터에 대한 n-gram의 이점은 무엇인가? 내 말은 : 단순히 "I, live, in, NY"대신에 "NY에 살고 있습니다"를 "NY에 살고 있습니다"라고 왜 분할해야합니까? – caw

+4

단어를 피쳐로 사용하는 것은 n = 1 인 단어 기반 n 그램에 필적합니다. n을 늘리면 얻을 수있는 장점은 자신의 기능에서 컨텍스트가 증가한다는 것입니다. 예를 들어 두 개의 문서 모두에 n-gram "The Who"가 포함되어 있다는 사실을 알면 두 사람 모두 "The"와 "Who"가 별도로 포함된다는 것을 아는 것보다 유용 할 수 있습니다. – bdk

+0

고마워! :) 이제는 분명합니다 ... – caw

2

당신은 N-g의 정의에 대해 정확합니다.

당신은 검색 유형의 애플리케이션을위한 단어 수준의 N-그램을 사용할 수 있습니다. 문자 수준 n 그램은 텍스트 자체의 분석을 위해 더 많이 사용될 수 있습니다. 예를 들어, 텍스트의 언어를 식별하기 위해, 나는 언어의 확립 된 빈도와 비교하여 글자의 빈도를 사용할 것입니다. 즉, 텍스트는 해당 언어의 문자 발생 빈도와 대략 일치해야합니다.

PHP에서 단어

의 n-g 토크 나이는 사용 strtok를 수행 할 수 있습니다 : 문자 분할 사용하십시오

http://us2.php.net/manual/en/function.strtok.php

이 : 그럼

http://us2.php.net/manual/en/function.str-split.php

을 당신처럼 배열을 분할 할 수 있습니다 당신은 임의의 수의 n-gram을 원합니다.

베이지안 필터는 n 그램과 함께 사용할 수있는 스팸 필터로 사용하도록 교육 받아야합니다. 그러나 그것을 배우기 위해서는 충분한 정보를 제공해야합니다.

마지막 접근 방법은 페이지의 컨텍스트를 학습하는 것만 큼 깔끔한 것처럼 들리지만 ... 그래도 여전히 어려운 일이지만 n-gram은 시작하기 좋은 출발점처럼 들립니다.

+0

감사합니다.나는 스페이스 토큰, 쉼표, 점, 밑줄, 괄호 등등과 같은 많은 토큰을 추가해야하기 때문에 strtok은 좋은 토큰 화를하기에는 너무 단순하다고 생각한다.하지만 첫 번째 단락 인 유스 케이스가 정말 도움이된다. 감사! :) – caw