Python 从文本中提取年龄相关信息

Python 从文本中提取年龄相关信息,python,regex,nlp,Python,Regex,Nlp,我试图在互联网上用户发布的大量信息数据集中(存储在.csv文件中)找到关于年龄的信息 我目前正在使用python中的正则表达式来提取年龄并将其保存在列表中 比如说,, “我20岁了”会回到20岁的名单上 “他现在30岁了”将返回30岁 “她五十多岁了”将返回50岁 但问题是,对于一个庞大的数据集,使用RE的速度非常慢,如果文本的模式不符合RE的要求,那么我就无法获得年龄。。。所以,我的问题是:有没有更好的方法?也许是python中的一些NLP包/工具? 我试着研究nltk是否对此有所帮助,但没有

我试图在互联网上用户发布的大量信息数据集中(存储在.csv文件中)找到关于年龄的信息

我目前正在使用python中的正则表达式来提取年龄并将其保存在列表中

比如说,, “我20岁了”会回到20岁的名单上 “他现在30岁了”将返回30岁 “她五十多岁了”将返回50岁

但问题是,对于一个庞大的数据集,使用RE的速度非常慢,如果文本的模式不符合RE的要求,那么我就无法获得年龄。。。所以,我的问题是:有没有更好的方法?也许是python中的一些NLP包/工具? 我试着研究nltk是否对此有所帮助,但没有

如果问题不清楚,对不起,英语不是我的第一语言。。 我已经包括了我在下面使用的一些RE

m = re.search(r'.*(I|He|She) (is|am) ([0-9]{2}).*',s,re.IGNORECASE)
n = re.search(r'.*(I|He|She) (is|am) in (my|his|her) (late|mid|early)? ?(tens|twenties|thirties|forties|fifties|sixties|seventies|eighties|nineties|hundreds).*',s,re.IGNORECASE)
o = re.search(r'.*(I|He|She) (is|am) (twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen) ?(one|two|three|four|five|six|seven|eight|nine)?.*',s,re.IGNORECASE)
p = re.search(r'.*(age|is|@|was) ([0-9]{2}).*',s,re.IGNORECASE)
q = re.search(r'.*(age|is|@|was) (twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen) ?(one|two|three|four|five|six|seven|eight|nine)?.*',s,re.IGNORECASE)
r = re.search(r'.*([0-9]{2}) (yrs|years).*',s,re.IGNORECASE)
s = re.search(r'.*(twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen) ?(one|two|three|four|five|six|seven|eight|nine)? (yrs|years).*',s,re.IGNORECASE)

请参阅,特别是关于使用Allen NLP的答案,这似乎正是您所要求的。

您可以优化您的算法,或者预编译regexp并将python脚本编译为可执行文件吗?你能提供你如何使用它的例子,逻辑;我将尝试将我的脚本编译成一个可执行文件,看看它是否更快,但预编译regexp似乎没有多大用处。我使用if..elif梯形图进行搜索。。如果我找到一个匹配项,我不会扫描re的其余部分。。我只是将年龄保存到一个数组中,然后继续从csv读取下一条消息,但如果我不这样做,我会继续用下一个重新模式扫描文本,以此类推。。有没有更好的方法来加快速度?如果代码不能得到更好的优化,那么数据可能会被优化。在搜索年龄之前,您可以将所有字母小写(因此没有IGNORECASE标志),并将表示数字的单词转换为数字,因此不再需要冗长的regexp,并将结果存储在临时csv中。然后在优化的数据上运行代码。感谢您的建议。预处理确实有助于加快速度。但是有没有一个工具/包可以帮我做到这一点,或者有没有一种方法可以避免使用正则表达式来实现这一点?因为我的大部分数据来自互联网上的公共论坛,人们陈述年龄的方式有很多不同,当我使用regex时,很多数据都是通过未经破坏的方式传递的:(@krzna这主要与你想要捕获多少数据有关——这听起来像是NLP问题,所以我认为没有一个预先推出的解决方案,而且通常你自己的解决方案并不那么容易。正则表达式方法似乎是拉出NLP机制的合理替代方法,但它可能会遗漏更多内容为了加快进程,您是否考虑过您的计划?在这种情况下,它几乎肯定会有所帮助。