我有一个文本文件,其中包含35k字的段落。下面的示例
This sentence does repeat? This sentence does not repeat! This sentence does not repeat. This sentence does repeat.
This sentence does repeat. This sentence does not repeat! This sentence does not repeat. This sentence does repeat!
我想识别匹配的句子。我设法找到的一种方法是使用.
,!
,?
等将段落拆分为单独的行作为分隔符并查找匹配的行。
代码
import collections as col
with open('txt.txt', 'r') as f:
l = f.read().replace('. ','.\n').replace('? ','?\n').replace('! ','!\n').splitlines()
print([i for i, n in col.Counter(l).items() if n > 1])
请提出一些更好的方法。
答案 0 :(得分:3)
您可以使用import re
...
l = re.split(r'[?!.]*',f.read())
:
public static List<T> GetAllRecursive<T, TU>(this IList<T> list, Func<T, TU> func) where TU : IEnumerable<T> {
var allList = new List<T>();
var toAdd = list.ToList();
while(true) {
allList.AddRange(toAdd);
var childs = toAdd.SelectMany(x => func(x)).ToList();
if(childs.Count == 0) {
return allList;
}
toAdd = childs;
}
}
答案 1 :(得分:0)
我无法保证它会是最快的,但我会尝试利用sort
的速度。首先,我将通过标点分割文本以给出一个发送列表,然后在列表上运行排序以订购所有的发送,然后最终遍历列表并计算相同的连续发送数量并存储发送和计数在一个字典中。
答案 2 :(得分:0)
你可以做到与众不同。正则表达式模块非常强大:
import re
from collections import Counter
pat = r'(\?)|(\.)|(!)'
c = Counter()
with open('filename') as f:
for line in f:
c[re.sub(pat, '\n', line)] += 1
这会创建一个匹配?, . or !
的正则表达式模式,并将其替换为\n
。
使用for循环,这可以在一个基础上发生。