我有用户帖子,我想与预定的模式列表匹配(参见示例)。如果帖子匹配模式,我想将帖子和模式写入文件。做这个的最好方式是什么?到目前为止,我只想到了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']
OUTPUTFILE:
当我在[RESTAURANT]
吃饭时,当我吃麦当劳时,我感到恶心。
我觉得[FEELING]
,当我在麦当劳吃饭时,我感到恶心。
[RESTAURANT]
让我觉得[FEELING]
,Wendy让我感到高兴。
我喜欢在[RESTAURANT]
吃东西,我喜欢在汉堡王吃东西。
-Sorry格式化,但这是我潜伏一段时间之后的第一篇关于stackoverflow的帖子。在此先感谢您的帮助!
答案 0 :(得分: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
值中的所有重复您可以通过索引引用的另一个替换文本列表,但这可能足以让您入门?
答案 1 :(得分: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)\.)"
对指定的捕获组rest1
,feel1
,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。