标签: text-processing

基于关键词组对文本进行分类?

我有一个软件项目的要求列表,由其前身的遗体组装而成.每个要求应映射到一个或多个类别.每个类别都包含一组关键字.我想要做的是找到一个算法,它会给我一个分数排名,每个要求可能属于哪个类别.结果将用作进一步分类要求的起点.

举个例子,假设我有这个要求:

系统应将存款应用于客户的指定帐户.

和类别/关键字:

  1. 客户交易:存款,存款,客户,账户,账户
  2. 余额账户:账户,账户,借方,贷方
  3. 其他类别:foo,bar

我希望算法在类别1中得分最高,在类别2中得分较低,而在类别3中得不到.评分机制与我无关,但需要表达的类别1比第2类更有可能.

我是NLP的新手,所以我有点不知所措.我一直在阅读Python中的自然语言处理,并希望应用一些概念,但没有看到任何非常适合的东西.我认为简单的频率分布不会起作用,因为我正在处理的文本很小(一个句子).

algorithm text-processing nlp

6
推荐指数
1
解决办法
3257
查看次数

用于查找未终止字符串的正则表达式

我需要在CSV文件中搜索以未终止的双引号字符串结尾的行.

例如:

1,2,a,b,"dog","rabbit
Run Code Online (Sandbox Code Playgroud)

会匹配而

1,2,a,b,"dog","rabbit","cat bird"
1,2,a,b,"dog",rabbit
Run Code Online (Sandbox Code Playgroud)

不会.

我对正则表达式的经验非常有限,我唯一能想到的就是这样

"[^"]*$
Run Code Online (Sandbox Code Playgroud)

但是,这会将最后一个引号与行尾相匹配.

怎么做?

regex text-processing

6
推荐指数
1
解决办法
1645
查看次数

快速文本预处理

在我的项目中,我一般都使用文本.我发现预处理可能非常慢.所以我想问你是否知道如何优化我的代码.流程是这样的:

获取HTML页面 - >(以纯文本 - >词干 - >删除停用词) - >进一步文本处理

括号中有预处理步骤.该应用程序运行在大约10.265秒,但预处理需要9.18秒!这是预处理50个HTML页面的时间(不包括下载).

我使用HtmlAgilityPack库将HTML转换为纯文本.这很快.转换1个文档需要2.5ms,所以它相对比较好.

问题出现了.阻止一个文档需要120毫秒.不幸的是,那些HTML页面是波兰语.用C#编写的波兰语不存在词干.我知道只有2个免费使用Java编写:stempel和morfologic.我借助IKVM软件将stempel.jar预编译为stempel.dll.所以没有更多的事要做.

消除停用词也需要很多时间(1个文档约70毫秒).它是这样完成的:


result = Regex.Replace(text.ToLower(), @"(([-]|[.]|[-.]|[0-9])?[0-9]*([.]|[,])*[0-9]+)|(\b\w{1,2}\b)|([^\w])", " ");
while (stopwords.MoveNext())
{
   string stopword = stopwords.Current.ToString();                
   result = Regex.Replace(result, "(\\b"+stopword+"\\b)", " ");                               
}
return result;
Run Code Online (Sandbox Code Playgroud)

首先,我删除所有数字,特殊字符,单词和双字母单词.然后在循环中删除停用词.大概有270个停用词.

有可能让它更快吗?

编辑:

我想要做的是删除所有不超过2个字母的单词.所以我想把所有特殊的字符(包括'.',',','?','!'等)数字,停止字样.我只需要用于数据挖掘的纯语言.

c# regex text-processing

6
推荐指数
2
解决办法
3560
查看次数

Python:如何遍历行块

如何通过空行分隔的行块?该文件如下所示:

ID: 1
Name: X
FamilyN: Y
Age: 20

ID: 2
Name: H
FamilyN: F
Age: 23

ID: 3
Name: S
FamilyN: Y
Age: 13

ID: 4
Name: M
FamilyN: Z
Age: 25
Run Code Online (Sandbox Code Playgroud)

我想循环遍历块并在3列的列表中获取名称,姓氏和年龄字段:

Y X 20
F H 23
Y S 13
Z M 25
Run Code Online (Sandbox Code Playgroud)

python text-processing

6
推荐指数
3
解决办法
1万
查看次数

大文本文件处理

我需要在Mathematica中实现延迟加载.我有一个600 MB的CSV文本文件,我需要处理.该文件包含大量重复记录:

1;0;0;13;6
1;0;0;13;6
..........
2;0;0;13;6
2;0;0;13;6
..........
etc.
Run Code Online (Sandbox Code Playgroud)

因此,我不想将它们全部加载到内存中,而是创建一个包含记录的列表以及在文件中遇到此记录的次数:

{{10000,{1,0,0,13,6}}, {20000,{2,0,0,13,6}}, ...}
Run Code Online (Sandbox Code Playgroud)

我找不到使用导入功能的方法.我正在寻找类似的东西

Import["my_file.csv", "CSV", myProcessingFunction]
Run Code Online (Sandbox Code Playgroud)

其中myProcessingFunction将一次获取一条记录并创建数据集.是否可以使用Import或任何其他Mathematica功能执行此操作?

import text-processing wolfram-mathematica

6
推荐指数
1
解决办法
386
查看次数

如何在Ruby中有效地解析大型文本文件

我正在编写一个导入脚本来处理可能有数十万行(日志文件)的文件.使用一种非常简单的方法(下面)花了足够的时间和记忆,我觉得它会在任何时候取出我的MBP,所以我杀了这个过程.

#...
File.open(file, 'r') do |f|
  f.each_line do |line|
    # do stuff here to line
  end
end
Run Code Online (Sandbox Code Playgroud)

这个文件特别有642,868行:

$ wc -l nginx.log                                                                                                                                        /code/src/myimport
  642868 ../nginx.log
Run Code Online (Sandbox Code Playgroud)

有没有人知道处理这个文件中每一行的更有效(内存/ CPU)方式?

UPDATE

上面的代码f.each_line简单地将正则表达式与行匹配.如果匹配失败,我将该行添加到@skipped数组中.如果它通过,我将匹配格式化为哈希(由匹配的"字段"键入)并将其附加到@results数组.

# regex built in `def initialize` (not on each line iteration)
@regex = /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) - (.{0})- \[([^\]]+?)\] "(GET|POST|PUT|DELETE) ([^\s]+?) (HTTP\/1\.1)" (\d+) (\d+) "-" "(.*)"/

#... loop lines
match = line.match(@regex)
if match.nil?
  @skipped << line
else
  @results << convert_to_hash(match)
end
Run Code Online (Sandbox Code Playgroud)

我对这是一个效率低下的过程完全开放.我可以convert_to_hash使用预先计算的lambda 代码,而不是每次都计算出计算结果.我想我只是假设行迭代本身就是问题,而不是每行代码.

ruby text-processing

6
推荐指数
1
解决办法
1万
查看次数

在vim中使用:g命令,可以执行多个操作

我怎么能用这样的东西?

:g/^$/kJ
Run Code Online (Sandbox Code Playgroud)

这里kJ是两个命令,而不是只有一个(如'd')

我的具体例子:我有多条线看起来像这样

queryBuilder
    .append("xyz");
Run Code Online (Sandbox Code Playgroud)

我想让它们看起来像这样:

queryBuilder.append("xyz");
Run Code Online (Sandbox Code Playgroud)

所以我想为每一行做的是

:g/^[\t]*\..*$/kJx
Run Code Online (Sandbox Code Playgroud)

它匹配正确的模式,但似乎只执行k.

其他vim命令在这里适用吗?你将如何执行这项任务?

regex vim text-processing command macvim

6
推荐指数
1
解决办法
806
查看次数

在段落分隔符不标准的段落上拆分文本

如果我的文本具有标准段落格式(空行后跟缩进),例如文本1,则很容易使用text.split("\n \n")提取段落.

文字1:

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sit amet sapien velit, ac sodales   
 ante. Integer mattis eros non turpis interdum et auctor enim consectetur, etc.

      Praesent molestie suscipit bibendum. Donec justo purus, venenatis eget convallis sed, feugiat    
 vitae velit,etc.
Run Code Online (Sandbox Code Playgroud)

但是如果我有非标准段落格式的文本如文本2怎么办?没有空行和变量前导空格.

文字2:

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sit amet sapien velit, ac sodales   
 ante. Integer mattis eros non turpis interdum et auctor enim consectetur, etc.
    Praesent molestie suscipit bibendum. Donec justo purus, …
Run Code Online (Sandbox Code Playgroud)

python text-processing

6
推荐指数
1
解决办法
9344
查看次数

Linux join实用程序抱怨输入文件未被排序

我有两个文件:

file1的格式为:

field1;field2;field3;field4
Run Code Online (Sandbox Code Playgroud)

(file1最初未排序)

file2的格式为:

field1
Run Code Online (Sandbox Code Playgroud)

(file2已排序)

我运行以下两个命令:

sort -t\; -k1 file1 -o file1 # to sort file 1
join -t\; -1 1 -2 1 -o 1.1 1.2 1.3 1.4 file1 file2
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:

join: file1:27497: is not sorted: line_which_was_identified_as_out_of_order
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

(我也尝试对file1进行排序,考虑到整条生产线不仅是该生产线的第一批,而且没有成功)

sort -t\; -c file1不输出任何东西.在第27497行附近,情况确实很奇怪,这意味着排序无法正常工作:

              XYZ113017;...
line 27497--> XYZ11301;...
              XYZ11301;...
Run Code Online (Sandbox Code Playgroud)

linux sorting bash text-processing join

6
推荐指数
2
解决办法
5509
查看次数

可以"perl -a"以某种方式使用原始空白重新加入@F吗?

我的输入有多个标签和空格,以便于阅读.我想使用修改字段perl -a,然后以原始形式打印出该行.(数据来自findup,显示重复文件的数量和他们浪费的空间.)输入是:

2 * 4096    backup/photos/photo.jpg photos/photo.jpg
2 * 111276032   backup/books/book.pdf book.pdf
Run Code Online (Sandbox Code Playgroud)

输出会将字段3转换为千字节,如下所示:

2 * 4 KB    backup/photos/photo.jpg photos/photo.jpg
2 * 108668 KB   backup/books/book.pdf book.pdf
Run Code Online (Sandbox Code Playgroud)

在我的梦想世界中,这将是我的代码,因为我可以将perl自动重新组合@F并保留原始空白:

perl -lanE '$F[2]=int($F[2]/1024)." KB"; print;'
Run Code Online (Sandbox Code Playgroud)

在现实生活中,加入单个空间似乎是我唯一的选择:

perl -lanE '$F[2]=int($F[2]/1024)." KB"; print join(" ", @F);'
Run Code Online (Sandbox Code Playgroud)

是否有任何自动变量可以记住分隔符?如果我有这样的魔术数组,代码将是:

perl -lanE 'BEGIN{use List::Util "reduce";} $F[2]=int($F[2]/1024)." KB"; print reduce { $a . shift(@magic) . $b } @F;'
Run Code Online (Sandbox Code Playgroud)

perl text-processing

6
推荐指数
1
解决办法
130
查看次数

标签 统计

text-processing ×10

regex ×3

python ×2

algorithm ×1

bash ×1

c# ×1

command ×1

import ×1

join ×1

linux ×1

macvim ×1

nlp ×1

perl ×1

ruby ×1

sorting ×1

vim ×1

wolfram-mathematica ×1