【问题标题】:Inferring age with lookaheads in Python 3在 Python 3 中使用前瞻推断年龄
【发布时间】:2017-02-24 15:51:13
【问题描述】:

我有一堆推文和各种元数据,我想出于社会语言学的目的进行分析。为了做到这一点,我试图通过用户在简历中提供的信息来推断用户的年龄。 为此,我使用正则表达式来匹配用户简历中的几个重复模式,比如用户提到一个数字,然后是“岁”的各种拼写,如下所示:

“约翰,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 作为匹配的年龄,我不想要它。我猜这与程序中的某个点的括号或分隔符有关,但我花了几个小时在上面,我在论坛上找不到任何有用的东西,所以任何帮助将不胜感激。

因此,实际的问题是:基于我已有的程序,如何使程序无法识别“John,一个 12 岁孩子的父亲,工程师”中的 12 作为用户的年龄?

我对编程有点陌生,所以如果我忘记提及重要的事情,请道歉,如果您需要更多详细信息,请随时告诉我。

提前致谢!

【问题讨论】:

  • 在我看来,Regex 不会是正确的选择。您需要将其解析为令牌并投资于一些 NLTK 处理。 nltk.org
  • 应该如何对待这句话"John, father of a 12 year old kid, engineer"
  • 感谢您的洞察力和@duffymo 链接,但我想使用正则表达式的原因是人们在 Twitter 上提及年龄的方式实际上很少,并且能够匹配三个或四种不同的模式可以让我推断出我的语料库中大多数用户的年龄。我打算在稍后阶段使用 nltk,但现在我真的不知道它会比正则表达式更有效,但我会仔细研究一下,谢谢! :)
  • 那么,你基本上是想用正则表达式解析英语?这看起来像是一个不可能完成的任务。您最好将句子解析为标记,并使用 ANN 或 NLTK 或类似的东西进行一些分析。
  • 看,如果你只检查儿子/孩子/女儿等是否出现在2个字的年龄之内?你不需要正则表达式。另外,我认为一个简单的朴素贝叶斯分类器可以帮到你很多,而且训练起来应该很快

标签: python regex lookahead


【解决方案1】:

好的,经过几天的程序调整,尤其是四处询问,我已经能够解决问题了!我无法给出详细的解释,因为我自己不确定是否完全理解,但问题似乎是代码中空格的位置。但是,如果有人要给出技术性和正确表述的解释,请随时这样做。

无论如何,解决办法是:

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)

再次感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2017-08-08
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多