Python NLTK解释固定的句子模式并将其标记化
我有一个应用程序,NLTK需要解释人类发表的演讲,并从中找到有意义的语块。需要解释的句子的形式为Python NLTK解释固定的句子模式并将其标记化,python,nlp,speech-recognition,nltk,Python,Nlp,Speech Recognition,Nltk,我有一个应用程序,NLTK需要解释人类发表的演讲,并从中找到有意义的语块。需要解释的句子的形式为from,to on,。正如你所理解的,这可以用无数种方式表达,例如 我想从亚特兰大去纽约,商务舱,2014年7月25日 我想乘坐商务舱,7月25日从纽约到亚特兰大 我有一个梦想,有一天我会登上飞机,坐商务舱,降落在纽约,消息来源是亚特兰大,最好是7月25日 7月25日亚特兰大至纽约,商务舱 你明白了。我想提取的是一些信息——来源、目的地、类别、日期。有些可能缺失,必须加以识别或适当假设。比如说,如果
from,to on,
。正如你所理解的,这可以用无数种方式表达,例如
在NLTK中有什么方法可以实现这一点吗?我知道有标记者可用,也有培训标记者的方法,但我对此没有足够的知识。是否有可能涵盖几乎所有可能意味着这样一句话的情况,并提取这样的信息?如果是这样,请提供一些指导。这个问题称为“命名实体识别”(或简称“ner”)。通过谷歌搜索这些短语,你会发现很多库、在线api、针对特定类型数据的巧妙经验法则等等 在以下位置签出演示系统: 检测对日期和时间的引用可能是最具启发性的解决方案 如果您有一个特定且非常有限的文本域,那么设置手动整理的实体列表可能会非常有用。
e、 g.只需列出所有拥有商业机场的城市的所有机场代码/名称,并尝试将这些名称与任何输入文本进行精确的字符串匹配。此问题称为“命名实体识别”(或简称“ner”)。通过谷歌搜索这些短语,你会发现很多库、在线api、针对特定类型数据的巧妙经验法则等等 在以下位置签出演示系统: 检测对日期和时间的引用可能是最具启发性的解决方案 如果您有一个特定且非常有限的文本域,那么设置手动整理的实体列表可能会非常有用。
e、 g.只需列出所有拥有商业机场的城市的所有机场代码/名称,并尝试将这些名称与任何输入文本进行精确的字符串匹配。在计算语言学中,这被称为“”,它是从文本中识别组织、人员和地点等事物的过程 这里的挑战是nltk中默认的NE chunker是在网络上训练的最大熵chunker。它还没有经过识别日期和时间的训练,所以你需要调整它并找到一种检测时间的方法 有一些软件包可以帮助提取命名实体,斯坦福NER(命名实体识别器)是最流行的命名实体识别工具之一,由Java实现。但是您可以通过下载包并通过NLTK进行交互来使用它,NLTK提供了一个Stanford NER的接口 你可以下载 在这里可以找到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,您可以在上找到更多详细信息,请查看此要点
- 我们如何确定目的地? 在区分位置之后,您可能会遇到识别由空格分隔的单词或区分来源和区别的问题李>
)时遇到问题,但您有要从st.tag
(“位置”)验证的位置列表,或者如果您使用了NTLK,您可以验证它是否是动词(“VB”/“NN”)。您还可以通过使用NLTK的UnigramTagger()和BigramTagger()在“FROM”和“to”之后获取可以标识为位置的名称来检查可能性
- 我们如何确定时间/日期李>
如上所述,这是我们可以面对的问题之一,但我们可以使用正则表达式,如本文所述
输出:
25th July 2014.
我们也可以使用或代替正则表达式
以防缺少某个部分,如年份或月份。我们可以使用parsedatetime包来调整它
检查这个快速示例(您可以根据不同的场景进行调整)
最后一件事是,您可以使用它来提取airoport,并验证所提到的位置的正确性,以防您回答可用性(有些位置没有airoport)
对于类,您可以通过查看句子中的“经济类”、“商务类”单词来验证它(您可以在
中的或正则表达式中进行选择)
有关此主题的更多详细信息,请查看:在计算语言学中,这被称为“”,它是从文本中识别组织、人员和位置等事物的过程
这里的挑战是nltk中默认的NE chunker是在网络上训练的最大熵chunker。它还没有经过识别日期和时间的训练,所以你需要调整它并找到一种检测时间的方法
有一些软件包可以帮助提取命名实体,斯坦福NER(命名实体识别器)是最流行的软件包之一
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
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.
>>> 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)