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

Beg*_*ner 6 python indexing position nltk pos-tagger

有没有办法在Python的句子中找到带有后标记“NN”和“VB”的单词的位置?

csv 文件中的句子示例:“Man walks into a bar.” “警察开枪了。” “孩子开车掉进沟里了”

Emi*_*tti 7

您可以使用一些现有的 NLP 框架(例如SpacyNLTK)在文本上查找某些 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 tokenizerpos 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)

我希望这对你有用!

  • 您好,您可以用代码和您期望的示例来编辑您的原始问题吗?我想如果您有一个包含多行的 CSV 文件,并且您希望每行都有一个结果,您可以在 for 循环中单独处理每一行...所以请给我更多信息,以便我可以帮助您 (2认同)