allennlp 结构预测成分解析器添加额外的空格

5lwkijsr  于 5个月前  发布在  其他
关注(0)|答案(5)|浏览(110)

清单

  • 我已验证该问题存在于AllenNLP的main分支上。
  • 我已阅读了关于报告bug的相关贡献指南中的相关章节。
  • 我已在issues list中查找了类似或相同的错误报告。
  • 我已在pull requests list中查找了现有的修复建议。
  • 我已在CHANGELOGcommit log中查找,以确定该错误是否已在主分支中修复。
  • 我在下面的"Description"部分包含了与此错误相关的任何异常的回溯信息。
  • 我在下面的"Related issues or possible duplicates"部分列出了所有相关的问题和可能的重复问题(如果没有,请无论如何勾选此框)。
  • 我已在下面的"Environment"部分列出了我发现此错误时使用的操作系统和Python版本。
  • 我已在下面的"Environment"部分列出了pip freeze的输出。
  • 我已在下面的"Steps to reproduce"部分提供了一个最小可复现示例。

描述

一致性解析器在特殊字符(如“.?-,”等)前后添加空格。
例如,对于句子:“Hi there, I'm LawlAoux.”,根节点的输出为:“Hi there , I 'm LawlAoux .”(完整树的详细信息)。
{'word': "Hi there , I 'm LawlAoux .", 'nodeType': 'S', 'attributes': ['S'], 'link': 'S', 'children': [{'word': 'Hi there', 'nodeType': 'INTJ', 'attributes': ['INTJ'], 'link': 'INTJ', 'children': [{'word': 'Hi', 'nodeType': 'UH', 'attributes': ['UH'], 'link': 'UH'}, {'word': 'there', 'nodeType': 'ADVP', 'attributes': ['ADVP'], 'link': 'ADVP', 'children': [{'word': 'there', 'nodeType': 'RB', 'attributes': ['RB'], 'link': 'RB'}]}]}, {'word': ',', 'nodeType': ',', 'attributes': [','], 'link': ','}, {'word': 'I', 'nodeType': 'NP', 'attributes': ['NP'], 'link': 'NP', 'children': [{'word': 'I', 'nodeType': 'PRP', 'attributes': ['PRP'], 'link': 'PRP'}]}, {'word': "'m LawlAoux", 'nodeType': 'VP', 'attributes': ['VP'], 'link': 'VP', 'children': [{'word': "'m", 'nodeType': 'VBP', 'attributes': ['VBP'], 'link': 'VBP'}, {'word': 'LawlAoux', 'nodeType': 'NP', 'attributes': ['NP'], 'link': 'NP', 'children': [{'word': 'LawlAoux', 'nodeType': 'NNP', 'attributes': ['NNP'], 'link': 'NNP'}]}]}, {'word': '.', 'nodeType': '.', 'attributes': ['.'], 'link': '.'}]} 如您所见,它为整个句子的根节点添加了空格。

相关问题或可能的重复问题

环境

操作系统:OS X
Python版本:3.9.7

pip freeze的输出:

  1. absl-py==1.1.0
  2. agenda @ git+https://github.com/hyroai/agenda.git@1321e49ec433d62901e1e00dfd546c00d43db544
  3. aiohttp==3.8.1
  4. aioredis==2.0.1
  5. aiosignal==1.2.0
  6. allennlp==2.9.3
  7. allennlp-models==2.9.3
  8. analysis @ git+https://gitlab.com/airbud/analysis.git@d3829b9896c9a8af6a498a859695b3a00fa3556d
  9. anyio==3.6.1
  10. appdirs==1.4.4
  11. appnope==0.1.3
  12. argon2-cffi==21.3.0
  13. argon2-cffi-bindings==21.2.0
  14. arrow==1.2.2
  15. asgiref==3.5.2
  16. asttokens==2.0.5
  17. astunparse==1.6.3
  18. async-cache==1.1.1
  19. async-generator==1.10
  20. async-lru==1.0.3
  21. async-timeout==4.0.2
  22. asyncio==3.4.3
  23. attrs==21.4.0
  24. azure-common==1.1.28
  25. azure-storage-blob==2.1.0
  26. azure-storage-common==2.1.0
  27. Babel==2.10.2
  28. backcall==0.2.0
  29. base58==2.1.1
  30. beautifulsoup4==4.11.1
  31. bleach==5.0.0
  32. blis==0.7.7
  33. boto3==1.24.8
  34. botocore==1.27.8
  35. breadability==0.1.20
  36. cached-path==1.1.3
  37. cachetools==4.2.4
  38. catalogue==2.0.7
  39. certifi==2022.5.18.1
  40. cffi==1.15.0
  41. cfgv==3.3.1
  42. chardet==4.0.0
  43. charset-normalizer==2.0.12
  44. click==7.1.2
  45. -e git+https://github.com/hyroai/cloud-utils.git@df2c01628b807064cda2a408b897cc822fb8558c#egg=cloud_utils
  46. commonmark==0.9.1
  47. computation-graph==38
  48. conllu==4.4.1
  49. coverage==6.4.1
  50. cryptography==37.0.2
  51. cycler==0.11.0
  52. cymem==2.0.6
  53. dataclass-type-validator==0.1.2
  54. dataclasses==0.6
  55. dataclasses-json==0.5.5
  56. datasets==2.2.2
  57. dateparser==1.1.1
  58. ddsketch==2.0.3
  59. ddtrace==1.1.4
  60. debugpy==1.6.0
  61. decorator==5.1.1
  62. defusedxml==0.7.1
  63. Deprecated==1.2.13
  64. dill==0.3.4
  65. distlib==0.3.4
  66. dnspython==2.2.1
  67. docker-pycreds==0.4.0
  68. docopt==0.6.2
  69. docutils==0.18.1
  70. ecdsa==0.17.0
  71. emoji==1.7.0
  72. en-core-web-lg @ https://github.com/explosion/spacy-models/releases/download/en_core_web_lg-3.2.0/en_core_web_lg-3.2.0-py3-none-any.whl
  73. en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.2.0/en_core_web_sm-3.2.0-py3-none-any.whl
  74. entrypoints==0.4
  75. et-xmlfile==1.1.0
  76. execnet==1.9.0
  77. executing==0.8.3
  78. fairscale==0.4.6
  79. falcon==3.1.0
  80. fastapi==0.78.0
  81. fastjsonschema==2.15.3
  82. filelock==3.6.0
  83. findimports==2.2.0
  84. flaky==3.7.0
  85. flatbuffers==1.12
  86. fonttools==4.33.3
  87. frozenlist==1.3.0
  88. fsspec==2022.5.0
  89. ftfy==6.1.1
  90. fuzzyset2==0.1.1
  91. gamla==132
  92. gast==0.4.0
  93. Geohash @ https://github.com/uriva/geohash/tarball/master
  94. geotext==0.4.0
  95. gitdb==4.0.9
  96. GitPython==3.1.27
  97. google-api-core==1.31.6
  98. google-api-python-client==2.50.0
  99. google-auth==1.35.0
  100. google-auth-httplib2==0.1.0
  101. google-auth-oauthlib==0.4.6
  102. google-cloud-core==2.3.1
  103. google-cloud-dlp==1.0.0
  104. google-cloud-kms==1.4.0
  105. google-cloud-storage==2.4.0
  106. google-crc32c==1.3.0
  107. google-pasta==0.2.0
  108. google-resumable-media==2.3.3
  109. googleapis-common-protos==1.56.2
  110. grpc-google-iam-v1==0.12.4
  111. grpcio==1.46.3
  112. gspread==5.4.0
  113. gunicorn==20.1.0
  114. h11==0.13.0
  115. h5py==3.7.0
  116. heapq-max==0.21
  117. html2text==2020.1.16
  118. httpcore==0.13.2
  119. httplib2==0.20.4
  120. httptools==0.2.0
  121. httpx==0.18.1
  122. httpx-auth==0.10.0
  123. huggingface-hub==0.7.0
  124. humanize==4.1.0
  125. identify==2.5.1
  126. idna==3.3
  127. immutables==0.18
  128. importlib-metadata==4.11.4
  129. inflect==5.6.0
  130. iniconfig==1.1.1
  131. ipykernel==6.14.0
  132. ipython==8.4.0
  133. ipython-genutils==0.2.0
  134. ipywidgets==7.7.0
  135. iso4217parse==0.5.1
  136. jedi==0.18.1
  137. Jinja2==3.1.2
  138. jmespath==1.0.0
  139. joblib==1.1.0
  140. json5==0.9.8
  141. jsonnet==0.18.0
  142. jsonschema==4.6.0
  143. jupyter-client==7.3.4
  144. jupyter-core==4.10.0
  145. jupyter-server==1.17.1
  146. jupyterlab==3.4.3
  147. jupyterlab-pygments==0.2.2
  148. jupyterlab-server==2.14.0
  149. jupyterlab-widgets==1.1.0
  150. keras==2.9.0
  151. Keras-Preprocessing==1.1.2
  152. kiwisolver==1.4.3
  153. -e git+https://github.com/hyroai/knowledge-graph.git@a3030683577ed4a3828ea72ff71842dab50c1b1c#egg=knowledge_graph
  154. kubernetes==23.6.0
  155. langcodes==3.3.0
  156. libclang==14.0.1
  157. lmdb==1.3.0
  158. lxml==4.9.0
  159. marisa-trie==0.7.7
  160. Markdown==3.3.7
  161. markdownify==0.11.2
  162. MarkupSafe==2.1.1
  163. marshmallow==3.16.0
  164. marshmallow-enum==1.5.1
  165. matplotlib==3.5.2
  166. matplotlib-inline==0.1.3
  167. mistune==0.8.4
  168. mona-sdk==0.0.24
  169. more-itertools==8.13.0
  170. motor==2.5.1
  171. mpu==0.23.1
  172. multidict==6.0.2
  173. multiprocess==0.70.12.2
  174. murmurhash==1.0.7
  175. mypy-extensions==0.4.3
  176. names-dataset==3.1.0
  177. nbclassic==0.3.7
  178. nbclient==0.6.4
  179. nbconvert==6.5.0
  180. nbformat==5.4.0
  181. nest-asyncio==1.5.5
  182. nltk==3.7
  183. -e git+ssh://git@gitlab.com/airbud/nlu-lib.git@e9c3577d3761cc645706d670c85c6727abc4f3cf#egg=nlu
  184. nodeenv==1.6.0
  185. nostril @ https://github.com/casics/nostril/tarball/master
  186. notebook==6.4.12
  187. notebook-shim==0.1.0
  188. number-parser==0.2.1
  189. numpy==1.22.4
  190. oauth2client==4.1.3
  191. oauthlib==3.2.0
  192. openpyxl==3.0.10
  193. opt-einsum==3.3.0
  194. outcome==1.1.0
  195. overrides==6.1.0
  196. packaging==21.3
  197. pandas==1.4.2
  198. pandocfilters==1.5.0
  199. parsec==3.13
  200. parso==0.8.3
  201. pathtools==0.1.2
  202. pathy==0.6.1
  203. pexpect==4.8.0
  204. phonenumbers==8.12.24
  205. pickleshare==0.7.5
  206. Pillow==9.1.1
  207. plac==1.3.5
  208. platformdirs==2.5.2
  209. plotly==5.8.2
  210. pluggy==1.0.0
  211. pre-commit==2.19.0
  212. preshed==3.0.6
  213. presidio-analyzer==2.2.28
  214. prometheus-async==22.2.0
  215. prometheus-client==0.14.1
  216. promise==2.3
  217. prompt-toolkit==3.0.29
  218. protobuf==3.19.4
  219. psutil==5.9.1
  220. ptyprocess==0.7.0
  221. pure-eval==0.2.2
  222. py==1.11.0
  223. py-rouge==1.1
  224. pyap==0.3.1
  225. pyarrow==8.0.0
  226. pyasn1==0.4.8
  227. pyasn1-modules==0.2.8
  228. pycld2==0.41
  229. pycountry==22.3.5
  230. pycparser==2.21
  231. pydantic==1.7.4
  232. pyee==8.2.2
  233. Pygments==2.12.0
  234. pyhumps==3.7.1
  235. PyJWT==1.7.1
  236. pymongo==3.12.3
  237. pyOpenSSL==22.0.0
  238. pyparsing==3.0.9
  239. pyppeteer==1.0.2
  240. pyrsistent==0.18.1
  241. PySocks==1.7.1
  242. pytest==7.1.2
  243. pytest-asyncio==0.18.3
  244. pytest-forked==1.4.0
  245. pytest-instafail==0.4.2
  246. pytest-mock==3.7.0
  247. pytest-repeat==0.9.1
  248. pytest-sugar==0.9.4
  249. pytest-test-groups==1.0.3
  250. pytest-timeout==2.1.0
  251. pytest-tmnet @ https://testmon.org/static/c28870f08/pytest-tmnet-1.3.2.tar.gz
  252. pytest-xdist==2.5.0
  253. python-dateutil==2.8.2
  254. python-dotenv==0.20.0
  255. python-jose==3.3.0
  256. python-Levenshtein==0.12.2
  257. python-stdnum==1.17
  258. pytimeparse==1.1.8
  259. pytz==2022.1
  260. pytz-deprecation-shim==0.1.0.post0
  261. PyYAML==5.4.1
  262. pyzmq==23.1.0
  263. redis==4.3.3
  264. regex==2022.6.2
  265. requests==2.28.0
  266. requests-file==1.5.1
  267. requests-mock==1.9.3
  268. requests-oauthlib==1.3.1
  269. responses==0.18.0
  270. retrying==1.3.3
  271. rfc3986==1.5.0
  272. rich==12.4.4
  273. rsa==4.8
  274. s3transfer==0.6.0
  275. sacremoses==0.0.53
  276. scikit-learn==1.1.1
  277. scipy==1.8.1
  278. selenium==4.2.0
  279. Send2Trash==1.8.0
  280. sentencepiece==0.1.96
  281. sentry-sdk==1.5.12
  282. setproctitle==1.2.3
  283. shortuuid==1.0.9
  284. six==1.16.0
  285. sklearn==0.0
  286. smart-open==5.2.1
  287. smmap==5.0.0
  288. sniffio==1.2.0
  289. sortedcontainers==2.4.0
  290. soupsieve==2.3.2.post1
  291. spacy==3.2.4
  292. spacy-legacy==3.0.9
  293. spacy-loggers==1.0.2
  294. srsly==2.4.3
  295. stack-data==0.2.0
  296. starlette==0.19.1
  297. stringcase==1.2.0
  298. sumy==0.10.0
  299. tabulate==0.8.9
  300. tenacity==8.0.1
  301. tensorboard==2.9.1
  302. tensorboard-data-server==0.6.1
  303. tensorboard-plugin-wit==1.8.1
  304. tensorboardX==2.5.1
  305. tensorflow==2.9.1
  306. tensorflow-estimator==2.9.0
  307. tensorflow-hub==0.12.0
  308. tensorflow-io-gcs-filesystem==0.26.0
  309. termcolor==1.1.0
  310. terminado==0.15.0
  311. thinc==8.0.17
  312. threadpoolctl==3.1.0
  313. tinycss2==1.1.1
  314. tldextract==3.1.0
  315. tokenizers==0.12.1
  316. toml==0.10.2
  317. tomli==2.0.1
  318. toolz==0.11.2
  319. toposort==1.7
  320. torch==1.11.0
  321. torchvision==0.12.0
  322. tornado==6.1
  323. tqdm==4.64.0
  324. traitlets==5.2.2.post1
  325. transformers==4.18.0
  326. trio==0.21.0
  327. trio-websocket==0.9.2
  328. typeguard==2.13.3
  329. typer==0.4.1
  330. typing-inspect==0.7.1
  331. typing-utils==0.1.0
  332. typing_extensions==4.2.0
  333. tzdata==2022.1
  334. tzlocal==4.2
  335. undetected-chromedriver==3.1.5.post4
  336. Unidecode==1.3.4
  337. uritemplate==4.1.1
  338. urllib3==1.26.9
  339. uvicorn==0.15.0
  340. uvloop==0.16.0
  341. virtualenv==20.14.1
  342. wandb==0.12.18
  343. wasabi==0.9.1
  344. watchgod==0.8.2
  345. wcwidth==0.2.5
  346. webdriver-manager==3.7.0
  347. webencodings==0.5.1
  348. websocket-client==1.3.2
  349. websockets==10.3
  350. Werkzeug==2.1.2
  351. widgetsnbextension==3.6.0
  352. word2number==1.1
  353. wptools @ https://github.com/hyroai/wptools/tarball/master
  354. wrapt==1.14.1
  355. wsproto==1.1.0
  356. xmltodict==0.13.0
  357. xxhash==3.0.0
  358. yappi==1.3.5
  359. yarl==1.7.2
  360. yattag==1.14.0
  361. zipp==3.8.0
flmtquvp

flmtquvp1#

感谢@LawlAoux提供的bug报告!我必须承认,在这里我没有很多上下文,而且这个模型是在我之前实现的。这个bug是否破坏了你自己代码中的某些功能?我只是想了解一下这个问题有多大。

lp0sw83n

lp0sw83n2#

感谢您的回复!这确实破坏了我们代码中的某些部分,因为例如当您有像ob-gyn这样的常见专业时,您会得到ob-gyn,解析器树就是错误的。此外,在我在bug报告中提供的示例中,您可以看到它在遇到特殊字符时添加额外的空格,这对于聊天机器人等事物来说并不是期望的行为。(您可以认为我们可以删除这些空格,但有时我们希望保留原始空格,如果我们这样做,它们将被剥离,就像在tts示例中一样)

xpszyzbs

xpszyzbs3#

嗯,我明白了,谢谢。我刚才仔细研究了一下这个问题。以下是我发现的:
问题的根源在于预测器使用了Spacy分词器,它会丢弃空格,而不像更"现代"的分词器,如GPT2的BPE分词器。因此,这一行简单地用空格将所有的标记连接起来来重建每个跨度。
现在,Spacy Token示例本身就包含了足够的信息来重建确切的输入跨度,因为它们包含了原始字符串中标记的起始和结束索引,但问题是我们实际上并没有通过模型传递Token对象 - 我们只传递了标记的字符串形式 - 所以我们只能得到字符串。如果我们能够得到Token示例(在Tree对象中)而不是字符串,那么我们就能正确地在这一行上重建每个跨度。
我认为这个改变是可以实现的。我们需要修改几个地方的代码:

  • 宾州树库数据集阅读器需要在text_to_instance()方法中接受Union[List[str], List[Token]]而不是仅仅接受List[str]
  • 同样,模型上的construct_trees()方法需要接受List[List[Token]]而不是List[List[str]],并返回一个包含Token示例而不是字符串的Tree对象。
  • 在预测器中,我们需要传递Token对象本身,而不是在这一行上提取字符串。
  • 最后,在预测器的_build_heirplane_tree方法中,我们需要使用每个标记中的附加信息来正确地重建每个跨度。

我可能遗漏了一些细节,但我认为这就是整个情况。我把"欢迎贡献"标签贴在这里,因为我可能很快就没有时间解决这个问题了,但我很乐意审查PR并提供帮助。

mctunoxg

mctunoxg4#

你好,如果你还需要有人来完成这个任务,我很愿意帮忙。

bnl4lu3b

bnl4lu3b5#

你好,borosilicate。当你有机会时,请继续进行PR。

相关问题