2

我有一些用户帖子,我想与预先确定的模式列表相匹配(参见示例)。如果帖子与模式匹配,我想将帖子和模式写入文件。做这个的最好方式是什么?到目前为止,我只想过用 4 个 for 循环强制它,然后进行一些比较。我已经有了我需要的所有数据的列表,下面只是一些非常简单的例子,让您了解我在寻找什么。


例子

帖子:

posts =['When I ate at McDonald\'s, I felt sick.',
'I like eating at Burger King.',
'Wendy\'s made me feel happy.']

图案:

patterns = ['When I ate at [RESTAURANT]',
'I like eating at [RESTAURANT]',
'[RESTAURANT] made me feel [FEELING]',
'I felt [FEELING]']

列表:

restaurant_names = ['McDonald\'s', 'Burger King', 'Wendy\'s']

feelings = ['happy', 'sick', 'tired']

输出文件:

当我在 吃的时候[RESTAURANT],当我在麦当劳吃的时候,我感到恶心。

我觉得[FEELING],当我在麦当劳吃饭时,我感到恶心。

[RESTAURANT]让我感到[FEELING],Wendy's让我感到快乐。

我喜欢吃[RESTAURANT],我喜欢吃汉堡王。


- 抱歉格式化,但这是我潜伏了一段时间后关于 stackoverflow 的第一篇文章。在此先感谢您的帮助!

4

2 回答 2

1

我不确定我是否理解。您能否发布到目前为止的确切代码,您打算做什么以及为什么?谢谢。

一般来说,有4种选择:

1) 使用单一但复杂的 RegEx 模式和严格的列表

r"(When I ate at (?P<rest1>McDonald's|Burger King|Wendy's), I felt (?P<feel1>happy|sick|tired)\.)|(I like eating at (?P<rest2>McDonald's|Burger King|Wendy's)\.)"

如果需要,对命名的捕获组rest1feel1、的分析rest2将允许您确定使用的句子类型。否则,您可以输出整个匹配项。当然,该模式可以从您的列表中以编程方式组装。re.escape()连接元素时要小心使用。

2) 使用单一但复杂的 RegEx 模式和松散列表

  r"(When I ate at (?P<rest1>[^,]+), I felt (?P<feel1>[a-z]+).)|(I like eating at (?P<rest2>[^.]+)\.)"

这样做的好处是可以捕捉新的餐厅名称、感受等。缺点是对标点符号/语法的依赖。示例:第一个模式无法识别带有嵌入的餐厅名称,

3)做你可能已经在做的事情。自然语言分析比 RegEx 自己能做的要复杂得多。

4)如果不仅仅是一些固定的模式,而是关于分析帖子的含义而不管具体的措辞,那么你应该像其他发帖人建议的那样使用NLTK。

于 2013-08-08T21:04:21.787 回答
1

像这样的东西怎么样:

>>> sentences = ["When I ate at McDonald's, I felt sick.", 'I like eating at Burger King.', 
    "Wendy's made me feel happy."]
>>> patterns = {"McDonald's": "[RESTAURANT]", "Burger King": "[RESTAURANT]", 
    "Wendy's": "[RESTAURANT]", "happy": "[FEELING]", "sick": "[FEELING]", 
    "tired": "[FEELING]"}

然后你可以做

>>> for sentence in sentences:
...     replaced = sentence
...     for pattern in patterns:
...         if pattern in sentence:
...             replaced = replaced.replace(pattern, patterns[pattern])
...     print sentence
...     print replaced
...
When I ate at McDonald's, I felt sick.
When I ate at [RESTAURANT], I felt [FEELING].
I like eating at Burger King.
I like eating at [RESTAURANT].
Wendy's made me feel happy.
[RESTAURANT] made me feel [FEELING].

这仍然需要一些工作(例如,现在,单词carsick将变为car[FEELING]),并且您可能希望patterns通过创建另一个可以通过索引引用的替换文本列表来避免值中的所有重复,但也许这已经足够了让你开始?

于 2013-08-08T20:42:27.113 回答