查找名词和动词在句子中的位置 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)
希望这对你有用!
有没有办法找到 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)
希望这对你有用!