希望从句子中提取复合名词形容词对。所以,基本上我想要这样的东西:

2023-12-14

对于形容词:

"The company's customer service was terrible."
{customer service, terrible}

对于动词:

"They kept increasing my phone bill"
{phone bill, increasing}

这是来自的分支问题这个帖子

不过,我正在尝试使用 spacy 查找与多标记短语/复合名词(例如“客户服务”)相对应的形容词和动词。

我不知道如何使用 spacy、nltk 或任何其他预打包的自然语言处理软件来执行此操作,如果有任何帮助,我将不胜感激!


对于像这样的简单示例,您可以使用 spaCy 的依存句法分析有一些简单的规则。

首先,要识别与给出的示例类似的多词名词,您可以使用“复合”依赖关系。使用 spaCy 解析文档(例如句子)后,使用标记的dep_属性来查找它的依赖关系。

例如,这句话有两个复合名词:

“复合依赖关系识别复合名词。”

每个令牌及其依赖关系如下所示:

import spacy
import pandas as pd
nlp = spacy.load('en')

example_doc = nlp("The compound dependency identifies compound nouns.")
for tok in example_doc:
    print(tok.i, tok, "[", tok.dep_, "]")

>>>0 The [ det ]
>>>1 compound [ compound ]
>>>2 dependency [ nsubj ]
>>>3 identifies [ ROOT ]
>>>4 compound [ compound ]
>>>5 nouns [ dobj ]
>>>6 . [ punct ]
for tok in [tok for tok in example_doc if tok.dep_ == 'compound']: # Get list of 
compounds in doc
    noun = example_doc[tok.i: tok.head.i + 1]
    print(noun)
>>>compound dependency
>>>compound nouns

以下函数适用于您的示例。但是,它可能不适用于更复杂的句子。

adj_doc = nlp("The company's customer service was terrible.")
verb_doc = nlp("They kept increasing my phone bill")

def get_compound_pairs(doc, verbose=False):
    """Return tuples of (multi-noun word, adjective or verb) for document."""
    compounds = [tok for tok in doc if tok.dep_ == 'compound'] # Get list of compounds in doc
    compounds = [c for c in compounds if c.i == 0 or doc[c.i - 1].dep_ != 'compound'] # Remove middle parts of compound nouns, but avoid index errors
    tuple_list = []
    if compounds: 
        for tok in compounds:
            pair_item_1, pair_item_2 = (False, False) # initialize false variables
            noun = doc[tok.i: tok.head.i + 1]
            pair_item_1 = noun
            # If noun is in the subject, we may be looking for adjective in predicate
            # In simple cases, this would mean that the noun shares a head with the adjective
            if noun.root.dep_ == 'nsubj':
                adj_list = [r for r in noun.root.head.rights if r.pos_ == 'ADJ']
                if adj_list:
                    pair_item_2 = adj_list[0] 
                if verbose == True: # For trying different dependency tree parsing rules
                    print("Noun: ", noun)
                    print("Noun root: ", noun.root)
                    print("Noun root head: ", noun.root.head)
                    print("Noun root head rights: ", [r for r in noun.root.head.rights if r.pos_ == 'ADJ'])
            if noun.root.dep_ == 'dobj':
                verb_ancestor_list = [a for a in noun.root.ancestors if a.pos_ == 'VERB']
                if verb_ancestor_list:
                    pair_item_2 = verb_ancestor_list[0]
                if verbose == True: # For trying different dependency tree parsing rules
                    print("Noun: ", noun)
                    print("Noun root: ", noun.root)
                    print("Noun root head: ", noun.root.head)
                    print("Noun root head verb ancestors: ", [a for a in noun.root.ancestors if a.pos_ == 'VERB'])
            if pair_item_1 and pair_item_2:
                tuple_list.append((pair_item_1, pair_item_2))
    return tuple_list

get_compound_pairs(adj_doc)
>>>[(customer service, terrible)]
get_compound_pairs(verb_doc)
>>>[(phone bill, increasing)]
get_compound_pairs(example_doc, verbose=True)
>>>Noun:  compound dependency
>>>Noun root:  dependency
>>>Noun root head:  identifies
>>>Noun root head rights:  []
>>>Noun:  compound nouns
>>>Noun root:  nouns
>>>Noun root head:  identifies
>>>Noun root head verb ancestors:  [identifies]
>>>[(compound nouns, identifies)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

希望从句子中提取复合名词形容词对。所以,基本上我想要这样的东西: 的相关文章

随机推荐

  • 我可以在同一个 Xcode 项目中拥有 Swift、Objective-C、C 和 C++ 文件吗?

    是否可以在同一个项目中使用所有 4 种语言 如果可以 如何使用 有similar风味问题 我可以将 Swift 与 C 混合使用吗 就像 Objective C mm 文件一样接受的答案是no Using Bridging Header充分
  • Python:itertools.product() 的更快替代方案?

    我试图找到长度 22 且元素值 1 9 的列表的所有可能组合 当我使用 i for i in itertools product range 1 10 repeat 22 Python崩溃 Python 有更快的替代方案吗 正如大家评论的那
  • Windows Phone 模拟器无法连接到 Windows Phone 操作系统

    当我运行我的应用程序时出现此消息 Windows Phone 模拟器无法连接到 Windows Phone 操作系统 电话未响应连接请求 某些功能可能会被禁用 搜索后我找到了这个答案 打开 Hyper V 管理器 左栏 左键单击您的计算机名
  • 为什么使用 gems 来提供资产而不是供应商文件?

    我对 Rails 比较陌生 我有一个关于从 gem 提供资产与仅将文件加载到资产管道中的问题 据我所知 它们实际上做了相同的事情 因为它们都使文件在资产管道中可用 以便在清单中调用 提供类似服务有什么优势 gem jquery rails
  • 映射数组返回 [object Object]

    我有一个Keypad组件 每次按下按钮时 它都应该将该按钮的值添加到数组中 var keys this props keys map function k index return tr td td tr
  • 单击一次后禁用按钮

    我需要在单击按钮后将其禁用 以便用户不能多次单击它 我的应用程序是用 MVC ASP NET 编写的 我在普通的 ASP NET 应用程序中完成了此操作 我尝试使用 JavaScript 和 jQuery 但它不起作用 该按钮被禁用 但表单
  • 如何在 yocto 中编译基本的 c 文件

    我正在 yocto 上工作 我想在 yocto 中编译一些 C 文件并将生成的二进制文件安装到外部文件系统 在此之前 我尝试创建一个单独的记录并从中编译 C 代码 我无法编译它 我不确定是否理解这个问题 因为它不够精确 在配方树中包含 C
  • R gsub 从 x 列中的单词中删除 y 列中的单词

    我正在尝试使用 gsub 删除 y 列中 x 列中的单词 文本 x c a b c y c asometext some a b text c a text df cbind x y df data frame df df y gsub d
  • 反应状态没有立即更新

    React 状态不会立即更新 我想在按下 播放 按钮后立即更新状态 import as React from react import Button from react native export default function Pla
  • SVG 旋转动画在 IE 和 FF 中失败

    我正在努力使用 SVG 制作一个简单的加载旋转元素 它在 Chrome 中运行良好 但在其他浏览器中则不然 在 IE 中 动画根本不起作用 更麻烦的是 在 FF 中 动画可以工作 但旋转没有集中在正确的位置 我该怎么做才能让它在 FF 中正
  • 带有捆绑包的应用程序小部件?

    大家好 我有应用程序小部件 我想通过单击小部件将一些数据发送到附加到 PendingIntent 的意图 这是我的代码 final int N appWidgetIds length for int i 0 i lt N i int app
  • 按钮悬停时的菜单

    我正在尝试为 WordPress 主题制作菜单 但遇到了一些麻烦 我希望菜单隐藏并仅在我们悬停按钮时显示 菜单是同级 div 的子级 如下所示 div div class menu div 我怎样才能使用 CSS 来做到这一点 以便当我将鼠
  • 合并两个具有重复列的数据框

    我有几个 csv 文件 每个文件都对应每月的客户列表以及有关他们的一些信息 每个文件都包含有关客户的相同信息 例如 names data jan ID AGE CITY GENDER names data feb ID AGE CITY G
  • PHP MVC:控制器中有太多依赖项?

    我正在开发一个个人 HMVC 项目 没有服务定位器 没有全局状态 比如static or global 没有单身人士 模型处理封装在服务中 服务 域对象 存储库 数据映射器 所有控制器都扩展一个抽象控制器 所有项目依赖项都通过注入Auryn
  • 如何防止类型被用作映射键?

    我有一个可以用作映射键的类型 但我想防止这种情况发生 我假设如果该类型包含私有成员 则不可能从其他包中获得该成员 但这似乎仍然有效 使该类型无法用作地图键的最佳方法是什么 type MyType struct A A b b prevent
  • 使用循环整数定义变量:c++

    我有一个运行结束的 for 循环i 对于每次迭代 我希望它创建一个名为var i即如果我的循环运行结束i 0 to i 4 它应该创建像这样的变量var 0 var 1 var 2 var 3 and var 4 如何在 C 中做到这一点
  • 开玩笑模拟 moment() 返回特定日期

    我知道这个问题已经被问过多次了 但我找不到适合我的情况的正确的 我想模拟 moment 以返回特定日期 First 我嘲笑 jest mock moment gt return date string gt jest requireActu
  • 使用相机时的屏幕截图(Android)

    我正在尝试制作我的应用程序的快照 我遇到的问题是 这个应用程序旨在成为一个增强现实应用程序 我有一个包含一些图层的视图 背景图层是相机视图 我通过启用并获取根视图绘图缓存进行了尝试 但结果是一个带有黑色背景的位图及其上的其余图层 另外 为了
  • 有没有办法使用 ruby​​ on Rails 读取客户端 Windows 登录名

    我在 Windows 上运行的 Ruby on Rails 上构建了一个 Intranet 应用程序 将访问此应用程序的每个人都在 Windows 上运行 并且已经使用 Windows 登录到网络 我需要做的就是获取登录用户的登录名并将该登
  • 希望从句子中提取复合名词形容词对。所以,基本上我想要这样的东西:

    对于形容词 The company s customer service was terrible customer service terrible 对于动词 They kept increasing my phone bill phon