gpt4 book ai didi

Python NLTK 解释一个固定的句子模式并将其标记化

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:57 27 4
gpt4 key购买 nike

我有一个应用程序,其中 NLTK 需要解释人类提供的语音,并从中找到有意义的 block 。需要解释的句子的形式是from <somewhere>, to <somewhere> on <some_date>, <class_of_travel,like AC_CHAIR_CAR> .如您所知,这可以用无数种方式表达,例如,

  1. 我想从亚特兰大去纽约,商务舱,2014 年 7 月 25 日。

  2. 我想乘坐商务舱,于 7 月 25 日从纽约飞往亚特兰大。

  3. 我有一个梦想,有一天我会登上飞机,乘坐商务舱旅行,然后在纽约降落,源头在亚特兰大,最好是在 7 月 25 日。

  4. 7 月 25 日亚特兰大飞往纽约,商务舱。

你明白了。我想提取的是一些信息花絮——来源、目的地、类别、日期。有些可能会丢失,必须加以识别或适当假设。就像发现源丢失一样,识别它。或者,如果缺少年份,则将其记入当前年份。同时忽略无用的信息(比如我有一个梦想部分,就像我崇拜马丁路德一样)。

有什么方法可以在 NLTK 中实现这一点?我知道有可用的标记器,也有训练标记器的方法,但我对此了解不足。是否有可能或多或少地涵盖所有可能意味着这样一句话的情况,并像这样提取信息?如果是这样,我们将不胜感激。

最佳答案

在计算语言学中,这被称为“Named Entity Recognition ”,这是从文本中识别组织、人员和位置等事物的过程。

这里的挑战是 nltk 中的默认 NE 分块器是在 ACE corpus 上训练的最大熵分块器.它尚未接受过识别日期和时间的训练,因此您需要对其进行调整并找到检测时间的方法。

有一些包可以帮助提取命名实体,Stanford NER(命名实体识别器)是最流行的命名实体识别工具之一,由 Java 实现。但是您可以通过下载包并通过提供 Stanford NER 接口(interface)的 NLTK 进行交互来使用它。

您可以下载Stanford Named Entity Recognizer version 3.4在哪里可以找到 stanford-ner.jar 和分类器模型“all.3class.distsim.crf.ser.gz”

from nltk.tag.stanford import NERTagger
def stanfordNERExtractor(sentence):
st = NERTagger('/usr/share/stanford-ner/classifiers/all.3class.distsim.crf.ser.gz',
'/usr/share/stanford-ner/stanford-ner.jar')
return st.tag(sentence.split())

stanfordNERExtractedLines = stanfordNERExtractor("New York")
print stanfordNERExtractedLines #[('New-York', 'LOCATION')]

您还可以使用 NTLK,您可以在 official document 上找到更多详细信息, 检查这个要点 from Gavin

def extract_entities(text):
for sent in nltk.sent_tokenize(text):
for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sent))):
if hasattr(chunk, 'node'):
print chunk.node, ' '.join(c[0] for c in chunk.leaves())

extract_entities("to play to Atlanta")

#Output: [('to', 'TO'),('play', 'VB'),('to', 'TO'),('play', 'NN')],
  • 我们如何确定目的地?区分位置后,您可能会遇到识别由空格分隔的单词或区分来源和区别的问题。

最好编写一个正则表达式模式来标识源和目标。您可能无法获取诸如 "to get" 之类的其他词,但您已确定要从 st.tag(“LOCATION”)中验证的位置列表,或者以防万一你使用了NTLK,你可以验证它是否是动词(“VB”/“NN”)。您还可以使用 NLTK 的 UnigramTagger() 和 BigramTagger() 来检查可能性,以在“FROM”和“TO”之后获取可以识别为位置的名称

import re
text= "I want to go to New York from Atlanta, business class, on 25th July."
destination= re.findall(r'.to.([A-Z][a-zA-Z]+?[\s-]*[A-Z]*[a-zA-Z]*)',text)
source= re.findall(r'.from.([A-Z][a-zA-Z]+?[\s-]*[A-Z]*[a-zA-Z]*)',text)

print source,destination
  • 我们如何确定时间/日期?

如上所述,这是我们可能面临的问题之一,但我们可以使用正则表达式,如本thread所述.

print re.findall(
r"""(?ix) # case-insensitive, verbose regex
\b # match a word boundary
(?: # match the following three times:
(?: # either
\d+ # a number,
(?:\.|st|nd|rd|th)* # followed by a dot, st, nd, rd, or th (optional)
| # or a month name
(?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)
)
[\s./-]* # followed by a date separator or whitespace (optional)
){3} # do this three times
\b """,
text)

输出:

25th July 2014.

我们也可以使用python-dateutilthis而不是使用正则表达式。

以防遗漏部分,例如年份或月份。我们可以使用 parsedatetime 包对其进行调整。

检查这个快速示例(您可以根据不同的场景进行调整)

>>> import parsedatetime
>>> p = parsedatetime.Calendar()
>>> print p.parse("25th this month")
(time.struct_time(tm_year=2014, tm_mon=11, tm_mday=10, tm_hour=1, tm_min=5, tm_sec=31, tm_wday=0, tm_yday=314, tm_isdst=0), 0)
>>> print p.parse("25th July")
((2015, 7, 25, 1, 5, 50, 0, 314, 0), 1)
>>> print p.parse("25th July 2014")
((2014, 7, 25, 1, 6, 3, 0, 314, 0), 1)

最后一件事是,你可以使用这个 dataset提取机场,并验证所提及位置的正确性,以防您回答可用性(有些位置没有机场)。

对于舱位,您可以通过查看句子中的“经济舱”、“商务舱”词来验证(您可以在in 或正则表达式之间进行选择)。

有关此主题的更多详细信息,请查看:NTLK - Extracting Information from Text

关于Python NLTK 解释一个固定的句子模式并将其标记化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26662618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com