- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试理解 nltk.tree 模块。我很困惑为什么当打印 nltk.tree.Tree 对象时,它不打印出地址。相反,它打印出树的字符串表示形式。
我查看了 nltk.tree 中的源代码,但我知道哪部分代码将树格式化为字符串。
import nltk
from nltk.tree import Tree
print(Tree(1, [2, Tree(3, [4]), 5]))
print(type(Tree(1, [2, Tree(3, [4]), 5])))
输出
(1 2 (3 4) 5)
<class 'nltk.tree.Tree'>
如果定义一个示例类
class example():
def __init__(self):
''
this_class = example()
print(this_class)
print(type(this_one))
输出:
<__main__.example object at 0x000001397F255668>
<class '__main__.example'>
我明白了。这是为什么?
最佳答案
要明确的是,我认为问题是问为什么 NLTK 中的 Tree
对象的输入是整数,但在打印时,表示打印出字符串而不会引发任何错误。
让我们深入研究一下代码。
以人类可读的括号解析格式打印出Tree
的部分是https://github.com/nltk/nltk/blob/develop/nltk/tree.py#L820处的__str__()
函数。
如果我们仔细观察,它会调用 pformat()
函数:
def __str__(self):
return self.pformat()
https://github.com/nltk/nltk/blob/develop/nltk/tree.py#L835处的pformat()
函数:
def pformat(self, margin=70, indent=0, nodesep='', parens='()', quotes=False):
"""
:return: A pretty-printed string representation of this tree.
:rtype: str
:param margin: The right margin at which to do line-wrapping.
:type margin: int
:param indent: The indentation level at which printing
begins. This number is used to decide how far to indent
subsequent lines.
:type indent: int
:param nodesep: A string that is used to separate the node
from the children. E.g., the default value ``':'`` gives
trees like ``(S: (NP: I) (VP: (V: saw) (NP: it)))``.
"""
# Try writing it on one line.
s = self._pformat_flat(nodesep, parens, quotes)
if len(s) + indent < margin:
return s
# If it doesn't fit on one line, then write it on multi-lines.
if isinstance(self._label, string_types):
s = '%s%s%s' % (parens[0], self._label, nodesep)
else:
s = '%s%s%s' % (parens[0], unicode_repr(self._label), nodesep)
for child in self:
if isinstance(child, Tree):
s += (
'\n'
+ ' ' * (indent + 2)
+ child.pformat(margin, indent + 2, nodesep, parens, quotes)
)
elif isinstance(child, tuple):
s += '\n' + ' ' * (indent + 2) + "/".join(child)
elif isinstance(child, string_types) and not quotes:
s += '\n' + ' ' * (indent + 2) + '%s' % child
else:
s += '\n' + ' ' * (indent + 2) + unicode_repr(child)
return s + parens[1]
如果我们看看如何在 pformat
函数中创建字符串 s
变量,我们会看到 unicode_repr()
的多次使用.
打印时,输入将转换为 pformat 内的字符串,但 Tree
对象中的子项和值仍保持与输入时相同的类型。
现在,如果我们查看 nltk.tree.py
中的 unicode_repr
,
from nltk.compat import python_2_unicode_compatible, unicode_repr
我们看到它来自 https://github.com/nltk/nltk/blob/develop/nltk/compat.py#L298 的 nltk.compat
def unicode_repr(obj):
"""
For classes that was fixed with @python_2_unicode_compatible
``unicode_repr`` returns ``obj.unicode_repr()``; for unicode strings
the result is returned without "u" letter (to make output the
same under Python 2.x and Python 3.x); for other variables
it is the same as ``repr``.
"""
if PY3:
return repr(obj)
# Python 2.x
if hasattr(obj, 'unicode_repr'):
return obj.unicode_repr()
if isinstance(obj, text_type):
return repr(obj)[1:] # strip "u" letter from output
return repr(obj)
在 Python 3 中,nltk.compat.unicode_repr
仅返回默认情况下采用 unicode 格式的 repr
,特别是 utf8
IIRC。
但在 Python 2 中,它首先检查对象是否具有 unicode_repr()
Monkey-patch 函数。
然后它会检查它是否是 six
库中的 text_type
类型,如果是,它将打印出不带 u
的输出前缀,例如你“...”
最后,它是 Python 2,并且该对象没有 unicode_repr()
并且不是 six.text_type
,它只会打印出 repr(obj)
.
回到问题,当对象是整数时,repr(int)
将被转换为字符串。
>>> type(1)
<class 'int'>
>>> repr(1)
'1'
>>> type(repr(1))
<class 'str'>
关于python - nltk.tree.Tree 对象如何生成树的字符串表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56032676/
NLTK 感知器标记器的标记集是什么?预训练模型使用的语料库是什么? 我试图从NLTK网站上找到官方信息。但他们没有那个。 最佳答案 来自 https://github.com/nltk/nltk/p
我无法理解这两者之间的区别。不过,我了解到word_tokenize将Penn-Treebank用于标记化目的。但TweetTokenizer上的任何内容都不可用。对于哪种类型的数据,我应该使用Twe
我正在学习 NLTK 和我的 mac 工作正常,除非我在 FreqDist() 上遇到问题。 (我看到另一个关于 FreqDist() 的问题,但他收到了不同的错误消息。TypeError: unha
我尝试了正则表达式词干分析器,但我得到了数百个不相关的标记。我只是对“播放”词干感兴趣。这是我正在使用的代码: import nltk from nltk.book import * f = open
我正在尝试使用 NLTK 命名实体标记器来识别各种命名实体。在使用 Python 进行自然语言处理一书中,他们提供了常用命名实体的列表(表 7.4,如果有人好奇的话),其中包括:日期 6 月,2008
我有很多文本数据,我想进行分类。我逐 block 递增地获取这些数据(例如 500 个样本)。我想用这些 block 在 NLTK 中对 NaiveBayesClassifier 进行训练,但要进行零
我在尝试运行实体提取功能时遇到问题。我相信这是版本差异。以下工作示例在 2.0.4 中运行,但不在 3.0 中运行。我确实将一个函数调用:batch_ne_chunk 更改为:nltk.ne_chun
我正在使用 docker 运行一个使用 nltk、languagetool 等的 NLP 系统... 当我使用 docker-compose build --build-arg env=dev我收到警
我正在检查 NLTK 的命名实体识别功能。是否可以找出提取出的哪个关键字与原文最相关?另外,是否可以知道提取的关键字的类型(人/组织)? 最佳答案 如果你有一个训练有素的标注器,你可以先标注你的文本,
我用过这个代码: # Step 1 : TOKENIZE from nltk.tokenize import * words = word_tokenize(text) # Step 2 : POS
当我运行 nltk.gaac.demo() 时 如果我错过了什么,你能帮我吗?我收到以下错误。 我使用的是nltk 3.0.1 Python 3.4.1 (v3.4.1:c0e311e010fc, M
我刚刚读了一篇关于如何使用 MALLET 进行主题建模的精彩文章,但我在网上找不到任何将 MALLET 与 NLTK 进行比较的内容,而我已经有过一些经验。 它们之间的主要区别是什么? MALLET
我试过这个,但它不起作用 from nltk.corpus import stopwords stopwords_list = stopwords.words('arabic') print(stop
我正在构建一个同时使用 NLTK 和 Spacy 的应用程序,并通过 Poetry 管理依赖项。我可以通过将此行添加到我的 pyproject.toml 来下载 Spacy 数据。下 [tool.po
我正在尝试使用 RegexpTokenizer 对文本进行分词。 代码: from nltk.tokenize import RegexpTokenizer #from nltk.tokenize i
我很好奇是否有人熟悉使用 NLTK's BLEU score calculation 之间的区别和 SacreBLEU library . 特别是,我使用了两个库的句子 BLEU 分数,对整个数据集进
我正在使用 nltk.word_tokenize用于标记一些包含编程语言、框架等的句子,这些句子被错误标记。 例如: >>> tokenize.word_tokenize("I work with C
我无法理解两者之间的区别。不过,我开始知道 word_tokenize 使用 Penn-Treebank 进行标记化。但是 TweetTokenizer 上没有任何内容可用。对于哪种数据,我应该使用
我需要对多种语言的文本进行名称实体提取:西类牙语、葡萄牙语、希腊语、捷克语、中文。 是否有这两个功能的所有支持语言的列表?是否有使用其他语料库的方法,以便可以包含这些语言? 最佳答案 默认情况下,这两
我是 python 的新手并使用 nltk,所以实际上我有一个非常基本的问题,但在任何地方都找不到答案。 我想知道什么时候在 nltk 模块的函数之前使用 nltk.。我正在处理一些任务,在某些情况下
我是一名优秀的程序员,十分优秀!