我目前有一个关于自然语言处理的项目,我尝试使用NLTK来识别一个人的名字。但是,问题比仅仅找出词性要更具挑战性。
"input = "Hello world, the case is complex. John Due, the plaintiff in the case has hired attorney John Smith for the case."
所以,挑战在于:我只想从整个文档中获取律师的名字作为返回结果,而不是其他人的名字,所以是“John Smith”,词性:PERSON,职业:律师。返回结果可以是这样的,或者只是“John Smith”。
{ "name": "John Smith", "type": "PERSON", "occupation": "attorney"}
我已经尝试了NLTK的词性分析,也尝试了Google Cloud Natural Language API,但它们只能帮助我检测到人的名字。我如何检测它是否是律师?请指导我正确的途径。我是否需要训练自己的数据或语料库来检测“律师”。我有成千上万的法院文档txt文件。
回答:
预训练的机器学习模型的问题在于,它们在你想要实现的目标上没有太多的灵活性。像Google Cloud Natural Language这样的工具提供了一些非常有趣的功能,但你不能让它们为你做其他工作。在这种情况下,你需要训练自己的模型,或者尝试不同的方法,使用像TensorFlow这样的工具,这需要很高的专业知识才能获得不错的结果。
然而,关于你的具体用例,你可以使用analyzeEntities方法来查找命名实体(常见名词和专有名词)。结果表明,如果“律师”这个词紧挨着实际是律师的人的名字(如“我是John,我的律师James正在处理我的案件。”或你的例子“Hello world, the case is complex. John Due, the plaintiff in the case has hired attorney John Smith for the case.”),它会将这两个实体联系在一起。
你可以使用我分享的这个调用在API Explorer中进行测试,你会看到对于这个请求:
{ "document": { "content": "I am John, and my attorney James is working on my case.", "type": "PLAIN_TEXT" }, "encodingType": "UTF8"}
一些结果实体是:
{ "name": "James", "type": "PERSON", "metadata": { }, "salience": 0.5714066, "mentions": [ { "text": { "content": "attorney", "beginOffset": 18 }, "type": "COMMON" }, { "text": { "content": "James", "beginOffset": 27 }, "type": "PROPER" } ] }, { "name": "John", "type": "PERSON", "metadata": { }, "salience": 0.23953272, "mentions": [ { "text": { "content": "John", "beginOffset": 5 }, "type": "PROPER" } ] }
在这种情况下,你将能够解析JSON响应,并看到James(正确地)与“律师”这个名词联系在一起,而John则没有。然而,根据我进行的一些测试,这种行为似乎只有在“律师”这个词紧挨着你试图识别的名字时才可重现。
我希望这对你有帮助,但如果你的需求更复杂,你将无法使用像Natural Language API这样的现成解决方案来实现。