从字符串列表中查找最常用的单词

艾米丽.mi

我们有一个给定的列表:

list_of_versions = ['apple II' ,'apple', 'apple 1' , 'HD APPLE','apple 3.5', 'adventures of apple'  , 'apple III','orange 2' ,'300mhz apple', '300-orange II' , 'orange II HD' , 'orange II tvx', 'orange 2' , 'HD berry-vol 2', 'berry II', 'berry 2', 'berry VI', 'berry 1', 'berry II' ,'berry' ,'II Berry']

如何找到每个字符串的主要单词?例如:

word            | main
--------------------------
apple II        |apple
val/apple       |apple
apple 1         |apple
HD APPLE        |apple
apple 3.5       |apple
adventures of apple |apple
apple III       |apple
300mhz apple    |apple
orange 2        |orange
300-orange II   |orange
orange II HD    |orange
/orange/II-tvx  |orange
orange 2        |orange
HD berry-vol 2  |berry
berry-II        |berry
-berry-2        |berry
(berry) VI      |berry
berry 1         |berry
berry II        |berry
berry 2022 B8   |berry
II Berry-hd     |berry
22 Berry II     |berry
Berry 6.8.9     |berry

要点:

  1. 我无法创建包含三个主要单词(apple、orange、berry)的主要单词列表。因为列表将使用新的主要单词进行更新。所以我们永远不会知道什么是新词。

  2. 版本没有限制。在某些时候,我们可以看到像“apple XII”或“GB-HD berry 2.4”这样的东西,所以版本价值可以决定一切。(如果你想创建一个停用词列表)

很高兴(但不是强制性的)--> 添加另一个显示版本的列。IE:

word            | main   | version
-----------------------------------
apple II        |apple   | II 
val/apple       |apple   | NULL
apple 1         |apple   | 1
HD APPLE        |apple   | HD
apple 3.5       |apple   | 3.5
apple III       |apple   | III
300mhz apple II |apple   | II
orange 2        |orange  | 2
300-orange II   |orange  | II
orange II HD    |orange  | II HD
/orange/II-tvx  |orange  | II tvx
orange 2        |orange  | 2
HD berry-vol 2  |berry   | 2 HD
berry-II        |berry   | II
-berry-2        |berry   | 2
(berry) VI      |berry   | VI
berry 1         |berry   | 1
berry II        |berry   | II  
berry 2022      |berry   | NULL
II Berry-hd     |berry   | II HD
22 Berry        |berry   | 22
Berry 6.8.9     |berry   | 6.8.9
疯狂的物理学家

所有其他答案都省略了包含“冒险”一词的条目,因为它会引发搜索。您需要一个可以将“最长”与“最频繁”结合起来的启发式方法。

有帮助的一件事是,在每一行中找到最长的单词会大大提高 SNR。换句话说,它很好地过滤掉了不必要的单词,只需要一点帮助。如果您知道要查找多少个单词(在本例中为三个),则一切就绪:

from collections import Counter

common_long_words = [word.casefold() for word in (max(re.findall('\\w+', version), key=len) for version in list_of_versions)]
words = Counter(common_long_words).most_common(3)

拆分版本并找到感兴趣的单词并不是特别困难。关于版本的构成,您有几个选择,尤其是当主词嵌入短语中间时。这是一个简单的函数,它取整个余数:

def split_main(version, words):
    for word in words:
        i = version.find(word)
        if i > 0:
            return word, f'{version[:i]} {version[i + len(word)]}'
    else:
        raise ValueError(f'Version "{version}" does not contain any of the main words {{{", ".join(words)}}}')

result = {version: split_main(version, words) for version in list_of_versions}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章