"SAO"
这个概念在自然语言处理(NLP)领域中指的是从文本中提取“主体-动作-客体”(Subject-Action-Object)结构。
-
主体(Subject):通常是句子中执行动作的人或事物。在英文中,主体通常位于句子的开头。
-
动作(Action):这是句子中描述的主要动作或事件。在英文中,动作通常是句子中的动词。
-
客体(Object):这是受到动作影响的人或事物。在英文中,客体通常位于动词之后。
- example:Tom eats an apple”中,可以提取SAO结构为(Tom - eats - apple)
步骤:
-
文本预处理:
- 分词(Tokenization):将文本分割成单独的词或标记。
- 词性标注(Part-of-Speech Tagging):为每个单词标注词性(如名词、动词)。
- 去停用词
-
句法分析:
- 使n NLP库)分析句子结构。
- 识别句子中的主语(Subject)、谓语(Verb,即Action)和宾语(Object)。
-
提取SAO结构:
- 根据句法分析的结果,识别并提取句子的主体、动作和客体。
- 在有些情况下,可能需要处理复杂结构(如从句、被动语态等)。
-
处理特殊情况:
- 处理否定、条件句等语言结构可能影响SAO的含义。+
解释:
1. 什么是依存句法分析
就是找到句子之间的关系,包括主谓宾等
- “Marie”是句子的主语(nsubj),与动词“was”连接。
- “was”是助动词(aux),用来构成被动语态,与动词“born”连接。
- “born”是句子的主要动词,表示发生的动作。
- “in”是介词(case),指出地点介词短语的开始,与“Paris”连接。
- “Paris”是地点介词短语的对象(obl),表示动作发生的地点。
SAO
-
主体 (Subject, S):Marie
- 在依存关系图中,"Marie" 是主语(nsubj)。
-
动作 (Action, A):was born
- 动词 "was" 作为助动词(aux)和 "born" 一起,构成了被动语态的动作。
-
客体 (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),表示它是主要的谓语动作。
1 2 3 4 5 6 7 | 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}" ) |
以下是词性标注
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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]))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2023-01-18 tf