Beg*_*ner 6 python indexing position nltk pos-tagger
有没有办法在Python的句子中找到带有后标记“NN”和“VB”的单词的位置?
csv 文件中的句子示例:“Man walks into a bar.” “警察开枪了。” “孩子开车掉进沟里了”
您可以使用一些现有的 NLP 框架(例如Spacy或NLTK)在文本上查找某些 PoS 标签的位置。处理文本后,您可以迭代每个标记并检查 pos 标记是否是您要查找的内容,然后获取该标记在文本中的开始/结束位置。
斯帕西
使用 spacy,实现您想要的代码将如下所示:
import spacy
nlp = spacy.load("en_core_web_lg")
doc = nlp("Man walks into a bar.") # Your text here
words = []
for token in doc:
if token.pos_ == "NOUN" or token.pos_ == "VERB":
start = token.idx # Start position of token
end = token.idx + len(token) # End position = start + len(token)
words.append((token.text, start, end, token.pos_))
print(words)
Run Code Online (Sandbox Code Playgroud)
简而言之,我从字符串构建一个新文档,迭代所有标记并仅保留那些 post 标记为 VERB 或 NOUN 的标记。最后,我将令牌信息添加到列表中以进行进一步处理。我强烈建议您阅读以下spacy 教程以获取更多信息。
NLTK
我认为使用 NLTK 也非常简单,使用NLTK tokenizer和pos tagger。其余的几乎与我们使用 spacy 的方式类似。
我不确定获取每个标记的起始位置的最正确方法。请注意,为此,我使用由WhitespaceTokenizer().tokenize()方法创建的标记化助手,该方法返回包含每个标记的开始和结束位置的元组列表。也许有一种更简单且类似 NLTK 的方法。
import nltk
from nltk.tokenize import WhitespaceTokenizer
text = "Man walks into a bar." # Your text here
tokens_positions = list(WhitespaceTokenizer().span_tokenize(text)) # Tokenize to spans to get start/end positions: [(0, 3), (4, 9), ... ]
tokens = WhitespaceTokenizer().tokenize(text) # Tokenize on a string lists: ["man", "walks", "into", ... ]
tokens = nltk.pos_tag(tokens) # Run Part-of-Speech tager
# Iterate on each token
words = []
for i in range(len(tokens)):
text, tag = tokens[i] # Get tag
start, end = tokens_positions[i] # Get token start/end
if tag == "NN" or tag == "VBZ":
words.append((start, end, tag))
print(words)
Run Code Online (Sandbox Code Playgroud)
我希望这对你有用!