我想知道在向NLTK的pos标签发送给定的文本之前,是否需要编写一个反收缩函数。我不愿意标记单词,因为它们最终可能会像(不要‘do’,‘nt’)一样,我怀疑这会使pos标记更加困难。
简而言之,我的问题是:nltk的pos标签是否能识别大多数收缩(根据我有限的经验,它似乎能很好地实现w/o单词标记)?单词标记化(相对于简单的单词拆分)会改进或削弱这个过程吗?对我来说写反收缩函数会更容易吗?还有其他能识别宫缩的人吗?
Example_text=“我不能也不会去公园,因为我不喜欢草。”
发布于 2022-09-19 08:20:47
,我想知道在向NLTK的pos标签发送给定的文本之前,是否需要编写一个反收缩函数。
你不知道。默认的nltk标签使用使用默认nltk标记标记的文本进行培训,并正确地处理以相同方式标记的文本。其他任何东西都会是nltk中的一个bug。因此,如果您更改令牌程序,将使性能更差,而不是更好。
如果你尝试一下自己的例子,你会发现它正确地将"ca“和"wo”标记为MD (情态动词),尽管在英语中没有这样的单词;我并不特别喜欢它(为什么不把“no”标记为"can“呢?),但是标记者当然知道如何处理它。
>>> nltk.pos_tag(nltk.word_tokenize(example_text))
[('I', 'PRP'), ('ca', 'MD'), ("n't", 'RB'), ('and', 'CC'), ('I', 'PRP'),
('wo', 'MD'), ("n't", 'RB'), ('go', 'VB'), ('to', 'TO'), ('the', 'DT'),
('park', 'NN'), ('because', 'IN'), ('I', 'PRP'), ('do', 'VBP'), ("n't", 'RB'),
('like', 'VB'), ('grass', 'NN'), ('.', '.')]招待员会不会弄错了?一定。没有一个标记是完美的。但是,如果你想要更好的表现,你需要找到或训练一个更好的标签。您不能“改进”标记器这个词,标记器是设计用来使用的。
PS。您应该一次只传递一个(标记化的)语句给标记者。如果将整个文件作为单词列表传递给它,则会不必要地丢失性能。你应该这样做:
sents = [ nltk.word_tokenize(s) for s in nltk.sent_tokenize(long_text) ]
nltk.pos_tag_sents(sents)发布于 2022-09-12 04:10:29
我目前遇到了类似的问题,我非常想掌握NLTK的窍门(对于synsets比任何东西都重要),我发现Spacy对像我这样的相对新手更友好,在处理收缩时更健壮。
安装:
pip install spacypython -m spacy download en_core_web_sm (或en_core_web_md或en_core_web_lg或en_core_web_trf)
示例:
import spacy
nlp = spacy.load('en_core_web_md')
sent = "I didn't believe it"
tokens_pos = nlp(sent)
for token in tokens_pos:
print(token.lemma_ + ' ' + token.pos_)输出:
I PRON
do AUX
not PART
believe VERB
it PRON正如您所看到的,它同时使符号化和标记化,这需要在NLTK中单独完成。
Spacy甚至适用于典型的拼写错误/懒惰的收缩形式,如cant或dont,而没有撇号。使用regex确保你的句子在处理前是干净的。
当然,没有什么是百分之百完美的。在我的输出中,我实际上注意到我有一些标记为SPACE的流氓标记,我认为这可能是原始文本中双空格的结果。它似乎在每个空格将字符串拆分成标记,将相邻的空间本身作为语音的一部分,因此您可能需要添加一些功能来过滤掉这些标记。
我在实验中注意到的另一件事(实际上我可能会写一篇关于这一点的文章)是处理撇号的方法。
在我的原始文本中,有些缩略词有一个6或9字形的撇号,通常出现在引号的开头和结尾,而不是标准的垂直',Spacy的处理方式也不同,所以您也可能希望在做任何NLPing之前将它们替换掉。
https://stackoverflow.com/questions/68718411
复制相似问题