Python 如何在字符串而不是列表中输出NLTK pos_标记?

Python 如何在字符串而不是列表中输出NLTK pos_标记?,python,list,nltk,pos-tagger,Python,List,Nltk,Pos Tagger,我需要在一个大的数据集上运行nltk.pos_标记,并且需要像Stanford tagger提供的那样输出 例如,在运行下面的代码时,我有: import nltk text=nltk.word_tokenize("We are going out.Just you and me.") print nltk.pos_tag(text) 输出为: [('We','PRP'),('are','VBP'),('go','VBG'),('out.Just','IN'),('you','PRP'),('

我需要在一个大的数据集上运行nltk.pos_标记,并且需要像Stanford tagger提供的那样输出

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

import nltk
text=nltk.word_tokenize("We are going out.Just you and me.")
print nltk.pos_tag(text)
输出为: [('We','PRP'),('are','VBP'),('go','VBG'),('out.Just','IN'),('you','PRP'),('and','CC'),('me','PRP'),('out.Just','IN'))]

如果我需要的是:

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

我不喜欢使用字符串函数,需要直接输出,因为文本量太大,而且会给处理增加很多时间复杂性。

简而言之:

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

' '.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)
在我的笔记本电脑上花了2.955秒从布朗语料库中找出了所有57339个句子

[out]:

$ 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
保存带标签的输出,例如

>>> 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')]

简而言之:

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

' '.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)
在我的笔记本电脑上花了2.955秒从布朗语料库中找出了所有57339个句子

[out]:

$ 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
保存带标签的输出,例如

>>> 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')]

为什么字符串函数比NLTK方法做同样的事情要慢呢?因为我不相信NLTK(或Textblob)开发人员会创建列表然后再更改它(效率低下!),但他们可以直接在文本中创建POS。使用
/
来浓缩单词和POS会导致复杂性。如果你的文本中有
he/she
,你会得到
he/PN///she/PN
,那么解析字符串输出将是一团混乱。此外,我认为你过度考虑使用字符串函数来浓缩字符串,这真的没有那么昂贵。=)我不想使用:list=(nltk.pos_标记(text))str1=(''.join(str(e)表示列表中的e)).replace('\'','').replace(','','').replace(')(','').replace(','').replace(','').replace('),'')…我将尝试这段代码,但我正在寻找更漂亮的代码!为什么字符串函数比NLTK方法做同样的事情要慢呢?因为我不相信NLTK(或Textblob)开发人员会创建列表然后再更改它(效率低下!),但他们可以直接在文本中创建POS。使用
/
来浓缩单词和POS会导致复杂性。如果你的文本中有
he/she
,你会得到
he/PN///she/PN
,那么解析字符串输出将是一团混乱。此外,我认为你过度考虑使用字符串函数来浓缩字符串,这真的没有那么昂贵。=)我不想使用:list=(nltk.pos_标记(text))str1=(''.join(str(e)表示列表中的e)).replace('\'','').replace(','','').replace(')(','').replace(','').replace(','').replace('),'')…我将尝试这段代码,但我正在寻找更漂亮的代码!