我正在尝试使用Python中的spaCy模块进行POS标记.
这是我的相同代码
from spacy.en import English, LOCAL_DATA_DIR
import spacy.en
import os
data_dir = os.environ.get('SPACY_DATA', LOCAL_DATA_DIR)
nlp = English(parser=False, tagger=True, entity=False)
def print_fine_pos(token):
return (token.tag_)
def pos_tags(sentence):
sentence = unicode(sentence, "utf-8")
tokens = nlp(sentence)
tags = []
for tok in tokens:
tags.append((tok,print_fine_pos(tok)))
return tags
a = "we had crispy dosa"
print pos_tags(a)
Run Code Online (Sandbox Code Playgroud)
输出:
[(We , u'PRP'), (had , u'VBD'), (crispy , u'NN'), (dosa, u'NN')]
Run Code Online (Sandbox Code Playgroud)
在这里,它返回crispy作为名词而不是形容词.但是,如果我使用类似的测试句子
a="we had crispy fries"
Run Code Online (Sandbox Code Playgroud)
它认识到脆皮是一个形容词.这是输出:
[(we , u'PRP'), (had , u'VBD'), (crispy , u'JJ'), (fries, u'NNS')] …Run Code Online (Sandbox Code Playgroud) 我在配方上使用pos_tagger.我遇到的一个问题是pos_tagger返回命令式时态中的单词是名词,它们不应该是动词吗?例如:
随着输入:
combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder
Run Code Online (Sandbox Code Playgroud)
输出是:
[('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',', ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')]
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的代码:
def part_of_speech(self,input_sentance):
text = nltk.word_tokenize(input_sentance)
return nltk.pos_tag(text)
Run Code Online (Sandbox Code Playgroud)
不应该'结合'被标记为某种动词吗?这是nltk的错吗?或者我做错了什么?
有没有办法以更高效的方式使用Standford Tagger?
每次调用NLTK的包装器都会为每个分析的字符串启动一个新的java实例,这非常非常慢,特别是当使用更大的外语模型时......
http://www.nltk.org/api/nltk.tag.html#module-nltk.tag.stanford
我试图在NLTK中使用Stanford POS Tagger,但我无法运行此处给出的示例代码http://www.nltk.org/api/nltk.tag.html#module-nltk.tag.stanford
import nltk
from nltk.tag.stanford import POSTagger
st = POSTagger(r'english-bidirectional-distim.tagger',r'D:/stanford-postagger/stanford-postagger.jar')
st.tag('What is the airspeed of an unladen swallow?'.split())
Run Code Online (Sandbox Code Playgroud)
我已经添加了环境变量
CLASSPATH = D:/stanford-postagger/stanford-postagger.jar
STANFORD_MODELS = D:/stanford-postagger/models/
Run Code Online (Sandbox Code Playgroud)
这是我不断得到的错误
Traceback(最近一次调用最后一次):
File "D:\pos_stanford.py", line 4, in <module>
st = POSTagger(r'english-bidirectional-distim.tagger',
r'D:/stanford-postagger/stanford-postagger.jar')
... LookupError: NLTK was unable to find the english-bidirectional-distim.tagger file! Use software specific configuration paramaters or set the STANFORD_MODELS environment variable.
Run Code Online (Sandbox Code Playgroud)
一些论坛建议
File "C:\Python27\lib\site-packages\nltk\tag\stanford.py", line 45, in __init__
env_vars=('STANFORD_MODELS'), verbose=verbose)
Run Code Online (Sandbox Code Playgroud)
应该改变,以便有一个逗号
env_vars=('STANFORD_MODELS',), verbose=verbose)
Run Code Online (Sandbox Code Playgroud)
但它也没有解决问题.请帮我解决这个问题.
其他信息:我使用的是Windows 7 64位Python 2.7 32位NLTK 2.0
我正在尝试nltk.tag.stanford module 用来标记一个句子(首先像wiki的例子),但我一直收到以下错误:
Traceback (most recent call last):
File "test.py", line 28, in <module>
print st.tag(word_tokenize('What is the airspeed of an unladen swallow ?'))
File "/usr/local/lib/python2.7/dist-packages/nltk/tag/stanford.py", line 59, in tag
return self.tag_sents([tokens])[0]
File "/usr/local/lib/python2.7/dist-packages/nltk/tag/stanford.py", line 81, in tag_sents
stdout=PIPE, stderr=PIPE)
File "/usr/local/lib/python2.7/dist-packages/nltk/internals.py", line 160, in java
raise OSError('Java command failed!')
OSError: Java command failed!
Run Code Online (Sandbox Code Playgroud)
或以下LookupError错误:
LookupError:
===========================================================================
NLTK was unable to find the java file!
Use software specific configuration paramaters or set the JAVAHOME environment variable.
=========================================================================== …Run Code Online (Sandbox Code Playgroud) 该nltk包的内置部分的语音恶搞似乎并没有对我的使用情况进行优化(在这里,例如).这里的源代码显示它使用了一个被保存的预训练分类器maxent_treebank_pos_tagger.
创造了maxent_treebank_pos_tagger/english.pickle什么?我猜测那里有一个标记语料库用于训练这个标记器,所以我想我正在寻找(a)标记语料库和(b)基于标记训练标记器的确切代码语料库.
除了大量的谷歌搜索,到目前为止,我试图.pickle直接查看对象,找到其中的任何线索,从这开始
from nltk.data import load
x = load("nltk_data/taggers/maxent_treebank_pos_tagger/english.pickle")
dir(x)
Run Code Online (Sandbox Code Playgroud) 我只是在学习使用Python的nltk.我试着在各种句子上做pos_tag.但获得的结果并不准确.我如何即兴表达结果?
broke = NN
flimsy = NN
crap = NN
Run Code Online (Sandbox Code Playgroud)
此外,我还有很多额外的词被归类为NN.如何过滤这些以获得更好的结果.
我为这个问题的新手性质道歉 - 我一直试图找出Python包装和名称空间,但更好的观点似乎让我无法理解.也就是说,我想将Python包装器用于斯坦福的词性标注器.我在这里找到文档没有问题,它提供了一个使用示例:
st = StanfordTagger('bidirectional-distsim-wsj-0-18.tagger')
st.tag('What is the airspeed of an unladen swallow ?'.split())
[('What', 'WP'), ('is', 'VBZ'), ('the', 'DT'), ('airspeed', 'NN'), ('of', 'IN'), ('an', 'DT'), ('unladen', 'JJ'), ('swallow', 'VB'), ('?', '.')]
Run Code Online (Sandbox Code Playgroud)
这看起来很棒,但我似乎无法在我的本地Python + NLTK安装中显示正确的命名空间(我有最新的NLTK版本,并在Python 2.6.x以及2.7.x中尝试过以下) :
>>> import nltk
>>> from nltk import *
>>> from nltk.tag import stanford
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name stanford
Run Code Online (Sandbox Code Playgroud)
我也尝试了这个import语句,结果相同:
>>> from nltk.tag.stanford import StanfordTagger
Traceback (most recent call last): …Run Code Online (Sandbox Code Playgroud) 我在python中使用nttk的Stanford解析器,并从Stanford Parser和NLTK获得帮助 以建立斯坦福nlp库.
from nltk.parse.stanford import StanfordParser
from nltk.parse.stanford import StanfordDependencyParser
parser = StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
dep_parser = StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
one = ("John sees Bill")
parsed_Sentence = parser.raw_parse(one)
# GUI
for line in parsed_Sentence:
print line
line.draw()
parsed_Sentence = [parse.tree() for parse in dep_parser.raw_parse(one)]
print parsed_Sentence
# GUI
for line in parsed_Sentence:
print line
line.draw()
Run Code Online (Sandbox Code Playgroud)
我得到了错误的解析和依赖树,如下例所示,它将'see'视为名词而不是动词.
我该怎么办?当我改变句子时,它完全正常工作,例如(一个='John see Bill').从这里正确的解析树输出可以看到这句话的正确输出
正确输出的示例如下所示:
我用过这段代码:
# Step 1 : TOKENIZE
from nltk.tokenize import *
words = word_tokenize(text)
# Step 2 : POS DISAMBIG
from nltk.tag import *
tags = pos_tag(words)
Run Code Online (Sandbox Code Playgroud)
标记两句话:约翰非常好.约翰非常好吗?
第一句中的约翰是NN,而第二句中是约翰!那么,如何在不训练后退标记的情况下纠正pos_tag函数呢?
修改后的问题
我在这里看到了NLTK标记器的演示http://text-processing.com/demo/tag/.当我尝试选择"English Taggers&Chunckers:Treebank"或"Brown Tagger"时,我得到了正确的标签.那么如何使用Brown Tagger而不进行培训呢?
在下面的代码中,为什么 nltk 认为 'fish' 是形容词而不是名词?
>>> import nltk
>>> s = "a woman needs a man like a fish needs a bicycle"
>>> nltk.pos_tag(s.split())
[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man', 'NN'), ('like', 'IN'), ('a', 'DT'), ('fish', 'JJ'), ('needs', 'NNS'), ('a', 'DT'), ('bicycle', 'NN')]
Run Code Online (Sandbox Code Playgroud) 我将Ted数据集脚本变形为lematizing.我注意到有些奇怪的事情:并非所有的词都被词状化了.说,
selected -> select
Run Code Online (Sandbox Code Playgroud)
哪个是对的.
然而,involved !-> involve和horsing !-> horse除非我明确地输入"V"(动词)属性.
在python终端上,我得到了正确的输出但不在我的代码中:
>>> from nltk.stem import WordNetLemmatizer
>>> from nltk.corpus import wordnet
>>> lem = WordNetLemmatizer()
>>> lem.lemmatize('involved','v')
u'involve'
>>> lem.lemmatize('horsing','v')
u'horse'
Run Code Online (Sandbox Code Playgroud)
代码的相关部分是这样的:
for l in LDA_Row[0].split('+'):
w=str(l.split('*')[1])
word=lmtzr.lemmatize(w)
wordv=lmtzr.lemmatize(w,'v')
print wordv, word
# if word is not wordv:
# print word, wordv
Run Code Online (Sandbox Code Playgroud)
整个代码在这里.
问题是什么?
有人可以帮我用hunpos标记nltk中的语料库的语法吗?
我要为hunpos.HunPosTagger模块导入什么?
我如何HunPosTag语料库?请参见下面的代码。
import nltk
from nltk.corpus import PlaintextCorpusReader
from nltk.corpus.util import LazyCorpusLoader
corpus_root = './'
reader = PlaintextCorpusReader (corpus_root, '.*')
ntuen = LazyCorpusLoader ('ntumultien', PlaintextCorpusReader, reader)
ntuen.fileids()
isinstance (ntuen, PlaintextCorpusReader)
# So how do I hunpos tag `ntuen`? I can't get the following code to work.
# please help me to correct my python syntax errors, I'm new to python
# but i really need this to work. sorry
##from nltk.tag import hunpos.HunPosTagger
ht = HunPosTagger('english.model') …Run Code Online (Sandbox Code Playgroud) nltk ×12
python ×10
nlp ×5
stanford-nlp ×4
pos-tagger ×3
python-2.7 ×2
corpus ×1
parsing ×1
spacy ×1
wordnet ×1