Python - 匹配长文本中单词列表的最佳方法

时间:2017-06-08 02:23:25

标签: performance python-2.7 pandas text-mining

问题: 我有一个单词列表(在.txt文件中),其中包含编程语言和相关技术的名称(每行一个技术),例如:

AngularJS
Grunt
T-SQL
MySQL
SQL Server
SQL
Bash
Git
Android
Android Studio
Ajax
Design patterns
Frontend developer

等等(该列表包含大约250个术语,但它肯定会变大)。

我还有一个pandas数据框,其中一列包含与IT相关的职位的全文(每行一个)。

我想要做的是在现有数据框中添加另一列,在该列中保留在作业说明中找到的所有关键字(来自.txt文件)的列表。

示例:职位描述说“我们正在寻找前端开发人员,使用 Angular-JS 拥有+ 3年的经验。 Grunt < / em>, git 设计模式是必须的.​​.....“然后列表将是['Frontend developer', 'AngularJS', 'Grunt', 'Git', 'Design patterns']

我目前的(工作方式)方法:

# set_keywords contains a Python set with all keywords in the .txt file
lmb_extract_keywords = (lambda post: filter(None, set(w if w.lower() in post.lower() else None for w in set_keywords)))

# df_posts is a pandas dataframe with only one column containing one full post per row
df_posts['keywords'] = df_posts.apply(lmb_extract_keywords)

问题

1)有没有办法提高效率? (熊猫数据框有近10000行)。我愿意接受各种建议(正则表达式,文本挖掘框架等)。

2)在某些情况下,我会在输出列表中找到重复的一般术语。想象一下,如果工作描述说'Android Studio',那么输出列表将是['Android', 'Android Studio'],而我希望它是['Android Studio']。如何避免这些情况?

3)如果作业描述说'前端开发'那么我永远找不到匹配(尽管我在.txt中列出了前端开发者) 。此外,如果该技术的名称如C,那么我总能找到它(任何带有c字母的单词都会匹配)。如何解决这些问题?

提前致谢!

1 个答案:

答案 0 :(得分:1)

搜索某事时,有两种方法可以加快速度:

  1. 不要关心准确性。只需从文本中提取一些单词即可进行搜索。但是,您可能会错过这个词。我不认为这就是你想要的。
  2. 首先订购您的文字。只需提取所有单词并按字母顺序排序。您可以根据第一个字母将单词放入bin中,而不是搜索所有bin。由于您的术语实际上有超过1个单词,因此还要保存文本中每个单词的索引。使用索引,您可以返回文本,查看下一个单词是否也是您的条款的一部分。
  3. 上述预处理似乎需要花费很多时间,但如果您的职位描述有点长,则会加快搜索速度。

    避免重复使用

    1. 提取所有学期。
    2. 按照他们的长度订购您的条款。
    3. 查看条款并检查它们是否是较长期的子字符串。如果是这样,请将其删除。
    4. 要处理 C ,请按照我上面的说法提取每个单词并进行严格比较,而不是检查子字符串。

      检测拼写不同的字词,您可以:

      1. 扩展您的字词列表。
      2. 应用单词归一化技术,您可以在其中测量两个单词之间的距离,如果该距离高于阈值,则考虑匹配。单词距离可以是Levenshtein,Jaro-Winkeler ......