2017-02-24 2 views
2

나는 사회적인 목적으로 분석하고자하는 많은 짹짹과 다양한 메타 데이터를 가지고있다. 이렇게하기 위해 필자는 자신의 바이오에서 제공하는 정보 덕분에 사용자 연령을 추측하려고합니다. 그 이유는 정규 표현식을 사용하여 사용자의 생체 내 몇 가지 반복 패턴을 일치시키는 것입니다. 예를 들어, 사용자가 숫자를 언급 한 후 "years old"이라는 철자를 사용하는 것과 같이파이썬 3에서 lookaheads로 나이를 추론하기

"John, 기사."

그러나, 많은 사람들이 자녀의 나이를 언급 등 또한, "오래된 년"다음에 오는 것을 확인하려면, 나는이 잘못 같이, 사용자의 나이와 연관되고 싶지 않아 :

"12 세 어린이의 아버지, 기술자"

위와 같은 경우에는 무시해야하므로 유효한 나이를 유추 할 수있는 사용자 만 보관할 수 있습니다.

내 프로그램은 다음과 같습니다

import csv 
import re 

with open("test_corpus.csv") as corpus: 
    corpus_read = csv.reader(corpus, delimiter=",") 
    for row in corpus_read: 
     if re.findall(r"\d{2}\s?(?=years old\s?|yo\s?|yr old\s?|y o\s?|yrs old\s?|year old\s?(?!son|daughter|kid|child))",row[5].lower()): 
      age = re.findall(r"\d{2}\s?",row[5].lower()) 
      for i in age: 
       print(i) 
프로그램은 어떤 경우에 작동하지만, 작은 테스트 파일에 나는 그것을 밖으로 시도하기 위해 만든 것

, 그것은 잘못 문자열에 언급 나이를 "일치 I 12 야 아들이있다 "고 대답하고, 12 살을 일치 연령으로 반환합니다. 나는 그것을 원하지 않습니다. 나는 이것이 프로그램의 어느 시점에서 괄호 또는 구분 기호와 관련이 있다고 생각하지만 몇 시간을 들여 포럼에 도움이되는 것을 찾을 수 없으므로 도움이 될 것입니다.

따라서 실제 질문은 : 내가 이미 가지고있는 프로그램을 기반으로 사용자가 12 세 어린이의 아버지 인 12 세의 나이로 12 세를 인식하지 못하게 만드는 방법은 무엇입니까?

프로그래밍에 다소 익숙하다. 중요한 것을 언급하는 것을 잊어 버리면 사과한다. 더 자세한 정보가 필요하면 주저하지 말고.

미리 감사드립니다.

+4

Regex는 내 의견으로는 가지 않을 것입니다. 이것을 토큰으로 구문 분석하고 일부 NLTK 처리에 투자해야합니다. http://www.nltk.org/ – duffymo

+0

"John, 12 세 아이의 아버지, 엔지니어"라는 문구를 어떻게 다루어야합니까? – RomanPerekhrest

+0

당신의 통찰력과 @duffymo 링크에 감사드립니다. 그러나 제가 정규 표현식을 사용하고자하는 이유는 사람들이 트위터에 자신의 나이를 언급하는 방법이 실제로 거의 없다는 것입니다. 3 ~ 4 가지 패턴과 일치시킬 수 있다면 대부분의 사용자의 나이를 내 코퍼스에서 추론합니다. 나중 단계에서 nltk를 사용하려고하지만, 지금 당장은 이것이 정규식보다 얼마나 효율적인지 보지 못 하겠지만 좀 더 자세히 살펴 보겠습니다. 감사합니다! :) – MitchBuchanon

답변

0

좋아요, 주위에 묻는 중 주위에 프로그램을 조정하고 며칠 후에, 나는 문제를 해결할 수있었습니다! 나는 그 자체를 완전히 이해할 수는 없으므로 자세한 설명을 할 수는 없지만, 문제는 코드의 공간의 위치처럼 보였다. 그러나 누구나 기술적으로 적절하게 공식화 된 설명을 주면 자유롭게 그렇게 할 수 있습니다.

어쨌든,이 솔루션은 할 수 있습니다 :

import csv 
import re 

with open("test_bio.csv") as corpus: 
corpus_read = csv.reader(corpus, delimiter=",") 
for row in corpus_read: 
    if re.search(r"\d{2}\s?(?=(?:years old|yo|yr old|y o|yrs old|year old)(?!\s?son|\s?daughter|\s?kid|\s?child))" ,row[5].lower()): 
     age2 = re.findall(r"\d{2}\s?",row[5].lower()) 
     for z in age2: 
      print(z) 

덕분에 다시 도움을!

관련 문제