当前位置: 首页 > 知识库问答 >
问题:

使用spaCy删除含有停止词的名词短语

锺离明煦
2023-03-14

我一直在用spaCy查找最常用的名词和noun_phrases

在寻找单个名词时,我可以成功地去掉标点符号并停止单词

docx = nlp('The bird is flying high in the sky blue of color')

# Just looking at nouns
nouns = []
for token in docx:
    if token.is_stop != True and token.is_punct != True and token.pos_ == 'NOUN':
        nouns.append(token)

# Count and look at the most frequent nouns #
word_freq = Counter(nouns)
common_nouns = word_freq.most_common(10)

然而,使用noun_chunks来确定短语会导致属性错误

noun_phrases = []
for noun in docx.noun_chunks: 
    if len(noun) > 1 and '-PRON-' not in noun.lemma_ and noun.is_stop:
        noun_phrases.append(noun)

spacy.tokens.span.Span对象没有属性

我理解的性质的消息但我不能为我的生活得到语法正确的地方存在的停止字在一个emmatiated字符串将排除从被附加到noun_phrases列表

不删除停止字的输出

[{'word':'the bird','emma':'the bird','len': 2},{'word':'the sky Blue','emma':'the sky Blue','len': 3}]

预期输出(删除包含停止字的引理,包括“the”

[{}]

共有2个答案

严劲
2023-03-14

您也可以尝试Berkeley自然解析器。https://spacy.io/universe/project/self-attentive-parser我听说,它给了你一个宾州树库解析树。我还被告知,这是缓慢的:-(

此外,如果我没有弄错的话,名词块由代词组成,代词与is_stop_、pos_和tag_一起出现;i、 例如,您可以相应地进行过滤。

我发现名词组块有两个令人沮丧的问题,那就是它在右边的边界上追逐名词,两个名词组块之间有间歇性的“和”!关于第一个问题,它不会把“加州大学”作为一个大块,而是把“大学”和“加州”作为两个独立的名词大块。此外,它不一致,这让我很难过。吉姆·史密斯和贾恩·琼斯可以作为“吉姆·史密斯”加上“贾恩·琼斯”作为两个名词块;这是正确的答案。或者“吉姆·史密斯和贾恩·琼斯”都是一个名词块!?!

司空赞
2023-03-14

你使用的是什么版本的spacy和python

我使用Python3.6.5和spacy2.0.12在mac高塞拉。您的代码似乎显示了预期的输出。

import spacy
from collections import Counter

nlp = spacy.load('en_core_web_sm')

docx = nlp('The bird is flying high in the sky blue of color')

# Just looking at nouns
nouns = []
for token in docx:
    if token.is_stop != True and token.is_punct != True and token.pos_ == 'NOUN':
        nouns.append(token)

# Count and look at the most frequent nouns #
word_freq = Counter(nouns)
common_nouns = word_freq.most_common(10)

print( word_freq)
print(common_nouns)


$python3  /tmp/nlp.py
Counter({bird: 1, sky: 1, blue: 1, color: 1})
[(bird, 1), (sky, 1), (blue, 1), (color, 1)]

另外,“is_stop”docx的一个属性。你可以通过

>>> dir(docx)

您可能需要升级spacy及其依赖项,看看这是否有帮助。

此外,飞行代码是一个VERB,所以即使在再梅化之后,它也不会根据您的条件被追加。

token.text, token.lemma_, token.pos_, token.tag_, token.dep_,
          token.shape_, token.is_alpha, token.is_stop
flying fly VERB VBG ROOT xxxx True False

编辑-1

你可以试试这样的。因为我们不能直接在单词块上使用is_stop,所以我们可以逐词遍历每个块,并根据您的要求检查条件。(例如,没有停止词且有长度

noun_phrases = []
for chunk in docx.noun_chunks:
    print(chunk)
    if all(token.is_stop != True and token.is_punct != True and '-PRON-' not in token.lemma_ for token in chunk) == True:
        if len(chunk) > 1:
            noun_phrases.append(chunk)
print(noun_phrases)

结果:

python3 /tmp/so.py
Counter({bird: 1, sky: 1, blue: 1, color: 1})
[(bird, 1), (sky, 1), (blue, 1), (color, 1)]
The bird
the sky blue
color
[]   # contents of noun_phrases is empty here.

希望这能有所帮助。如果所有条件都符合您的要求,您可以调整中的条件。

 类似资料:
  • 问题内容: 我正在寻找一个类或方法,该类或方法需要一个长字符串(包含数百个单词),并进行标记化,删除停用词和词干,以用于IR系统。 例如: “大肥猫,对袋鼠说’我认识的最有趣的家伙’。” 分词器将删除标点符号并返回一个单词 停用词删除器会删除“ the”,“ to”等词 词干会减少每个单词的“词根”,例如“最有趣”会变得很有趣 提前谢谢了。 问题答案: AFAIK Lucene可以做您想要的。用和

  • 本文向大家介绍在Python中使用NLTK删除停用词,包括了在Python中使用NLTK删除停用词的使用技巧和注意事项,需要的朋友参考一下 当计算机处理自然语言时,某些极端通用的单词似乎在帮助选择符合用户需求的文档方面几乎没有值,因此完全从词汇表中排除了。这些单词称为停用词。 例如,如果您输入的句子为- 停止单词删除后,您将获得输出- NLTK收集了这些停用词,我们可以将其从任何给定的句子中删除。

  • 问题内容: 如何使用spacy从文本中提取名词短语? 我指的不是语音标签的一部分。在文档中,我找不到有关名词短语或常规分析树的任何内容。 问题答案: 如果要使用基本NP,即没有协调,介词短语或相对从句的NP,则可以在Doc和Span对象上使用noun_chunks迭代器: 如果您需要其他内容,最好的方法是遍历句子中的单词并考虑句法上下文,以确定该单词是否支配您想要的短语类型。如果是这样,则产生其子

  • 问题内容: 是否可以使用正则表达式删除文本中的小词?例如,我有以下字符串(文本): 我想删除所有不超过3个字符的单词。结果应为: 使用正则表达式或任何其他python函数可以做到吗? 谢谢。 问题答案: 当然,这也不难: 上面的表达式选择任何以某些非单词字符开头的单词(本质上是空格或开头),其长度在1-3个字符之间,并以单词边界结尾。 该边界的比赛是很重要的位置,他们保证你不匹配只是一个字的第一个

  • 问题内容: 用spacy添加/删除停用词的最佳方法是什么?我正在使用函数,并希望对集合进行一些自定义更改。我正在查看文档,但找不到有关停用词的任何内容。谢谢! 问题答案: 您可以在像这样处理文本之前编辑它们(请参阅此文章): 注意:这似乎在<= v1.8时有效。对于较新的版本,请参阅其他答案。

  • 问题内容: 我正在尝试从文本字符串中删除停用词: 我正在处理600万这种字符串,因此速度很重要。分析我的代码,最慢的部分是上面的几行,是否有更好的方法来做到这一点?我正在考虑使用正则表达式之类的东西,但我不知道如何为一组单词写模式。有人可以帮我忙吗,我也很高兴听到其他可能更快的方法。 注意:我尝试过有人建议用来包裹,但这没什么区别。 谢谢。 问题答案: 尝试缓存停用词对象,如下所示。每次调用函数时