"SAO"

  这个概念在自然语言处理(NLP)领域中指的是从文本中提取“主体-动作-客体”(Subject-Action-Object)结构。

  1. 主体(Subject):通常是句子中执行动作的人或事物。在英文中,主体通常位于句子的开头。

  2. 动作(Action):这是句子中描述的主要动作或事件。在英文中,动作通常是句子中的动词。

  3. 客体(Object):这是受到动作影响的人或事物。在英文中,客体通常位于动词之后。

  4. example:Tom eats an apple”中,可以提取SAO结构为(Tom - eats - apple)

步骤:

  1. 文本预处理:

    • 分词(Tokenization):将文本分割成单独的词或标记。
    • 词性标注(Part-of-Speech Tagging):为每个单词标注词性(如名词、动词)。
    • 去停用词
  2. 句法分析:

    • 使n NLP库)分析句子结构。
    • 识别句子中的主语(Subject)、谓语(Verb,即Action)和宾语(Object)。
  3. 提取SAO结构:

    • 根据句法分析的结果,识别并提取句子的主体、动作和客体。
    • 在有些情况下,可能需要处理复杂结构(如从句、被动语态等)。
  4. 处理特殊情况:

    • 处理否定、条件句等语言结构可能影响SAO的含义。+

 

解释:

1. 什么是依存句法分析

就是找到句子之间的关系,包括主谓宾等

 

  • “Marie”是句子的主语(nsubj),与动词“was”连接。
  • “was”是助动词(aux),用来构成被动语态,与动词“born”连接。
  • “born”是句子的主要动词,表示发生的动作。
  • “in”是介词(case),指出地点介词短语的开始,与“Paris”连接。
  • “Paris”是地点介词短语的对象(obl),表示动作发生的地点。

SAO 

  1. 主体 (Subject, S):Marie

    • 在依存关系图中,"Marie" 是主语(nsubj)。
  2. 动作 (Action, A):was born

    • 动词 "was" 作为助动词(aux)和 "born" 一起,构成了被动语态的动作。
  3. 客体 (Object, O):in Paris

    • 虽然在被动语态中通常没有直接宾语,但这里 "in Paris" 表示动作发生的位置,可以看作是介词宾语(obl)。

 常见的依存关系类型

NLP工具——Stanza依存关系含义详解_nsubj-CSDN博客

 

句法分析案例:

"The quick brown fox jumps over the lazy dog."

 词性(pos)、词元(lemma)、头部词索引(head)、依赖关系(deprel)

  • “fox”(狐狸)是名词(NOUN),其词元是“fox”,在句子中作为动词“jumps”(跳跃)的主语,因此与“jumps”有一个名词主语依赖关系(nsubj)。
  • “jumps”是句子的根(root),表示它是主要的谓语动作。
import stanza
# stanza.download('en')  # 下载英文模型
nlp = stanza.Pipeline(lang='en', processors='tokenize,mwt,pos,lemma,depparse')
doc = nlp("The quick brown fox jumps over the lazy dog.")
for sentence in doc.sentences:
    for word in sentence.words:
        print(f"word: {word.text}\t\tlemma: {word.lemma}\t\tpos: {word.pos}\t\thead: {word.head}\t\tdeprel: {word.deprel}")

  

以下是词性标注

import nltk
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
from nltk import pos_tag
from nltk.corpus import wordnet

# 下载所需的nltk数据包
# nltk.download('averaged_perceptron_tagger')
# nltk.download('wordnet')

# 初始化词性还原器
lemmatizer = WordNetLemmatizer()

# 示例文本
text = "The quick brown fox jumps over the lazy dog"

# 分词
word_tokens = word_tokenize(text)

# 获取WordNet的词性标签
def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wordnet.ADJ
    elif treebank_tag.startswith('V'):
        return wordnet.VERB
    elif treebank_tag.startswith('N'):
        return wordnet.NOUN
    elif treebank_tag.startswith('R'):
        return wordnet.ADV
    else:
        return None

# 词性标注
tagged_tokens = pos_tag(word_tokens)

# 词性还原
lemmatized_tokens = []
for word, tag in tagged_tokens:
    wntag = get_wordnet_pos(tag)
    if wntag is None:  # 如果没有对应的词性标签,保持原样
        lemma = word
    else:
        lemma = lemmatizer.lemmatize(word, pos=wntag)
    lemmatized_tokens.append(lemma)

# print(lemmatized_tokens)
tagged_tokens

  

 根据句法分析结果提取SAO结果

根据标记的词

 

import stanza

# 下载并设置英文模型
stanza.download('en')
nlp = stanza.Pipeline(lang='en', processors='tokenize,mwt,pos,lemma,depparse')

# 分析句子
doc = nlp("The quick brown fox jumps over the lazy cat.")

# 初始化SAO变量
subject = None
action = None
objects = []

# 遍历句子中的所有单词
for sentence in doc.sentences:
for word in sentence.words:
# 寻找谓语动作,即依存关系标记为 'root' 的单词
if word.deprel == "root":
action = word
# 寻找主体,即与动作有 'nsubj' 依存关系的单词
elif word.deprel == "nsubj":
subject = word
# 寻找宾语,即与动作有 'obj' 依存关系的单词
elif word.deprel == "obj":
objects.append(word)

# 输出SAO结构
print(f"Subject: {subject.text if subject else 'Not found'}")
print(f"Action: {action.text if action else 'Not found'}")
print("Object(s):", ", ".join([obj.text for obj in objects]))

# 如果没有找到直接宾语,我们可以查找间接宾语或介宾短语的宾语
if not objects:
for sentence in doc.sentences:
for word in sentence.words:
if word.deprel in ("iobj", "obl"):
objects.append(word)
print("Indirect Object(s):", ", ".join([obj.text for obj in objects]))

 

posted on 2024-01-18 18:16  黑逍逍  阅读(147)  评论(0编辑  收藏  举报