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

使用python从NLTK中提取名词短语

夔学智
2023-03-14

我是新的Python和nltk。我已经将代码从https://gist.github.com/alexbowe/879414转换为下面给定的代码,使其运行于许多文档/文本块。但我得到了以下错误

 Traceback (most recent call last):
 File "E:/NLP/PythonProgrames/NPExtractor/AdvanceMain.py", line 16, in    <module>
  result = np_extractor.extract()
 File "E:\NLP\PythonProgrames\NPExtractor\NPExtractorAdvanced.py", line 67,   in extract
 for term in terms:
File "E:\NLP\PythonProgrames\NPExtractor\NPExtractorAdvanced.py", line 60, in get_terms
 for leaf in self.leaves(tree):
 TypeError: leaves() takes 1 positional argument but 2 were given

有人能帮我解决这个问题吗。我必须从数以百万计的产品评论中提取名词短语。我使用了使用Java的Standford NLP工具包,但速度非常慢,所以我认为在python中使用nltk会更好。如果有更好的解决方案,也请推荐。

import nltk
from nltk.corpus import stopwords
stopwords = stopwords.words('english')
grammar = r"""
 NBAR:
    {<NN.*|JJ>*<NN.*>}  # Nouns and Adjectives, terminated with Nouns
 NP:
    {<NBAR>}
    {<NBAR><IN><NBAR>}  # Above, connected with in/of/etc...
"""
   lemmatizer = nltk.WordNetLemmatizer()
   stemmer = nltk.stem.porter.PorterStemmer()

class NounPhraseExtractor(object):

    def __init__(self, sentence):
        self.sentence = sentence

    def execute(self):
        # Taken from Su Nam Kim Paper...
        chunker = nltk.RegexpParser(grammar)
        #toks = nltk.regexp_tokenize(text, sentence_re)
        # #postoks = nltk.tag.pos_tag(toks)
        toks = nltk.word_tokenize(self.sentence)
        postoks = nltk.tag.pos_tag(toks)
        tree = chunker.parse(postoks)
        return tree

    def leaves(tree):
        """Finds NP (nounphrase) leaf nodes of a chunk tree."""
        for subtree in tree.subtrees(filter=lambda t: t.label() == 'NP'):
            yield subtree.leaves()

    def normalise(word):
        """Normalises words to lowercase and stems and lemmatizes it."""
        word = word.lower()
        word = stemmer.stem_word(word)
        word = lemmatizer.lemmatize(word)
        return word

    def acceptable_word(word):
        """Checks conditions for acceptable word: length, stopword."""
        accepted = bool(2 <= len(word) <= 40
                    and word.lower() not in stopwords)
        return accepted

    def get_terms(self,tree):
        for leaf in self.leaves(tree):
            term = [self.normalise(w) for w, t in leaf if self.acceptable_word(w)]
        yield term

    def extract(self):
        terms = self.get_terms(self.execute())
        matches = []
        for term in terms:
            for word in term:
                matches.append(word)
        return matches

共有1个答案

宫亦
2023-03-14

你需要要么:

  • 修饰每个规范化acceptable_word,并且留给@static method,或
  • 添加一个Self参数作为这些方法的第一个参数。

您正在呼叫self。leaves将self作为隐式第一个参数传递给leaves方法(但您的方法只接受一个参数)。使用这些静态方法或添加self参数将解决此问题。

(稍后调用self.acceptable_wordself.normalize也会出现同样的问题)

您可以在Python的文档中阅读Python的静态方法,也可以从更容易理解的外部站点上阅读。

 类似资料:
  • 问题内容: 有更有效的方法吗?我的代码读取一个文本文件并提取所有名词。 如何减少此代码的时间复杂度?有没有办法避免使用嵌套的for循环? 提前致谢! 问题答案: 如果您不接受其他选项,请签出。它可以轻松提取所有名词和名词短语:

  • 我试图用NLTK从句子中提取介词短语。有没有一种方法可以让我自动做到这一点(例如,向函数输入一个句子,然后返回它的介词短语)? 这里的例子似乎要求你先从语法开始,然后才能得到解析树。我能自动获取语法并使用它来获取解析树吗? 显然,我可以标记一个句子,挑出介词和后面的名词,但当介词补语是复合词时,这很复杂。

  • 我试图从文本或语料库中提取关键词。这些不是最常见的词,而是最“关于”文本的词。我有一个比较示例,我生成的列表与示例列表非常不同。你能给我一个指针来生成一个很好的关键字列表,其中不包括像“you”和“tis”这样的低义词吗? 我用“罗密欧与朱丽叶”作为我的文本。我的做法(见斯科特 我收到了很多像“你”、“她”和“它”这样的词,但它们并没有出现在它们的列表中,我也没有收到像“放逐”和“教堂墓地”这样的

  • 本文向大家介绍在Python中使用NLTK库实现对词干的提取的教程,包括了在Python中使用NLTK库实现对词干的提取的教程的使用技巧和注意事项,需要的朋友参考一下 什么是词干提取? 在语言形态学和信息检索里,词干提取是去除词缀得到词根的过程─—得到单词最一般的写法。对于一个词的形态词根,词干并不需要完全相同;相关的词映射到同一个词干一般能得到满意的结果,即使该词干不是词的有效根。从1968年开

  • 问题内容: WordNet很棒,但是我很难在nltk中获得同义词。如果您在此处类似地搜索“ small”一词,则会显示所有同义词。 基本上,我只需要了解以下内容: 哪里的选项可以是化名和反义词,但是获取同义词的选择是什么? 问题答案: 如果您想要同义词集中的同义词(又称组成集合的引理),则可以使用以下命令获取它们:

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