Python:从文本文件中提取主题标签

Python: Extract hashtags out of a text file

所以,我编写了下面的代码来提取主题标签以及带有“@”的标签,然后将它们附加到列表中并按降序对它们进行排序。问题是文本的格式可能不完美并且每个单独的主题标签之间没有空格,并且可能会出现以下问题 - 因为它可能会在 for 循环内使用 #print 语句进行检查: #socality#thisismycommunity#themoderndayexplorer#modernoutdoors#mountaincultureelevated

因此,.split() 方法不处理这些问题。这个问题的最佳做法是什么?

Here is the .txt file

感谢您的宝贵时间。

name = input("Enter file:")
if len(name) < 1 : name = "tags.txt"
handle = open(name)
tags = dict()
lst = list()

for line in handle :
    hline = line.split()
    for word in hline:
        if word.startswith('@') : tags[word] = tags.get(word,0) + 1
        else :
            tags[word] = tags.get(word,0) + 1
        #print(word)

for k,v in tags.items() :
    tags_order = (v,k)
    lst.append(tags_order)

lst = sorted(lst, reverse=True)[:34]
print('Final Dictionary: ' , '\n')
for v,k in lst :
    print(k , v, '')

使用正则表达式。只有几个限制;标签必须以 #@ 开头,并且不能包含任何 space 或其他白色 space 字符。

这个代码

import re
tags = []
with open('../Downloads/tags.txt','Ur') as file:
    for line in f.readline():
        tags += re.findall(r'[#@][^\s#@]+', line)

创建文件中所有标签的列表。您可以轻松调整它以将找到的标签存储在您的字典中;不要直接将结果存储在 tags 中,而是循环它并根据需要处理每个项目。

正则表达式由这两个自定义字符组成 类:

  • [#@] - 开头的单个字符 #@
  • [^\s#@]+ - 不是任何单个白色space字符的序列(\s匹配所有白色space,例如space、制表符和 returns)、#@;至少一个,尽可能多。

因此 findall 从任何标签的开头开始匹配,然后尽可能多地抓取,仅在遇到任何 "not" 字符时停止。

findall returns 匹配项目的列表,您可以立即将其添加到现有列表,或依次循环找到的项目:

for tag in re.findall(r'[#@][^\s#@]+', line):
    # process "tag" any way you want here

源文本文件包含 Windows 风格的 \r\n 行结尾,所以我最初在 Mac 上得到了很多空的 "lines"。在 Universal newline mode 中打开文本文件确保由 Python.

的行读取部分透明处理