当前位置: 首页 > 面试题库 >

如何在字符串而不是列表中输出NLTK pos_tag?

邹华皓
2023-03-14
问题内容

我需要在大型数据集上运行nltk.pos_tag,并且需要使其输出像斯坦福标记器提供的那样。

例如,在运行以下代码时,我有:

import nltk
text=nltk.word_tokenize("We are going out.Just you and me.")
print nltk.pos_tag(text)

输出为:[[‘We’,’PRP’),(’are’,’VBP’),(’going’,’VBG’),(’out.Just’,’IN’),(’you
‘,’PRP’),(’and’,’CC’),(’me’,’PRP’),(’。’,’。’)]

在这种情况下,我需要像这样:

 We/PRP are/VBP going/VBG out.Just/NN you/PRP and/CC me/PRP ./.

我更喜欢不使用字符串函数,并且需要直接输出,因为文本数量如此之多,并且给处理增加了很多时间上的复杂性


问题答案:

简而言之:

' '.join([word + '/' + pos for word, pos in tagged_sent]

总而言之:

我认为您对使用字符串函数来连接字符串的想法过高,这实际上并不那么昂贵。

import time
from nltk.corpus import brown

tagged_corpus = brown.tagged_sents()

start = time.time()

with open('output.txt', 'w') as fout:
    for i, sent in enumerate(tagged_corpus):
        print(' '.join([word + '/' + pos for word, pos in sent]), end='\n', file=fout)

end = time.time() - start
print (i, end)

在我的笔记本电脑上,棕色语料库的所有57339个句子花了2.955秒。

[出]:

$ head -n1 output.txt 
The/AT Fulton/NP-TL County/NN-TL Grand/JJ-TL Jury/NN-TL said/VBD Friday/NR an/AT investigation/NN of/IN Atlanta's/NP$ recent/JJ primary/NN election/NN produced/VBD ``/`` no/AT evidence/NN ''/'' that/CS any/DTI irregularities/NNS took/VBD place/NN ./.

但是使用字符串将单词和POS连接起来会在以后需要读取标记的输出时引起麻烦,例如

>>> from nltk import pos_tag
>>> tagged_sent = pos_tag('cat / dog'.split())
>>> tagged_sent_str = ' '.join([word + '/' + pos for word, pos in tagged_sent])
>>> tagged_sent_str
'cat/NN //CD dog/NN'
>>> [tuple(wordpos.split('/')) for wordpos in tagged_sent_str.split()]
[('cat', 'NN'), ('', '', 'CD'), ('dog', 'NN')]

如果要保存标记的输出然后再阅读,最好使用pickle保存tagd_output的方法,例如

>>> import pickle
>>> tagged_sent = pos_tag('cat / dog'.split())
>>> with open('tagged_sent.pkl', 'wb') as fout:
...     pickle.dump(tagged_sent, fout)
... 
>>> tagged_sent = None
>>> tagged_sent
>>> with open('tagged_sent.pkl', 'rb') as fin:
...     tagged_sent = pickle.load(fin)
... 
>>> tagged_sent
[('cat', 'NN'), ('/', 'CD'), ('dog', 'NN')]


 类似资料:
  • 对不起,新手:/。所以当我在“输入你的年龄”中键入一封信时,我有这个问题 输入您的年龄:q 线程“main”java.util.InputMismatchException中出现异常 在java.util.scanner.throwfor(Scanner.java:909) 我想如果我打了任何一个字母,它显示“无效输入”。有人能帮我吗?[对不起,糟糕的英语]

  • 问题内容: 这就是我通常做,以确定输入是一个/ -但不是。因为很多时候我偶然发现了一个错误,即一个函数错误地传递了一个对象,而目标函数确实假设这实际上是一个or 。 我的问题是:是否有更好的方法来实现这一目标? 问题答案: 仅在python 2中(不是python 3): 实际上就是您想要的,否则您会错过很多像列表一样的东西,但它们不是or的子类。

  • 我有这个。我想创建一个,它保存如下 但是通过这样做 问题是每个现在都保存为。例如,第3行是 对于那些怀疑论者,我尝试了,它是。第2列工作正常。 如何保存为每行,而不是?也就是说,我如何保存所有行的作为而不是?

  • 问题内容: 我正在尝试使此bcp工具以特定方式工作。-c开关应该使用chars导出,但是由于某些原因,Notepad ++中显示了一个奇怪的char,就像它是UNICODE还是其他格式一样。 我想获取该char(在数据库中为空字符串)作为空字符串导出到文本文件中。你是怎样做的? 问题答案: 好吧,在网上浏览后,这就是我发现的东西。考虑将其放在SO中,以便更多的人可以使用它。 http://www.

  • 我正在学习如何使用Spring靴和胸腺嘧啶。我有一个问题,我在表单列表中提供一个特定对象的列表到一个Thymeleaf页面。当用户选择值并发布结果时,结果是所选对象的字符串,并且与我想要存储值的对象不兼容。 这可能听起来像一口,所以下面是代码。 输入:一个类将一组成分传递给表单,这个类在一个类成分列表中传递给表单(过滤对此无关紧要--插入一个列表作为model属性的值,键是一种成分类型) Thym

  • 既然我们可以在Javascript中使用关键字抛出任何东西,那么我们就不能直接抛出一个错误消息字符串吗? 有人知道这里面有什么陷阱吗? 让我对此添加一些背景:在JavaScript世界中,人们通常依赖参数检查而不是使用try-catch机制,因此只使用抛出致命错误是有意义的。不过,为了能够捕捉一些系统错误,我必须为我自己的错误使用一个不同的类,而不是创建错误的子类,我认为我应该只使用String。