查找名词和动词在句子中的位置 Python

Finding the position of Noun and Verb in a sentence Python

有没有办法找到 pos-tag 'NN' 和 'VB' 的单词在 Python 的句子中的位置?

csv 文件中的句子示例: “男人走进一家酒吧。” “警察开枪了。” “孩子开车进沟里”

你应该看看 nltk

来自文档:

import nltk
text = nltk.tokenize.word_tokenize("They refuse to permit us to obtain the refuse permit")


nltk.pos_tag(text)

[('They', 'PRP'), ('refuse', 'VBP'), ('to', 'TO'), ('permit', 'VB'), ('us', 'PRP'),
('to', 'TO'), ('obtain', 'VB'), ('the', 'DT'), ('refuse', 'NN'), ('permit', 'NN')]

您可以使用一些现有的 NLP 框架(例如我们 Spacy or NLTK)在文本上找到某些 PoS 标签的位置。处理文本后,您可以迭代每个标记并检查 pos 标记是否是您要查找的内容,然后获取该标记在文本中的 start/end 位置。

Spacy

使用 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)

简而言之,我从字符串构建一个新文档,遍历所有标记并仅保留那些 post 标记为 VERB 或 NOUN 的标记。最后,我将令牌信息添加到列表中以供进一步处理。我强烈建议您阅读以下 spacy tutorial 以获取更多信息。

NLTK

我认为使用 NLTK 也非常简单,使用 NLTK tokenizer and pos tagger。其余的几乎类似于我们使用 spacy 的方式。

我不确定获取每个标记的 start-end 位置的最正确方法。请注意,为此我使用了一个由 WhitespaceTokenizer().tokenize() 方法创建的标记化助手,其中 returns 一个元组列表,其中包含每个标记的开始和结束位置。也许有一种更简单 NLTK-like 的方法。

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)

希望这对你有用!