python re 匹配、查找或搜索后,该如何进行NLP?

3 投票
2 回答
3992 浏览
提问于 2025-04-16 16:25

我开始写一些代码,目的是抓取句子中的某些“类型”,如果这些类型符合特定条件,就启动一个处理这些“类型”的Python脚本。我发现使用findall这个方法对我现在的工作更有效,所以:

m = re.compile(r'([0-9] days from now)')
m.match("i think maybe 7 days from now i hope")
print m.match("i think maybe 7 days from now i hope")
None
f= m.findall("i think maybe 7 days from now i hope")
print f[0]
7 days from now

这个方法似乎能让我找到我想要的句子部分。接下来,我可以把这个部分交给比如pyparsing模块,利用它的示例脚本将类似自然语言的句子转换成日期时间(我知道还有其他模块,但它们对输入的要求比较严格)。
然后,如果句子的其他部分匹配了另一个“类型”,比如约会、截止日期等,我就可以把这些信息插入到我的在线日记中,或者放到一个托管的网页应用里。
我现在只是随便尝试,但我慢慢在构建一些有用的东西。这个结构和流程是否合理,或者有没有更好的方法?这就是我现在在思考的问题。任何反馈都很受欢迎。

2 个回答

0

根据我对搜索界面的了解,要捕捉人们表达方式的多样性,你可能需要很多正则表达式。想要了解有多少种表达方式,可以看看这篇文章,里面提到了“词汇问题”。

所以,如果你只是处理日期和时间,并且这些操作非常具体,搞错了会很麻烦,那么使用正则表达式似乎是个不错的选择。另一方面,如果你只是想区分“日期”表达和“电子邮件”表达或“备注”表达,那么可以尝试使用词性标注,利用NLTK来标记句子,然后在词性层面上匹配模式。

12

之所以m.match()会失败,是因为它要求匹配的内容必须从字符串的开头开始。

如果你希望在字符串中找到多个(不重叠的)匹配项,那么使用findall()是合适的。否则,可以使用search()方法,它会返回找到的第一个匹配项。

这些内容在文档中有详细介绍

撰写回答