【问题标题】:find words in a text [closed]在文本中查找单词[关闭]
【发布时间】:2021-10-09 17:39:45
【问题描述】:

我有一个关于为文本搜索单词的问题。

在我的代码中,我在意大利语文本中查找单词(根据段落分为字符串)但是当我有像 "e", "in", "ad" 这样的单词时,它告诉我它找到了很多次,但实际上,这些是诸如“begin”、“adduce”之类的词以及任何包含 e 的词。有没有一种有效的方法来避免这种“错误”?我到处搜索,但找不到任何东西,我认为这是一个简单的问题,但我根本不是专家,感谢那些会帮助我的人。我想在不导入任何库的情况下这样做

示例文本: ['sostanza di cieli ed astri cercai per oceani。 di donarmi il diluvio ti dissi io, o musa, scorgendo il destino.', "o zeus che infiniti addurre volle, principiando constormi arditi fulmini di ira molto funesta laddove si alzasse eccessivamente il volare negato all'uomo.", 'imperterrita unfrenabile poiché poiché memore di ciò, da qualunque principio, memore di di di di ciò di ciò, da qualunque principio, ad ogni costo, dea figlia di zeus, narrane cagione e spirito。 ']

我必须找到这些词(有可能并非所有这些词都在文本中,例如缺少“e”): 莫莫, 迪西奥, 哦穆萨, 莫尔托, 例行公事, e, 在, 迪西奥

预期输出:uomo、dissi io、o musa、molto、eccessivamente、di ciò

【问题讨论】:

  • 你能提供一些你的文本样本和预期的输出吗?
  • 搜索" e "" in "" ad "(带空格),这样只会显示单个单词
  • @IoaTzimas 我刚刚编辑过 :)
  • @Einliterflasche 是的,这是个好主意,但我该怎么做呢?
  • @orsettomorbido 您可以编写一个函数来返回输入的字符串但带有空格("ad" => " ad "),但这不如 H. Rittich 的正则表达式解决方案那么优雅跨度>

标签: python string text


【解决方案1】:

您可能想要更高级的东西,它可以理解您尝试解析的语言的语法,但这可能对您有用

也许

import difflib

def iter_test_words(source_paragraph, words_to_check):
    for word_test in source_paragraph.split():  # split by whitespace:
        yield difflib.get_close_matches(word_test, words_to_check, n=1, cutoff=0.9)

一些进一步的帮助

  • 您可以try/except 并在返回列表[0] 中找到第一个索引来查找异常词(IndexError
  • 您可能需要根据需要(甚至动态地调整截止值;即针对异常情况重试)以获得良好的结果

再次,根据您的需要使用和配置库可能会产生更好的结果.. 理想情况下

  • 懂语法
  • 理解微妙的(对于计算机)单词变化(即,对于您的情况,“to go”andandoandato 的意大利语时态是否相同?但是 ondato“wave”是另一个概念,尽管它是更好的文本匹配)
    >>> import difflib
    >>> difflib.get_close_matches("andato", ["andando", "ondato"])
    ['ondato', 'andando']
    >>> difflib.SequenceMatcher(None, "andato", "andando").ratio()
    0.7692307692307693
    >>> difflib.SequenceMatcher(None, "andato", "ondato").ratio()
    0.8333333333333334
    

【讨论】:

    【解决方案2】:

    您可以为此目的使用正则表达式。特殊序列\b 匹配单词边界。例如,搜索\bin\b 模式将搜索单词的开头,然后是“in”,然后是单词的结尾。

    代码如下:

    >>> import re
    >>> len(re.findall(r'\bin\b', 'begin in begin end'))
    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 2014-11-05
      相关资源
      最近更新 更多