Python:提取包含特定单词的句子

3

我有一个包含如下文本的json文件:

Goldberg博士提供所有服务。停车场很好。他人很好,容易交流。

如何提取带有关键字“停车场”的句子? 我不需要其他两个句子。

我尝试过以下方法:

with open("test_data.json") as f:
    for line in f:
        if "parking" in line:
            print line

它打印了所有文本而不是特定的那句话。

我甚至尝试使用正则表达式:

f=open("test_data.json")
for line in f:
    line=line.rstrip()
    if re.search('parking',line):
        print line

即使如此,这也显示相同的结果。

1
当您在文件指针中使用readline时,它不会仅读取一行。它会一直读取,直到看到“\n”。 - Myjab
使用简单的正则表达式。使用dmitry_romanov提到的模式,甚至可以尝试模式re.search(".*.(.*parking.*.)",a).group(1)。 - Myjab
3个回答

5
你可以使用nltk.tokenize
from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
f=open("test_data.json").read()
sentences=sent_tokenize(f)
my_sentence=[sent for sent in sentences if 'parking' in word_tokenize(sent)] #this gave you the all sentences that your special word is in it ! 

作为一种完整的方法,您可以使用一个函数:

>>> def sentence_finder(text,word):
...    sentences=sent_tokenize(text)
...    return [sent for sent in sentences if word in word_tokenize(sent)]

>>> s="dr. goldberg offers everything. parking is good. he's nice and easy to talk"
>>> sentence_finder(s,'parking')
['parking is good.']

0
你可以使用标准库中的 re 模块:
import re
line = "dr. goldberg offers everything.parking is good.he's nice and easy to talk"
res = re.search("\.?([^\.]*parking[^\.]*)", line)
if res is not None:
    print res.group(1)

它将打印出parking is good

思路很简单-您搜索以可选点字符.开头的句子,然后消耗所有非点、parking 单词和其余的非点。

问号处理您的句子位于行首的情况。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - tripleee
@tripleee,恐怕没有语法规则来表示含义。在“dr.”中的句点“.”与任何句子末尾的句点相同。如果有人需要像人一样阅读的解决方案,他/她要么编写脆弱的正则表达式,要么训练神经网络。在我看来,这两种情况都过度了。也许“dr”意味着物理教科书中的“delta r”,谁知道呢?我的解决方案将处理逗号等。以!、?结束很容易添加等。 - dmitry_romanov
对于标记为[tag:nltk]的问题,我希望并期望一个解决方案,至少处理实际人类语言的基础知识。是的,它是上下文相关的,因此像正则表达式这样的无上下文工具本质上是不足的。 - tripleee
@tripleee,我完全同意你的观点(现在我正在使用nltk,感谢你提供的链接:-))。关于“不足”,我们无法从这里得知OP是否对语言感知解决方案感兴趣,也无法确定他的项目中是否允许额外的依赖项(通常在工作中我没有这样的奢侈条件)。这是他/她的设计决策,而不是我们的。因此,我修复了他正则表达式解决方案中的模式,使其能够在提供的数据上工作,并给出OP所要求的确切结果。就这些。 - dmitry_romanov

0

解析字符串并查看其值如何?

import json

def sen_or_none(string):
  return "parking" in string.lower() and string or None

def walk(node):
  if isinstance(node, list):
    for item in node:
      v = walk(item)
      if v:
        return v
  elif isinstance(node, dict):
    for key, item in node.items():
      v = walk(item)
      if v:
        return v
  elif isinstance(node, basestring):
    for item in node.split("."):
      v = sen_or_none(item)
      if v:
        return v
  return None

with open('data.json') as data_file:    
  print walk(json.load(data_file))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接