2017-02-24 27 views
2

我有一串推文和各种元数据,我想为社会语言学目的分析。为了做到这一点,我试图通过他们提供的信息来推断用户的年龄,等等。 为此,我使用正则表达式来匹配用户生物中的几个重复出现的模式,如用户提到一个数字,然后是“岁”的各种拼写,如下所示:用Python中的lookahead推测年龄3

“约翰,30岁,工程师。”

不过,我也想检查“岁”后会发生什么,因为很多人提到他们的孩子的年龄,我不希望这是正确关联到用户的年龄,如:

“约翰,一个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) 

该计划似乎在某些情况下工作,但在小测试文件,我创建尝试一下,它错误地匹配字符串中提到的年龄“我有一个12岁的儿子“,并返回12作为匹配的年龄,我不希望它。我猜这在程序中的某些地方与括号或分隔符有关,但我花了几个小时,并且在论坛上找不到任何有用的东西,所以任何帮助将不胜感激。

因此,实际的问题是:如何根据我已有的程序,使程序在“约翰,一个12岁的孩子的父亲,工程师的父亲”中认出12作为用户的年龄?

我在编程方面有些新奇,所以如果我忘记提及一些重要的东西,请不吝告诉我是否需要更多细节。

在此先感谢!

+4

在我看来,正则表达式不会成为现实。您需要将其解析为令牌并投资一些NLTK处理。 http://www.nltk.org/ – duffymo

+0

这句话应该如何处理?“约翰,一个12岁小孩的父亲,工程师”? – RomanPerekhrest

+0

感谢您的洞察力和链接@duffymo,但我想使用正则表达式的原因在于,人们在Twitter上提到他们的年龄的方式实际上很少,并且能够匹配三种或四种不同的模式将允许我推断我的语料库中大多数用户的年龄。我打算在后期使用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) 

感谢您的帮助!